Question

I have a simple question about iOS, GPS Location and push notification.

Is possible in iOS to send a local push notification when the device is near of a specific GPS position?

Was it helpful?

Solution

Following code for ViewController.h file

#import <UIKit/UIKit.h>
#import <CoreLocation/CoreLocation.h>

@interface ViewController : UIViewController <CLLocationManagerDelegate>{
    CLLocationManager *locationManager;
    NSString* lastNotification;
}

@end

Following code for ViewController.m file

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    lastNotification = @"";
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)viewDidAppear:(BOOL)animated{
    [super viewDidAppear:animated];
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

#pragma mark -User Actions
- (IBAction)startLocaingMe:(id)sender{
    [self startLocationReporting];
}

#pragma mark - Location Metods

- (void)startLocationReporting {
    locationManager = [[CLLocationManager alloc] init];
    locationManager.delegate = self;//or whatever class you have for managing location
    locationManager.desiredAccuracy = kCLLocationAccuracyNearestTenMeters;
    [locationManager startUpdatingLocation];
}

// Delegate method from the CLLocationManagerDelegate protocol.
- (void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations {
    // If it's a relatively recent event, turn off updates to save power
    CLLocation* location = [locations lastObject];
    NSDate* eventDate = location.timestamp;
    NSTimeInterval howRecent = [eventDate timeIntervalSinceNow];
    if (abs(howRecent) < 15.0) {
        [self showNotificationIfDistanceIs100:location];
    }
}

// this delegate method is called if an error occurs in locating your current location
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error
{
    NSLog(@"locationManager:%@ didFailWithError:%@", manager, error);
}

- (CLLocationDistance)distanceBetweenTwoPoints:(CLLocation*) location1 andSecond:(CLLocation*) location2{
    CLLocationDistance distance = [location1 distanceFromLocation:location2];
    return distance;
}

-(CLLocation*)House{
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:23.030064 longitude:72.546193];
    return loc;
}

-(CLLocation*)passportOffice{
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:23.032034 longitude:72.549999];
    return loc;
}

-(CLLocation*)ldCollageBusStand{
    CLLocation *loc = [[CLLocation alloc] initWithLatitude:23.032515 longitude:72.549307];
    return loc;
}

-(void)showNotificationIfDistanceIs100:(CLLocation*) location{
    if ([self distanceBetweenTwoPoints:location andSecond:[self House]] <= 100) {
        [self setLocalNotificaion:@"Your are 100 meter form House"];
    }else if ([self distanceBetweenTwoPoints:location andSecond:[self passportOffice]] <= 100){
        [self setLocalNotificaion:@"Your are 100 meter form Passport Office"];
    }else if ([self distanceBetweenTwoPoints:location andSecond:[self ldCollageBusStand]] <= 100){
        [self setLocalNotificaion:@"Your are 100 meter form Ld Collage Bus Stand"];
    }

}

-(void)setLocalNotificaion:(NSString*)msg{
    if ([lastNotification isEqualToString:msg] != YES) {
        lastNotification = msg;
        UILocalNotification *futureAlert;
        futureAlert = [[UILocalNotification alloc] init];
        [futureAlert setAlertBody:msg];
        futureAlert.fireDate = [NSDate dateWithTimeIntervalSinceNow:0];
        futureAlert.timeZone = [NSTimeZone defaultTimeZone];
        [[UIApplication sharedApplication] scheduleLocalNotification:futureAlert];
    }
}

@end

You can change location Long/Lati and getting the Localnotification

May this thinks lot helpful

-------EDITED---------

enter image description here

OTHER TIPS

You can implement LocationManager instance and get notified about location updates in the following method:

- (void)locationManager:(CLLocationManager *)manager
      didUpdateLocations:(NSArray *)locations {
   // CLLocation object will be the content of the array locations
}

You can post UILocalNotification based on your requirements.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top