苹果开发,iOS开发,MacOS开发,Android开发,Windows开发

ios从app跳转到设置开启定位

2017-09-08  本文已影响0人  李易_64c1

想要自己的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弹出提示框;后者在从后台进入前台时对属性赋值。

上一篇下一篇

猜你喜欢

热点阅读