iOS:我可以检测用户所在的国家/地区吗?

时间:2016-12-27 08:49:56

标签: ios objective-c swift

我可以检测用户是否转移到其他国家/地区吗? (不使用Locale.current) 位置检测应该在后台运行。

我希望能做到这样的事情。

EG。来自美国的用户离开该国到英国。然后,当用户到达英国时,我能够在后台检测到它并发送通知。

2 个答案:

答案 0 :(得分:2)

您应该在Info.plist中将allowsBackgroundLocationUpdates设为是,这样您就可以搜索谷歌,以及适应iOS 9的大量答案。

首先,您可以使用CLLocationManager获取位置:

    - (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];  

}

其次,您可以使用CLGeocoder来获取国家/地区或城市。

- (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);  
    }  
    }];  
}  

您可以指定持续时间以获取每个持续时间的位置:

-(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;  
    }  
}  

答案 1 :(得分:0)

您可以使用退出UNNotificationRequest创建UNLocationNotificationTrigger

UNNotificationRequest

  

UNNotificationRequest对象用于计划本地通知并管理已传递通知的内容。通知请求对象包含带有通知内容的UNNotificationContent对象。它还包含UNNotificationTrigger对象,该对象指定触发通知传递的条件。对于已发送的通知,您可以使用这些对象来获取有关通知的信息。

UNLocationNotificationTrigger

  

当设备进入或离开指定的地理区域时,UNLocationNotificationTrigger对象会导致通知的传递。使用此对象指定触发通知所需的区域信息。位置触发器可以触发一次,也可以多次触发。

     

应用必须请求访问位置服务,并且必须具有使用该权限的使用时权限。要请求使用位置服务的权限,请在调度任何基于位置的触发器之前调用CLLocationManager的requestWhenInUseAuthorization()方法。

流量

每次用户打开应用时,请检查其当地国家/地区并定义位置触发器

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

并使用该触发器重新安排通知请求(UNNotificationRequest)。

当触发器触发时(用户离开区域) - 应用程序将显示本地通知,如果用户点击它,应用程序启动,如果您在本地通知打开时添加处理程序,您可以通知服务器用户离开并检查他的新国家,并做你需要做的事。