我可以检测用户是否转移到其他国家/地区吗?
(不使用Locale.current
)
位置检测应该在后台运行。
我希望能做到这样的事情。
EG。来自美国的用户离开该国到英国。然后,当用户到达英国时,我能够在后台检测到它并发送通知。
答案 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对象用于计划本地通知并管理已传递通知的内容。通知请求对象包含带有通知内容的UNNotificationContent对象。它还包含UNNotificationTrigger对象,该对象指定触发通知传递的条件。对于已发送的通知,您可以使用这些对象来获取有关通知的信息。
当设备进入或离开指定的地理区域时,UNLocationNotificationTrigger对象会导致通知的传递。使用此对象指定触发通知所需的区域信息。位置触发器可以触发一次,也可以多次触发。
应用必须请求访问位置服务,并且必须具有使用该权限的使用时权限。要请求使用位置服务的权限,请在调度任何基于位置的触发器之前调用CLLocationManager的requestWhenInUseAuthorization()方法。
每次用户打开应用时,请检查其当地国家/地区并定义位置触发器
let region = <your code defining country region>
region.notifyOnEntry = false
region.notifyOnExit = true
let trigger = UNLocationNotificationTrigger(region: region, repeats: false)
并使用该触发器重新安排通知请求(UNNotificationRequest)。
当触发器触发时(用户离开区域) - 应用程序将显示本地通知,如果用户点击它,应用程序启动,如果您在本地通知打开时添加处理程序,您可以通知服务器用户离开并检查他的新国家,并做你需要做的事。