IOS8定位無效問題

  個人一個程序,之前都好用的,包括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

相關文章
相關標籤/搜索