我在使用iOS11时请求用户的位置权限时遇到问题我的info.plist包含
<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>
我有两张地图供客户使用,另一张供员工使用。对于员工,我需要知道他们的位置,即使应用程序没有运行或背景(他们可以在退出时关闭它)并使用
请求权限 locationManager.requestAlwaysAuthorization()
对于客户,我只在应用程序正在使用时需要位置并使用
请求权限 locationManager.requestWhenInUseAuthorization()
在iOS 11中,这仅在使用时请求权限,而不是永远在权限。
在iOS 10中,它具有正确的行为。
我想要的行为如下: 当他们是客户(未登录)时,它只询问何时使用许可。如果他们登录(员工),即使不使用它也会请求位置。
如果有人能够了解我所遗漏/做错的事情,我们将不胜感激。
如果我删除了权限NSLocationAlwaysUsageDescription
,请注意iOS10和iOS11有同样的问题,即不总是请求权限。
更多澄清一点。
我已经实现了didChangeAuthorization委托函数,当用户允许来自警报的权限调用requestWhenInUseAuthorization()
时,它会被调用
但是,当我在位置管理器上调用requestWhenInUseAuthorization()
函数时,没有调用委托方法,就好像它从未接收过该调用,并且没有向用户显示警告对话框。
答案 0 :(得分:8)
我通过创建一个只需要权限的快速独立应用程序来解决这个问题,我收到了一个错误日志,说明我使用的密钥是错误的。
我有NSLocationAlwaysAndWhenInUsageDescription
而不是NSLocationAlwaysAndWhenInUseUsageDescription
这是奇怪的,因为docs它表示应该使用NSLocationAlwaysAndWhenInUsageDescription
。切换到包含正确的密钥修复问题,现在权限与iOS 11和10的预期一致。
感谢您的帮助。
答案 1 :(得分:4)
在info.plist文件中添加:
<key>NSLocationUsageDescription</key>
<string></string>
<key>NSLocationWhenInUseUsageDescription</key>
<string></string>
现在在swift文件中,不要忘记添加委托:CLLocationManagerDelegate
在viewDiDLoad()中,添加:
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.")
}
}
答案 2 :(得分:0)
对于这两种情况,客户和员工,首先需要致电locationManager.requestWhenInUseAuthorization()
然后,只有他们是员工,才能添加电话
locationManager.requestAlwaysAuthorization()
概述要配置位置服务的始终授权,请执行此操作 以下内容:添加NSLocationWhenInUseUsageDescription键和 您的Info.plist文件的NSLocationAlwaysAndWhenInUsageDescription键。 (Xcode将这些键显示为&#34;隐私 - 使用时的位置用法 描述&#34;和&#34;隐私 - 位置始终和何时使用 描述&#34;在Info.plist编辑器中。)如果您的应用程序支持iOS 10 和更早版本,将NSLocationAlwaysUsageDescription键添加到您的 Info.plist文件。 (Xcode将此密钥显示为&#34;隐私 - 位置 始终使用说明&#34;在Info.plist编辑器中。)创建和 配置您的CLLocationManager对象。打电话给 requestWhenInUseAuthorization()最初是为了启用你应用的基本功能 位置支持。仅调用requestAlwaysAuthorization()方法 当您使用需要该级别授权的服务时。