摘要:前段時間在做地圖定位搜索的時候,遇到定位失敗和不能通過系統設置-->隱私-->定位來設置定位權限的問題,具體情況:點擊設置中的“隱私”-->定位-->點擊自己程序,iOS7反應正常,iOS8則直接崩潰的問題,下面總結一下,供大家遇到該類問題參考。
1.iOS8點擊設置-->隱私-->定位-->對應程序,設置界面閃退問題解決
(1)plist文件新加兩條變量:
a、NSLocationAlwaysUsageDescription=YES;
b、NSLocationWhenInUseUsageDescription=YES
通常情況,plist文件中有這兩個字段,但是可能的是BOOL類型,如果是則改成NSString類型。
正常情況:
導致閃退的情況:
(2)判斷手機是否爲iOS8系統,請求權限
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.distanceFilter = kCLDistanceFilterNone;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
if(IOS8){
// [locationManager requestAlwaysAuthorization];//始終
[locationManager requestWhenInUseAuthorization];//使用期間
}
[locationManager startUpdatingLocation];
(3)增加代理方法
– (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status
{
switch (status) {
case kCLAuthorizationStatusNotDetermined:
if ([locationManager respondsToSelector:@selector(requestAlwaysAuthorization)])
{
[locationManager requestWhenInUseAuthorization];
}
break;
default:
break;
}
}
2.iOS定位無效問題
iOS8之前做的app,之前正常使用,升級到iOS8之後,定位不能正常工作,程序也不報錯。具體情況:重裝英語再調用定位服務時會彈出授權對話框,但是iOS8卻沒有彈出授權窗口。
問題解決方法:調用locationManager requestAlwaysAuthorization手動申請授權,然後你可以在didChangeAuthorizationStatus這個回調裏面監測是否可以具有定位權限。但是有幾點要注意當你調用這個request的時候,它彈出的對話框裏面的那句詢問語,需要我們自己指定。所以需要在info.plist裏面添加一個key: NSLocationAlwaysUsageDescription,value就是對話框上想要詢問的語句。這時候程序才能正確的彈出授權對話框,用戶選了同意以後,定位代碼就正確的運行。
_instance.locationManager = [[CLLocationManager alloc] init];//創建位置管理器
_instance.locationManager.delegate=_instance;
_instance.locationManager.desiredAccuracy=kCLLocationAccuracyBest;
_instance.locationManager.distanceFilter=100.0f;
_instance.updating=NO;
//定位服務是否可用
BOOL enable=[CLLocationManager locationServicesEnabled];
//是否具有定位權限
int status=[CLLocationManager authorizationStatus];
if(!enable || status<3){
//請求權限
[_instance.locationManager requestWhenInUseAuthorization];
}
authorizationStatus的枚舉:
<span style="font-size:14px;">typedef NS_ENUM(int, CLAuthorizationStatus) {
// 用戶從未選擇過權限
kCLAuthorizationStatusNotDetermined = 0,
// 無法使用定位服務,該狀態用戶無法改變
kCLAuthorizationStatusRestricted,
// 用戶拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態
kCLAuthorizationStatusDenied,
// 這個值已棄用
kCLAuthorizationStatusAuthorized // 大致是用戶允許該程序無論何時都可以使用地理信息
kCLAuthorizationStatusAuthorizedAlways // 大致是用戶同意程序在可見時使用地理位置
kCLAuthorizationStatusAuthorizedWhenInUse
};</span>
總結一下這個問題就是在以前的IOS版本中當開始使用定位服務時會自動彈出詢問授權的對話框,而現在IOS8需要手動調用locationManager
requestAlwaysAuthorization手動申請授權,來獲取定位權限。3.iOS開發系列--地圖與定位
如何使用地圖和定位,現在轉載一篇文章,參考一下。轉載自:http://www.cnblogs.com/kenshincui/p/4125570.html