2011-09-28 76 views
4

當執行CLLocationManager時,是否有一個委託方法在用戶點擊「允許」或「不允許」提示時被調用該請求使用位置?目標C - CLLocationManager找出何時點擊「允許」或「不允許」

我試過這個,但是在用戶「允許」或「不允許」之後不會調用它。

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status; 

另外,是否有一個變量,會告訴我用戶選擇了什麼?

我嘗試了下面,但總是返回true。

locationManager.locationServicesEnabled 

謝謝
三通

回答

1

你必須實現didFailWithError:方法:

- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error { 

    if ([error domain] == kCLErrorDomain) { 

     // We handle CoreLocation-related errors here 
     switch ([error code]) { 
     // "Don't Allow" on two successive app launches is the same as saying "never allow". The user 
     // can reset this for all apps by going to Settings > General > Reset > Reset Location Warnings. 
     case kCLErrorDenied: 

     case kCLErrorLocationUnknown: 

     default: 
      break; 
     } 

    } else { 
    // We handle all non-CoreLocation errors here 
    } 
} 

編輯:看着CLLocationManager的參考,我發現這一點:

+ (CLAuthorizationStatus)authorizationStatus 

返回值 指示應用程序是否被授權 以使用位置服務的值。

討論給定應用程序的授權狀態由系統管理 並由多個因素決定。應用程序必須是 明確授權用戶使用位置服務,而 位置服務目前必須爲系統啓用。 當您的應用程序 首次嘗試使用位置服務時,此授權會自動進行。

+2

感謝恩德。但是當你點擊按鈕時看起來不像這個方法被調用?看起來只有在嘗試查找GPS失敗時才被調用。你也知道一個會告訴用戶是否允許或不允許的成員變量嗎? – teepusink

+0

我編輯了我的答案,看一看 – ender

+0

從iOS 8開始,請注意這句話不再爲真:「當您的應用程序首次嘗試使用位置服務時,此授權會自動發生。」您需要在調用CLLocationManager上的startUpdatingLocation()之前明確調用requestWhenInUseAuthorization()。並確保您在Info.plist – squall3d

4

[CLLocationManager locationServicesEnabled]只會告訴您位置服務是否在設備上啓用。

[CLLocationManager authorizationStatus]返回您正在尋找的實際狀態。

7

有針對

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status { 
    if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusAuthorized) { 
     // user allowed 
    } 

} 
+0

中有NSLocationAlwaysUsageDescription或NSLocationWhenInUseUsageDescription項,感謝Peter。有了這個,一種方法可以添加[[NSNotificationCenter defaultCenter] postNotificationName:kLocationManagerUserDidEnableMonitoring object:nil]; [NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleLocationEnabled)name:kLocationManagerUserDidEnableMonitoring object:nil]; – dandan

0

locationManager.locationServicesEnabled的委託方法指示位置服務是否可用,但並不一定意味着他們允許你的應用程序。

使用CLLocationManager.authorizationStatus(),如果你需要找出在某個時間點的狀態,或執行,因爲iOS的8

- (void)locationManager:(CLLocationManager *)manager didChangeAuthorizationStatus:(CLAuthorizationStatus)status;

拿筆記,授權請求不會自動發生,當你的應用程序第一次嘗試使用位置服務。在您撥打CLLocationManager實例前,您需要明確致電requestWhenInUseAuthorization(),然後致電startUpdatingLocation()

並確保您擁有Info.plist中的NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription密鑰,具體取決於您所使用的授權類型。如果缺少這些信息,就沒有錯誤,沒有日誌,沒有提示,沒有任何東西會指向正確的方向:)