iOS:跟踪用户位置
iOS: Track user location
我在许多应用程序中使用过定位服务,但这个新应用程序在 iOS 8.0 及更高版本上存在问题。我没有收到应用程序首次加载提示允许定位服务的通知。但是,在我的 iOS 7.1 设备上,我收到了提示。
这是我在 didFinishLaunchingWithOptions 中的 appDelegate 中的内容:
self.locationManager = [CLLocationManager new];
[self.locationManager setDelegate:self];
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
[self initializeRegionMonitoring];
initializeRegionMonitoring方法是:
-(void) initializeRegionMonitoring {
NSLog(@"initialize region monitoring");
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// radius of region being monitored
CLLocationDistance radius = 25; // 20 metre sensitivity
CLLocationCoordinate2D coordinate;
coordinate.latitude = 25.886099;
coordinate.longitude = -80.165124;
self.someRegion = [[CLCircularRegion alloc] initWithCenter:coordinate radius:radius identifier:@"Qualex"];
self.someRegion.notifyOnEntry = YES;
self.someRegion.notifyOnExit = YES;
[self.locationManager startMonitoringForRegion:self.someRegion];
// notify changes when the device has moved x meters
self.locationManager.distanceFilter = 20; // or set to 20 meters
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[self.locationManager startUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
}
我还在 info.plist 中设置了 NSLocationAlwaysUsageDescription,所以一定是我忘记了什么,对吧?感谢您的帮助!
编辑:
我同时也在注册远程通知,这以前从来不是问题,但我认为这可能是一些有用的额外信息。
此外,当应用程序终止时,然后重新运行允许定位服务的通知会弹出,但会立即消失。只是在屏幕上闪烁。我不知道为什么它会在不单击警报中的选项之一的情况下关闭。
在 iOS8 之前,您可以简单地通过实例化 CLLocationManager 对象并尝试开始位置跟踪来请求位置权限。在 iOS 8 及更高版本上,这不会出现权限提示;您必须使用 requestAlwaysAuthorization
或 requestWhenInUseAuthorization
方法手动请求授权。
也就是说,在 iOS 8 上,如果您调用这些方法中的任何一个,那么调用它的 CLLocationManager 实例将被释放,位置权限提示将自行消失。这里发生的是你正在创建一个位置管理器,请求权限(iOS 开始尝试显示权限对话框),调用 initializeRegionMonitoring
,并设置 self.locationManager
属性到一个新的位置管理器实例。这会导致您创建的第一个被 ARC 释放,因此权限提示甚至在它有机会出现之前就被取消了。
删除 initializeRegionMonitoring
方法中的 self.locationManager = [[CLLocationManager alloc] init];
行应该可以解决问题。
我在许多应用程序中使用过定位服务,但这个新应用程序在 iOS 8.0 及更高版本上存在问题。我没有收到应用程序首次加载提示允许定位服务的通知。但是,在我的 iOS 7.1 设备上,我收到了提示。
这是我在 didFinishLaunchingWithOptions 中的 appDelegate 中的内容:
self.locationManager = [CLLocationManager new];
[self.locationManager setDelegate:self];
if ([self.locationManager respondsToSelector:@selector(requestAlwaysAuthorization)]) {
[self.locationManager requestAlwaysAuthorization];
}
[self initializeRegionMonitoring];
initializeRegionMonitoring方法是:
-(void) initializeRegionMonitoring {
NSLog(@"initialize region monitoring");
self.locationManager = [[CLLocationManager alloc] init];
self.locationManager.delegate = self;
// radius of region being monitored
CLLocationDistance radius = 25; // 20 metre sensitivity
CLLocationCoordinate2D coordinate;
coordinate.latitude = 25.886099;
coordinate.longitude = -80.165124;
self.someRegion = [[CLCircularRegion alloc] initWithCenter:coordinate radius:radius identifier:@"Qualex"];
self.someRegion.notifyOnEntry = YES;
self.someRegion.notifyOnExit = YES;
[self.locationManager startMonitoringForRegion:self.someRegion];
// notify changes when the device has moved x meters
self.locationManager.distanceFilter = 20; // or set to 20 meters
self.locationManager.desiredAccuracy = kCLLocationAccuracyBest;
self.locationManager.activityType = CLActivityTypeAutomotiveNavigation;
[self.locationManager startUpdatingLocation];
[self.locationManager startMonitoringSignificantLocationChanges];
}
我还在 info.plist 中设置了 NSLocationAlwaysUsageDescription,所以一定是我忘记了什么,对吧?感谢您的帮助!
编辑:
我同时也在注册远程通知,这以前从来不是问题,但我认为这可能是一些有用的额外信息。
此外,当应用程序终止时,然后重新运行允许定位服务的通知会弹出,但会立即消失。只是在屏幕上闪烁。我不知道为什么它会在不单击警报中的选项之一的情况下关闭。
在 iOS8 之前,您可以简单地通过实例化 CLLocationManager 对象并尝试开始位置跟踪来请求位置权限。在 iOS 8 及更高版本上,这不会出现权限提示;您必须使用 requestAlwaysAuthorization
或 requestWhenInUseAuthorization
方法手动请求授权。
也就是说,在 iOS 8 上,如果您调用这些方法中的任何一个,那么调用它的 CLLocationManager 实例将被释放,位置权限提示将自行消失。这里发生的是你正在创建一个位置管理器,请求权限(iOS 开始尝试显示权限对话框),调用 initializeRegionMonitoring
,并设置 self.locationManager
属性到一个新的位置管理器实例。这会导致您创建的第一个被 ARC 释放,因此权限提示甚至在它有机会出现之前就被取消了。
删除 initializeRegionMonitoring
方法中的 self.locationManager = [[CLLocationManager alloc] init];
行应该可以解决问题。