hatched
hatched

Reputation: 865

iOS: Can I detect the user located country?

Can I detect whether a user moved to another country? (Not using Locale.current) The location detection should be running in background.

I'm hoping to do something like this.

Eg. A user from US leaves the country to UK. Then, when the user reach UK, i am able to detect it at the background and send notification.

Upvotes: 0

Views: 750

Answers (2)

user28434'mstep
user28434'mstep

Reputation: 6600

You can create UNNotificationRequest with exit UNLocationNotificationTrigger.

UNNotificationRequest

A UNNotificationRequest object is used to schedule a local notification and manages the content for a delivered notification. A notification request object contains a UNNotificationContent object with the contents of the notification. It also contains the UNNotificationTrigger object that specifies the conditions that trigger the delivery of the notification. For a delivered notification, you use these objects to fetch information about the notification.

UNLocationNotificationTrigger

A UNLocationNotificationTrigger object causes the delivery of a notification when the device enters or leaves a specified geographic region. Use this object to specify the region information needed to trigger the notification. Location triggers can fire once or they can fire multiple times.

Apps must request access to location services and must have when-in-use permissions to use this class. To request permission to use location services, call the requestWhenInUseAuthorization() method of CLLocationManager before scheduling any location-based triggers.

Flow

Each time user opens app, check his local country and define location trigger

let region: CLRegion = <your code defining country region>
region.notifyOnEntry = false
region.notifyOnExit = true
let trigger = UNLocationNotificationTrigger(region: region, repeats: false)

and using that trigger reschedule notification request (UNNotificationRequest).

When trigger fires (user leaves region) — app will present local notification, and if user taps on it, app starts, and if you add handler on local notification open you can notify your server about user moving away and check his new country and do what you need to do.

Upvotes: 1

aircraft
aircraft

Reputation: 26886

You should in your Info.plist, set allowsBackgroundLocationUpdates to YES, this you can search google, and lots of answer for adapt iOS 9.

First you can use CLLocationManager to get the location:

    - (void)viewDidLoad  
{  
    [super viewDidLoad];  
    // Do any additional setup after loading the view, typically from a nib .  
    //delegate  
    self.locationManager.delegate = self;  
    //The desired location accuracy.  
    self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;  
    //Specifies the minimum update distance in meters.  

    self.locationManager.distanceFilter = kCLDistanceFilterNone;  

    self.locationManager.purpose = @"To provide functionality based on user's current location.";  

    [self.locationManager startUpdatingLocation];  
} 

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation{  
UIAlertView* av = [[UIAlertView alloc] initWithTitle:@"update" message:[NSString stringWithFormat:@"didUpdateToLocation:  newLocation: %@  old:%@",newLocation,oldLocation] delegate:nil cancelButtonTitle:@"cancel" otherButtonTitles:@"ok", nil nil];  
   [av show];  

}

Secondly, you can use CLGeocoder to get country or city.

- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation  
{  
// get city name  
CLGeocoder *geocoder = [[CLGeocoder alloc] init];   
[geocoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray *array, NSError *error)  
{  
    if (array.count > 0)  
    {  
        CLPlacemark *placemark = [array objectAtIndex:0];  
        NSString *city = placemark.locality;  
    }  
    else if (error == nil && [array count] == 0)  
    {  
        NSLog(@"No results were returned.");  
    }  
    else if (error != nil)  
    {  
        NSLog(@"An error occurred = %@", error);  
    }  
    }];  
}  

You can give a duration to get location per duration:

-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray *)locations{  
newLocation = [locations lastObject];  
double lat = newLocation.coordinate.latitude;  
double lon = newLocation.coordinate.longitude;  
NSLog(@"lat:%f,lon:%f",lat,lon);  


    if (!self.deferringUpdates) {  
        CLLocationDistance distance = 500;  
        NSTimeInterval time = 20;  
        [locationManager allowDeferredLocationUpdatesUntilTraveled:distance  
                                                       timeout:time];  
        self.deferringUpdates = YES;  
    }  
}  

Upvotes: 2

Related Questions