我在许多应用中使用了位置服务,但这个新应用在iOS 8.0及更高版本上存在问题。我没有收到应用程序首次加载提示允许位置服务的通知。但是,在我的iOS 7.1设备上,我收到提示。
以下是我在appDelegate的didFinishLaunchingWithOptions中所拥有的内容:
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,所以必须有一些我已经忘记的东西,对吧?谢谢你的帮助!
修改
我还同时注册了远程通知,之前从未出现过问题,但我认为这可能是一些有用的额外信息。
此外,当应用程序终止时,重新运行通知以允许弹出位置服务,但会立即消失。只是在屏幕上闪烁。我不知道为什么不点击警报上的其中一个选项就会解雇。
答案 0 :(得分:2)
在iOS 8之前,您只需通过实例化CLLocationManager对象并尝试启动位置跟踪来请求位置权限。在iOS 8及更高版本中,这不会显示权限提示;您必须使用requestAlwaysAuthorization
或requestWhenInUseAuthorization
方法手动申请授权。
话虽如此,在iOS 8上,如果您调用其中任何一种方法,那么释放您调用它的CLLocationManager实例,位置权限提示将自行解除。这里发生的是您正在创建位置管理器,请求权限(iOS开始尝试呈现权限对话框),调用initializeRegionMonitoring
,并将self.locationManager
属性设置为新的位置管理器实例。这会导致您创建的第一个被ARC释放,因此在有机会出现之前,权限提示会被取消。
删除self.locationManager = [[CLLocationManager alloc] init];
方法中的行initializeRegionMonitoring
应该可以解决问题。