想要自己的app能够定位成功,相对于系统来说要开启两个权限
1)开启系统定位,下面代码可以判断系统的定位是否开启
[CLLocationManager locationServicesEnabled];
2)开启本app的允许定位权限,下面代码可以判断当前的允许定位状态
```[CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied```
在app安装成功之后有定位需求的情况下系统进行两次询问是否开启app定位,有alert提示框,如果在提示框处同意开启定位则不用跳转设置的开启定位。
引导用户跳转设置开启定位界面一般以弹出alert框的形式,在跳出alert框之前判断当前是否开启定位,如若开启不弹引导框
[UIAlertView bk_showAlertViewWithTitle:@"打开“定位服务”来允许“你的app”确定你的位置" message:@"你的app需要使用您的位置来为你提供服务" cancelButtonTitle:@"取消" otherButtonTitles:@[@"设置"]handler:^(UIAlertView *alertView, NSInteger buttonIndex) {
if (buttonIndex == 1) {
//同意前往设置,跳到设置界面
}
} else {
//不同意前往设置
}
在app中有方法跳转本app的设置开启定位,下面的openURL方法在iOS2.0以上系统均支持
NSURL *url = [[NSURL alloc] initWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
还有一带回调的方法,下面的带成功回调的方法只有iOS10以上的系统才有,在iOS10.0以下会因为找不到方法的实现而崩溃,如果你的app要兼容10以下系统建议用上面的方法
[[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
}];
跳到设置界面意味着跳出本app,本app进入后台,大约跳出本app 10min后本app就会被系统杀死。
可以用kvo监听CLLocationManager authorizationStatus的状态改变以便在跳出app的情况下知道用户是否在设置中开启定位。
还可以在跳出app之前对当前的定位允许状态进行保存,待下次app从后台进入前台时再取出当前定位状态进行比较(可以通过notifacation监控进入后台和进入前台,并保存当前[CLLocationManager authorizationStatus]的值,监控UIApplicationDidBecomeActiveNotification和UIApplicationWillResignActiveNotification),前者状态是NO,后者状态是YES的情况下开始定位,startUserLocationService,并发送定位成功通知,通知各个依赖定位的页面定位成功,刷新页面。
'''
- (void)handleBecomeActive {
//如果进入后台的时候app不允许定位,进入前台app允许定位则进行定位
if(!self.beforeLocationState&&[CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied&&[self locationEnable]) {
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationHasOpenLocation object:nil];
[self updateLocation];
}
}
'''
注:kNotificationHasOpenLocation用来通知各个需要定位的页面刷新页面
注意:1)用户不一定是通过点击引导定位的弹窗跳到设置去开启定位,还可能通过按home键,然后自己到设置开启本app的定位,在app从后台进入前台时要判断允许定位是否开启,如果开启将alert给dismiss掉。
2)引导定位的alert有两种被dismiss的方式,一是用户不同意引导定位,二是用户同意引导定位并在设置中打开定位,后面有需求在不同意引导定位时弹出定位失败的提示框,要对两种情况进行区分,用一属性进行记录,前者在提示框的回调中对属性赋值,并发送不同意定位的通知,以便各个vc弹出提示框;后者在从后台进入前台时对属性赋值。