CLLocationManager授权问题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。 但它不工作。 顺便说一句,如果我总是select在模拟器的隐私设置,它的作品,如果我切换回应用程序立即。 谁能帮忙? 我相信这是问题,因为我的控制台上没有授权。
任何帮助?
这是一个iOS 8相关的问题。 您必须将NSLocationAlwaysUsageDescription
或NSLocationWhenInUseUsageDescription
键放在.plist
文件中(值可能是一个额外的消息,将显示在位置警报中)。 这些密钥在iOS 8中是必需的。
苹果指导方针如何说明:
当您使用CLLocationManager类的requestAlwaysAuthorization方法请求位置服务的授权时,此项是必需的。 如果此键不存在,并且您调用requestAlwaysAuthorization方法,系统将忽略您的请求并阻止您的应用程序使用位置服务。
我曾经遇到类似的问题,即使在向plist添加NSLocationAlwaysUsageDescription / NSLocationWhenInUseUsageDescription键之后,这个问题仍然存在。
最后,我添加了“隐私 – 位置使用说明”键(除了新键),瞧,它的工作! 一旦我能够从plist中删除“隐私 – 位置使用描述”键并继续成功请求授权,它就工作了。
iOS 8已经改变了位置授权策略。 向后兼容的解决scheme:
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项
我有完全相同的问题。
为了logging,这不是正式的答案。 第一个答案是正确的。 我只是想添加一个链接到FOSS(Objective-C)项目来说明修复。
如上所述,我必须添encryption钥。 我的应用程序不需要在后台运行,所以我添加了NSLocationWhenInUseUsageDescription键到我的info.plist。
如果添加一个string作为该键的值(可选 – 键的存在足以设置该栏),那么该string将出现在授权popup窗口中。
然后,在我所有的[CLLocationManager startUpdating]调用之前添加了以下代码:
if ( [locationManager respondsToSelector:@selector(requestWhenInUseAuthorization)] ) { [locationManager requestWhenInUseAuthorization]; }
respondsToSelector很重要,因为这个调用只能在iOS 8中使用。
第一次调用时,会显示警报。 之后,它就经过了。
请注意,我调用requestWhenInUseAuthorization
它必须匹配我放在plist的价值。 我想你可以把两个,但我不知道。 我不需要。
该项目在这里 。 大部分工作(不是很多)在BMLTAppDelegate.m文件中。
这是一个令人讨厌的惊喜。 很多人不知道他们的应用程序将停止在iOS 8中工作。他们会做同样的事情,我最初做的:在模拟器中快速运行,注意挂起,并把它粉笔testing版的bug。
现在,我有一个不同的问题:我所有的应用程序都是固定的,但是当我尝试将应用程序上传到App Store时,Xcode崩溃。 我有一个雷达打开它。
Xcode 6有点吱吱声。 我希望补丁很快就会出来。
由于我不喜欢直接编辑plist,我总是通过使用UI来授予自动化。
荷兰语文本“Toegang是nodig”和“Toegang是noodzakelijk”显示在使用授权访问的PopUp中。 您可以将其更改为您喜欢的任何文字。
只需添加到plist源,
<key>NSLocationAlwaysUsageDescription</key> <string>To get location</string> <key>NSLocationWhenInUseUsageDescription</key> <string>To get location</string>
对于Swift 2,我用iOS版本检查replace了respondsToSelector()检查。 没有优雅,但它需要Xcode 7给0错误,0警告
if #available(iOS 8.0, *) { locationManager.requestWhenInUseAuthorization() } else { locationManager.startUpdatingLocation() }