今天在写iOS定位判断时发现iOS10彻底废掉了@"prefs:root=LOCATION_SERVICES"] 这个方法,而是重新提供了一个UIApplicationOpenSettingsURLString(ios8.0以后可用),这样定位判断相比IOS9.0 发生了一些变化,现在参考百度地图,美团这两个软件,总结一下:
@"prefs:root=LOCATION_SERVICES"] 是跳转到了 定位开关界面
UIApplicationOpenSettingsURLString 是跳转到了定位权限界面
1.判断比较详细的情况
如果你的APP要求处理比较详细的定位情况,例如你要根据不同情况执行不同逻辑,可以采用以下代码:
//判断定位是否开启
if ([CLLocationManager locationServicesEnabled])
{
// 判断用户是否允许程序获取位置权限
if ([CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedWhenInUse||[CLLocationManager authorizationStatus]==kCLAuthorizationStatusAuthorizedAlways)
{
//用户允许获取位置权限
}else
{
//用户拒绝开启用户权限
UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"打开[定位服务权限]来允许[XXX]确定您的位置" message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>开启)" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去设置", nil];
alertView.delegate=self;
alertView.tag=2;
[alertView show];
}
}
else
{
UIAlertView *alertView=[[UIAlertView alloc]initWithTitle:@"打开[定位服务]来允许[XXX]确定您的位置" message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>XXX>始终)" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"去设置", nil];
alertView.delegate=self;
alertView.tag=1;
[alertView show];
}
对应的UIAlertView代理方法:
if (alertView.tag == 1) {
if (buttonIndex == 1) {
if ([[[UIDevice currentDevice] systemVersion] floatValue] >= 10.000000) {
//跳转到定位权限页面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication]canOpenURL:url] ) {
[[UIApplication sharedApplication] openURL:url];
}
}else {
//跳转到定位开关界面
NSURL *url = [NSURL URLWithString:@"prefs:root=LOCATION_SERVICES"];
if( [[UIApplication sharedApplication]canOpenURL:url] ) {
[[UIApplication sharedApplication] openURL:url];
}
}
}
} else if (alertView.tag == 2) {
if (buttonIndex == 1) {
//跳转到定位权限页面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication]canOpenURL:url] ) {
[[UIApplication sharedApplication] openURL:url];
}
}
}
2.简单的暴力的判断情况,代码如下,我发现美团和百度地图是这样做的:
if([CLLocationManager authorizationStatus] == kCLAuthorizationStatusDenied)
{
UIAlertView *alertView = [[UIAlertView alloc]initWithTitle:@"打开[定位服务]来允许[XXX]确定您的位置" message:@"请在系统设置中开启定位服务(设置>隐私>定位服务>开启)" delegate:self cancelButtonTitle:@"取消" otherButtonTitles:@"设置" , nil];
alertView.delegate = self;
alertView.tag = 1;
[alertView show];
}
而且对应的跳转方式也很简单直接,这点参考了美团和百度地图,直接跳转到了程序定位权限设置页面:
if (alertView.tag == 1) {
if (buttonIndex == 1) {
//跳转到定位权限页面
NSURL *url = [NSURL URLWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication]canOpenURL:url] ) {
[[UIApplication sharedApplication] openURL:url];
}
}
}
3.顺便简单总结一下这个CLAuthorizationStatus 这个枚举,方便大家使用:
一、第一个枚举值:kCLAuthorizationStatusNotDetermined的意思是:定位服务授权状态是用户没有决定是否使用定位服务。
二、第二个枚举值:kCLAuthorizationStatusRestricted的意思是:定位服务授权状态是受限制的。可能是由于活动限制定位服务,用户不能改变。这个状态可能不是用户拒绝的定位服务。
三、第三个枚举值:kCLAuthorizationStatusDenied的意思是:定位服务授权状态已经被用户明确禁止,或者在设置里的定位服务中关闭。
四、第四个枚举值:kCLAuthorizationStatusAuthorizedAlways的意思是:定位服务授权状态已经被用户允许在任何状态下获取位置信息。包括监测区域、访问区域、或者在有显著的位置变化的时候。
五、第五个枚举值:kCLAuthorizationStatusAuthorizedWhenInUse的意思是:定位服务授权状态仅被允许在使用应用程序的时候。
六、第六个枚举值:kCLAuthorizationStatusAuthorized的意思是:这个枚举值已经被废弃了。他相当于kCLAuthorizationStatusAuthorizedAlways这个值。
总结
我发现,再iOS10中集成百度SDK后,如果你在第一次打开APP时,弹出定位权限提示时你选择了允许,下次你使用定位服务时定位开关是关闭的,百度地图会给你弹出提示,点击设置是可以跳转到定位开关页面,但是没有想明白怎么做的。
写篇东西不容易,喜欢就点个赞吧!