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