[英]CLLocationManager authorization issue iOS 8
我正在為iOS 8開發一段Swift代碼。我正在嘗試做一些涉及位置的事情,所以我在我的swift視圖控制器文件中實現了以下內容:
let locationManger:CLLocationManager = CLLocationManager()
var speedReceived:Double = 0
override func viewDidLoad() {
super.viewDidLoad()
locationManger.delegate = self
locationManger.desiredAccuracy = kCLLocationAccuracyBest
let authstate = CLLocationManager.authorizationStatus()
if(authstate == CLAuthorizationStatus.NotDetermined){
println("Not Authorised")
locationManger.requestWhenInUseAuthorization()
}
// Do any additional setup after loading the view, typically from a nib.
}
func locationManager(manager: CLLocationManager!, didUpdateLocations locations: [AnyObject]!){
var location:CLLocation = locations[locations.count - 1] as CLLocation
if(location.horizontalAccuracy > 0){
self.speedReceived = location.speed
println(self.speedReceived)
}
}
func locationManager(manager: CLLocationManager!, didFailWithError error: NSError!) {
println("Couldn't get your location")
}
但是,我似乎無法使此代碼工作。 它不會保存我對位置使用的偏好。 它甚至沒有提示我允許訪問位置。 我試過更新我的info.plist。 但它不起作用。 順便說一句,如果我總是在模擬器中的隱私設置中選擇,它會工作,如果我立即切換回應用程序。 有人可以幫忙嗎? 我確信那是問題因為我在我的控制台上沒有獲得授權。
有幫助嗎?
這是iOS 8相關問題。 您必須在.plist
文件中放置NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
鍵(值可能是將在位置警報中顯示的其他消息)。 iOS 8中需要這些鍵。
如何在Apple指南中說:
當您使用CLLocationManager類的requestAlwaysAuthorization方法請求位置服務的授權時,此密鑰是必需的。 如果此密鑰不存在且您調用requestAlwaysAuthorization方法,系統將忽略您的請求並阻止您的應用使用位置服務。
我一直在努力解決類似的問題,即使在將plLocationAlwaysUsageDescription / NSLocationWhenInUseUsageDescription鍵添加到plist之后,該問題仍然存在。
最后,我添加了“隱私 - 位置使用說明”鍵到plist(除了新鍵),瞧,它工作了! 一旦它工作,我能夠從plist中刪除“隱私 - 位置使用說明”鍵並繼續成功請求授權。
iOS 8改變了位置授權策略。 向后兼容的解決方案:
SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization");
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined &&
[self.locationManager respondsToSelector:requestSelector]) {
[self.locationManager performSelector:requestSelector withObject:NULL];
} else {
[self.locationManager startUpdatingLocation];
}
提醒:在Info.plist中設置NSLocationWhenInUseUsageDescription鍵
我有完全相同的問題。
記錄在案,這不是官方的答案。 第一個答案是正確答案。 我只是想添加一個FOSS(Objective-C)項目的鏈接來說明修復。
如上所述,我必須添加密鑰。 我的應用程序不需要在后台運行,因此我將NSLocationWhenInUseUsageDescription鍵添加到我的info.plist中。
如果您添加一個字符串作為此鍵的值(可選 - 鍵的存在足以設置該欄),那么該字符串將出現在授權彈出窗口中。
然后我在所有[CLLocationManager startUpdating]調用之前添加了以下代碼:
if ( [locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] )
{
[locationManager requestWhenInUseAuthorization];
}
respondsToSelector很重要,因為該呼叫僅在iOS 8中可用。
第一次調用此警報時,將顯示警報。 在那之后,它會落空。
請注意,我調用requestWhenInUseAuthorization
它必須匹配我在plist中放置的值。 我想你可以放兩個,但我不知道。 我不需要。
這個項目在這里 。 大部分工作(不多)都在BMLTAppDelegate.m文件中。
這是一個令人討厭的驚喜。 很多人都不知道他們的應用程序會停止在iOS 8中運行。他們會做我最初做過的事情:在模擬器中快速運行,注意掛起,然后將其歸結為beta bug。
現在,我有一個不同的問題:我的所有應用程序都已修復,但當我嘗試將應用程序上傳到App Store時,Xcode崩潰了。 我打開了RADAR。
Xcode 6有點吱吱作響。 我希望補丁能夠很快出現。
對於Swift 2,我已經用iOS版本檢查替換了respondsToSelector()檢查。 不是那么優雅,但是Xcode 7需要提供0個錯誤,0個警告
if #available(iOS 8.0, *) {
locationManager.requestWhenInUseAuthorization()
} else {
locationManager.startUpdatingLocation()
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.