位置权限问题iOS 11和iOS 10
当我使用iOS11 my info.plist contains时,向用户请求位置权限时出现问题位置权限问题iOS 11和iOS 10,ios,swift,ios11,core-location,ios-permissions,Ios,Swift,Ios11,Core Location,Ios Permissions,当我使用iOS11 my info.plist contains时,向用户请求位置权限时出现问题 <key>NSLocationWhenInUseUsageDescription</key> <string>When in use permissions</string> <key>NSLocationAlwaysUsageDescription</key> <string>always permissions&
<key>NSLocationWhenInUseUsageDescription</key>
<string>When in use permissions</string>
<key>NSLocationAlwaysUsageDescription</key>
<string>always permissions</string>
<key>NSLocationAlwaysAndWhenInUsageDescription</key>
<string>Always and in usage permissions</string>
n不使用时的位置说明
使用权限时
N位置始终使用说明
总是权限
N位置始终和何时使用说明
始终和使用中权限
我有两张地图,一张给客户,另一张给员工。对于员工,我需要知道他们的位置,即使应用程序未运行或处于后台(他们可以在注销时将其关闭),并使用
locationManager.requestAlwaysAuthorization()
对于客户,我只需要在应用程序正在使用时使用位置,并使用请求权限
locationManager.RequestWhenUseAuthorization()
在iOS 11中,这仅在使用时请求权限,而从不请求始终打开权限
在iOS 10中,它具有正确的行为
我想要的行为如下:
当他们是客户(未登录)时,它只要求在使用时获得许可。如果他们登录(员工),即使在不使用时也会请求位置
如果有人能告诉我我错过了什么/做错了什么,我将不胜感激
如果我删除权限NSLocationAlwaysUsageDescription
iOS10和iOS11,则需要注意的是,它们都存在不总是请求权限的问题
再澄清一下。
我已经实现了didChangeAuthorization委托函数,当用户通过调用requestWhenInUseAuthorization()
但是,当我在location manager上调用
RequestWhenUseAuthorization()
函数时,不会调用委托方法,就像它从未接收到该调用一样,也不会向用户显示警报对话框。对于这两种情况,客户和员工,您首先需要调用locationManager.RequestWhenUseAuthorization()
然后,仅当他们是员工时,才向
locationManager.requestAlwaysAuthorization()
看
概述要为位置服务配置始终授权,请执行以下操作
以下内容:添加NSLocationWhenUsageDescription密钥和
nsLocationAlways和WhenInUsageDescription密钥添加到Info.plist文件。
(Xcode在使用时将这些键显示为“隐私-位置”
“说明”和“隐私-始终和使用时的位置”
Description”(在Info.plist编辑器中)。如果您的应用程序支持iOS 10
以及更早的版本,将NSLocationAlwaysUsageDescription密钥添加到您的
Info.plist文件。(Xcode将此密钥显示为“隐私-位置”
始终使用Info.plist编辑器中的“用法说明”)创建和
配置CLLocationManager对象。打电话给
最初请求WhenInUseAuthorization()以启用应用程序的基本
位置支持。仅调用requestAlwaysAuthorization()方法
当您使用需要该级别授权的服务时
在info.plist文件中添加以下内容:
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.requestWhenInUseAuthorization()
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.startUpdatingLocation()
locationManager.startMonitoringSignificantLocationChanges()
// Here you can check whether you have allowed the permission or not.
if CLLocationManager.locationServicesEnabled()
{
switch(CLLocationManager.authorizationStatus())
{
case .authorizedAlways, .authorizedWhenInUse:
print("Authorize.")
break
case .notDetermined:
print("Not determined.")
break
case .restricted:
print("Restricted.")
break
case .denied:
print("Denied.")
}
}
我通过创建一个只要求权限的快速独立应用程序解决了这个问题,我得到了一个错误日志,其中说明我使用的密钥是错误的 我使用了
nsLocationAlways和WhenInUsageDescription
而不是nsLocationAlways和WhenInUsageDescription
,这很奇怪,因为它声明应该使用nsLocationAlways和WhenInUsageDescription
。切换到包含正确的密钥修复了问题,现在权限在iOS 11和iOS 10中正常工作
谢谢您的帮助。您是否在真实设备中进行测试?你在locationupdate locationmanager代理方法上设置了断点吗?在两台运行iOS 10.3.3的真实设备iPhone 5和运行iOS 11的iPhone 6上进行测试。我在location manager委托函数didChangeAuthorization和didUpdateLocations中有日志。Locations正在被调用(在前台时),并且在我请求使用时权限(但不总是使用权限)时确实更改了授权。请查看此答案-当应用程序打开时,我应该更清楚地说明每个人都被视为客户,并且它调用
locationManager.requestWhenInUseAuthorization()
一旦他们登录,就会请求locationManager.requestAlwaysAuthorization()
我的理解是,只要我在某个时候发出了使用中请求,我就应该能够在以后的任何时候发出始终跟踪请求。这是正确的还是我误解了?是的,是正确的。一些愚蠢的问题-1。您是否尝试从iPhone中删除应用程序并重新安装?如果没有,请尝试清理项目,删除应用程序,然后重新安装。2.检查您的系统设置-用户可以在系统设置中禁用位置服务,无论是针对您的应用还是针对所有应用。1)我确实尝试过安装/卸载。2) 我检查了我的系统设置,在iOS11上它没有“始终”权限,不确定这是否有帮助。谢谢你的帮助。@BenAvery,我相信你可以随时给Sisse打电话,即使不先打电话。区别在于,如果您要求先使用whileise,您可以通过系统提示请求升级到AlwaySinus。但是,如果您总是先请求ASSISE,而用户不接受,则您将失去通过系统提示请求升级的任何能力。不幸的是,这不是iOS 11的问题,它需要NSLOCATIONALWAYS和USAGESCRIPTION,在快速切换情况下,您不需要中断Akhil@Cesare我的背景是C#和Java。谢谢你指出这一点。LOL:)这是可行的,但是你的权利,它肯定与文档不匹配!