CLLocationManager授权问题iOS 8

时间:2014-07-10 06:38:31

标签: ios swift core-location cllocationmanager

我正在为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。但它不起作用。顺便说一句,如果我总是在模拟器中的隐私设置中选择,它会工作,如果我立即切换回应用程序。有人可以帮忙吗?我确信那是问题因为我在我的控制台上没有获得授权。

任何帮助?

6 个答案:

答案 0 :(得分:28)

这是iOS 8相关问题。您必须在NSLocationAlwaysUsageDescription文件中添加NSLocationWhenInUseUsageDescription.plist个键(值可能是将在位置警报中显示的其他消息)。这些密钥在iOS 8中是必需的。

如何在Apple guidelines中说:

  

使用requestAlwaysAuthorization时需要此密钥   CLLocationManager类的方法,用于请求授权   位置服务。如果这个密钥不存在而你打电话给   requestAlwaysAuthorization方法,系统忽略您的请求和   阻止您的应用使用位置服务。

答案 1 :(得分:7)

我一直在努力解决类似的问题,即使在向plist添加NSLocationAlwaysUsageDescription / NSLocationWhenInUseUsageDescription键之后,该问题仍然存在。

最后,我将“隐私 - 位置使用说明”键添加到了plist(除了新键)之外,瞧,它有效!工作完成后,我可以从plist中删除“Privacy - Location Usage Description”键并继续成功请求授权。

答案 2 :(得分: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];
}

提醒:在Info.plist中设置NSLocationWhenInUseUsageDescription键

答案 3 :(得分:2)

我有完全相同的问题。

记录中,这不是官方答案。第一个答案是正确答案。我只想添加一个指向修复的FOSS(Objective-C)项目的链接。

如上所述,我必须添加密钥。我的应用不需要在后台运行,因此我将NSLocationWhenInUseUsageDescription键添加到了我的info.plist。

如果您添加一个字符串作为此键的值(可选 - 键的存在足以设置该栏),那么该字符串将出现在授权弹出窗口中。

然后我在所有[CLLocationManager startUpdating]调用之前添加了以下代码:

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

respondsToSelector很重要,因为该呼叫仅在iOS 8中可用。

第一次调用此方法时,会显示警报。在那之后,它就会落空。

请注意,我致电requestWhenInUseAuthorization

它必须匹配我在plist中放置的值。我想你可以放两个,但我不知道。我不需要。

项目是here。大多数工作(不多)都在BMLTAppDelegate.m文件中。

这是一个令人讨厌的惊喜。很多人都不知道他们的应用程序会停止在iOS 8中运行。他们会做我最初做过的事情:在模拟器中快速运行,注意挂起,然后将其粘贴到beta bug

现在,我遇到了另一个问题:我的所有应用都已修复,但当我尝试将应用上传到App Store时,Xcode崩溃了。我打开了RADAR。

Xcode 6有点吱吱作响。我希望补丁能够很快出现。

答案 4 :(得分:2)

由于我不想直接编辑plist,我总是使用UI授予autorisation。

enter image description here

荷兰文本“Toegang is nodig”和“Toegang is noodzakelijk”显示在PopUp中,其中使用的授权访问。您可以将这些更改为您喜欢的任何文本。

只需添加到plist源,

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

答案 5 :(得分:1)

对于Swift 2,我已经用iOS版本检查替换了respondsToSelector()检查。不是那么优雅,但是Xcode 7需要提供0个错误,0个警告

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