想要自己的app能夠定位成功,相對(duì)于系統(tǒng)來說要開啟兩個(gè)權(quán)限
1)開啟系統(tǒng)定位,下面代碼可以判斷系統(tǒng)的定位是否開啟
[CLLocationManager locationServicesEnabled];
2)開啟本app的允許定位權(quán)限,下面代碼可以判斷當(dāng)前的允許定位狀態(tài)
```[CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied```
在app安裝成功之后有定位需求的情況下系統(tǒng)進(jìn)行兩次詢問是否開啟app定位,有alert提示框,如果在提示框處同意開啟定位則不用跳轉(zhuǎn)設(shè)置的開啟定位。
引導(dǎo)用戶跳轉(zhuǎn)設(shè)置開啟定位界面一般以彈出alert框的形式,在跳出alert框之前判斷當(dāng)前是否開啟定位,如若開啟不彈引導(dǎo)框
[UIAlertView bk_showAlertViewWithTitle:@"打開“定位服務(wù)”來允許“你的app”確定你的位置" message:@"你的app需要使用您的位置來為你提供服務(wù)" cancelButtonTitle:@"取消" otherButtonTitles:@[@"設(shè)置"]handler:^(UIAlertView *alertView, NSInteger buttonIndex) {
if (buttonIndex == 1) {
//同意前往設(shè)置,跳到設(shè)置界面
}
} else {
//不同意前往設(shè)置
}
在app中有方法跳轉(zhuǎn)本app的設(shè)置開啟定位,下面的openURL方法在iOS2.0以上系統(tǒng)均支持
NSURL *url = [[NSURL alloc] initWithString:UIApplicationOpenSettingsURLString];
if( [[UIApplication sharedApplication] canOpenURL:url]) {
[[UIApplication sharedApplication] openURL:url];
}
還有一帶回調(diào)的方法,下面的帶成功回調(diào)的方法只有iOS10以上的系統(tǒng)才有,在iOS10.0以下會(huì)因?yàn)檎也坏椒椒ǖ膶?shí)現(xiàn)而崩潰,如果你的app要兼容10以下系統(tǒng)建議用上面的方法
[[UIApplication sharedApplication] openURL:url options:nil completionHandler:^(BOOL success) {
}];
跳到設(shè)置界面意味著跳出本app,本app進(jìn)入后臺(tái),大約跳出本app 10min后本app就會(huì)被系統(tǒng)殺死。
可以用kvo監(jiān)聽CLLocationManager authorizationStatus的狀態(tài)改變以便在跳出app的情況下知道用戶是否在設(shè)置中開啟定位。
還可以在跳出app之前對(duì)當(dāng)前的定位允許狀態(tài)進(jìn)行保存,待下次app從后臺(tái)進(jìn)入前臺(tái)時(shí)再取出當(dāng)前定位狀態(tài)進(jìn)行比較(可以通過notifacation監(jiān)控進(jìn)入后臺(tái)和進(jìn)入前臺(tái),并保存當(dāng)前[CLLocationManager authorizationStatus]的值,監(jiān)控UIApplicationDidBecomeActiveNotification和UIApplicationWillResignActiveNotification),前者狀態(tài)是NO,后者狀態(tài)是YES的情況下開始定位,startUserLocationService,并發(fā)送定位成功通知,通知各個(gè)依賴定位的頁面定位成功,刷新頁面。
'''
- (void)handleBecomeActive {
//如果進(jìn)入后臺(tái)的時(shí)候app不允許定位,進(jìn)入前臺(tái)app允許定位則進(jìn)行定位
if(!self.beforeLocationState&&[CLLocationManager authorizationStatus] != kCLAuthorizationStatusDenied&&[self locationEnable]) {
[[NSNotificationCenter defaultCenter] postNotificationName:kNotificationHasOpenLocation object:nil];
[self updateLocation];
}
}
'''
注:kNotificationHasOpenLocation用來通知各個(gè)需要定位的頁面刷新頁面
注意:1)用戶不一定是通過點(diǎn)擊引導(dǎo)定位的彈窗跳到設(shè)置去開啟定位,還可能通過按home鍵,然后自己到設(shè)置開啟本app的定位,在app從后臺(tái)進(jìn)入前臺(tái)時(shí)要判斷允許定位是否開啟,如果開啟將alert給dismiss掉。
? ? ? ? ? 2)引導(dǎo)定位的alert有兩種被dismiss的方式,一是用戶不同意引導(dǎo)定位,二是用戶同意引導(dǎo)定位并在設(shè)置中打開定位,后面有需求在不同意引導(dǎo)定位時(shí)彈出定位失敗的提示框,要對(duì)兩種情況進(jìn)行區(qū)分,用一屬性進(jìn)行記錄,前者在提示框的回調(diào)中對(duì)屬性賦值,并發(fā)送不同意定位的通知,以便各個(gè)vc彈出提示框;后者在從后臺(tái)進(jìn)入前臺(tái)時(shí)對(duì)屬性賦值。