個人一個程序,之前都好用的,包括ios6,ios7,可是手機升級到iOS8後,xcode6編譯運行,就不能正常工做了,也不報錯。現象是進到設置裏隱私-定位服務下面找到這個應用,設爲老是容許,就能夠正常獲取地理信息,可是再從新編譯運行,它又會變成這個未知狀態。ios
琢磨後想起來之前重裝應用再調用定位服務時會彈出受權對話框,可是IOS8怎麼沒彈呢,因而加入調用locationManager requestAlwaysAuthorization手動申請受權,而後你能夠在didChangeAuthorizationStatus這個回調裏面監測是否能夠具備定位權限。可是有幾點要注意當你調用這個request的時候,它彈出的對話框裏面的那句詢問語,須要咱們本身指定。因此須要在info.plist裏面添加一個key: NSLocationAlwaysUsageDescription,value就是對話框上想要詢問的語句。這時候程序才能正確的彈出受權對話框,用戶選了贊成之後,定位代碼就正確的運行。xcode
_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的枚舉吧spa
typedef NS_ENUM(int, CLAuthorizationStatus) { // 用戶從未選擇過權限 kCLAuthorizationStatusNotDetermined = 0, // 沒法使用定位服務,該狀態用戶沒法改變 kCLAuthorizationStatusRestricted, // 用戶拒絕該應用使用定位服務,或是定位服務總開關處於關閉狀態 kCLAuthorizationStatusDenied, // 這個值已棄用 kCLAuthorizationStatusAuthorized // 大體是用戶容許該程序不管什麼時候均可以使用地理信息 kCLAuthorizationStatusAuthorizedAlways // 大體是用戶贊成程序在可見時使用地理位置 kCLAuthorizationStatusAuthorizedWhenInUse };
也就是[CLLocationManager authorizationStatus]返回大於等於3時纔是可使用定位服務的。code
總結一下這個問題就是在之前的IOS版本中當開始使用定位服務時會自動彈出詢問受權的對話框,而如今IOS8須要手動調用locationManager requestAlwaysAuthorization手動申請受權,來獲取定位權限。blog