【iOS】地圖定位無效及點擊設置隱私定位直接閃退問題


摘要前段時間在做地圖定位搜索的時候,遇到定位失敗和不能通過系統設置-->隱私-->定位來設置定位權限的問題,具體情況:點擊設置中的“隱私”-->定位-->點擊自己程序,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

發佈了14 篇原創文章 · 獲贊 5 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章