2014-07-10 126 views
16

我的工作在一張銀行代碼爲iOS 8.我試圖做一些事情,涉及的位置,所以我已經實現了我迅速的視圖控制器文件中的以下內容:CLLocationManager授權問題的iOS 8

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。但它不起作用。順便說一句,如果我總是在模擬器的隱私設置中選擇,它會工作,如果我立即切換回應用程序。誰能幫忙?我確信這是問題所在,因爲我的控制檯上沒有授權。

任何幫助?

+0

你說,你已經更新了的info.plist - 你雙重檢查您的項目? 「NSLocationWhenInUseUsageDescription」需要與描述您位置使用的字符串一起呈現。簡單的拼寫錯誤會阻止您的應用提示進行位置訪問。你也應該總是調用'locationManager.requestWhenInUseAuthorization()',而不僅僅是當你的狀態是未經授權的 – Paulw11

回答

28

這是一個iOS 8相關的問題。您必須將NSLocationAlwaysUsageDescriptionNSLocationWhenInUseUsageDescription密鑰放入您的.plist文件中(值可能是一個額外的消息,將在位置警報中呈現)。這些密鑰需要在iOS的8

如何它Apple guidelines據說:當您使用CLLocationManager類的requestAlwaysAuthorization 方法來請求授權 位置服務

此鍵是必需的。如果此密鑰不存在,並且您致電 requestAlwaysAuthorization方法,則系統會忽略您的請求,並且 會阻止您的應用使用位置服務。

7

我曾與一個類似的問題,甚至添加NSLocationAlwaysUsageDescription/NSLocationWhenInUseUsageDescription鍵plist中後持續掙扎。

最後,我向plist添加了「隱私 - 位置使用描述」鍵(除了新鍵)以及瞧,它工作!一旦我能夠從plist中刪除「隱私 - 位置使用說明」鍵並繼續成功請求授權,它就工作了。

4

iOS 8更改了位置授權策略。解決方案,並且向後兼容:

SEL requestSelector = NSSelectorFromString(@"requestWhenInUseAuthorization"); 
if ([CLLocationManager authorizationStatus] == kCLAuthorizationStatusNotDetermined && 
    [self.locationManager respondsToSelector:requestSelector]) { 
    [self.locationManager performSelector:requestSelector withObject:NULL]; 
} else { 
    [self.locationManager startUpdatingLocation]; 
} 

提醒:設置NSLocationWhenInUseUsageDescription關鍵在你的Info.plist

2

我有相同的問題。

有關記錄,這不是正式答案。第一個答案是正確的。我只是想添加一個鏈接到一個說明修復的FOSS(Objective-C)項目。

如前所述,我不得不添加密鑰。我的應用程序不需要在後臺運行,所以我在我的info.plist中添加了NSLocationWhenInUseUsageDescription密鑰。

如果添加一個字符串作爲此鍵的值(可選 - 鍵的存在足以設置欄),那麼該字符串將出現在授權彈出窗口中。

我加入以下代碼之前我所有的[CLLocationManager startUpdating]電話:

if ([locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)]) 
{ 
    [locationManager requestWhenInUseAuthorization]; 
} 

的respondsToSelector是很重要的,因爲通話只適用於iOS的8

第一次,這是稱爲,顯示警報。那之後,它就會崩潰。

請注意,我所說的requestWhenInUseAuthorization

它匹配我把plist中的價值。我想你可以把這兩個,但我不知道。我不需要。

該項目爲here。大部分工作(不多)在BMLTAppDelegate.m文件中。

這是一個令人討厭的驚喜。很多人不知道他們的應用程序會停止在iOS 8中工作。他們會做同樣的事情,我最初做的:在模擬器中快速運行,記下掛起,並將其記錄爲測試版bug。

現在,我有一個不同的問題:我所有的應用程序都是固定的,但是當我嘗試將應用程序上傳到App Store時,Xcode崩潰。我有一個RADAR打開它。

Xcode 6有點吱吱聲。我希望補丁很快就會出來。

1

對於Swift 2,我用iOS版本檢查替換了respondsToSelector()檢查。不優雅,但它需要的Xcode 7給出0個錯誤,0警告

if #available(iOS 8.0, *) { 
    locationManager.requestWhenInUseAuthorization() 
} else { 
    locationManager.startUpdatingLocation() 
} 
2

因爲我不喜歡直接編輯的plist,我總是使用UI授予autorisation。

enter image description here

荷蘭文本「Toegang是nodig」和「Toegang是noodzakelijk」顯示在彈出其中使用授權訪問。您可以將它們更改爲您喜歡的任何文字。

只需添加到plist中源,

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