簡體   English   中英

CLLocationManager授權問題iOS 8

[英]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文件中放置NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription鍵(值可能是將在位置警報中顯示的其他消息)。 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有點吱吱作響。 我希望補丁能夠很快出現。

由於我不喜歡直接編輯plist,我總是通過使用UI來授予autorisation。

在此輸入圖像描述

荷蘭文本“Toegang is nodig”和“Toegang is noodzakelijk”顯示在PopUp中,其中使用的授權訪問。 您可以將這些更改為您喜歡的任何文本。

只需添加到plist源,

<key>NSLocationAlwaysUsageDescription</key>
<string>To get location</string>
<key>NSLocationWhenInUseUsageDescription</key>
<string>To get location</string>

對於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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM