位置权限问题iOS 11和iOS 10

位置权限问题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&

当我使用iOS11 my info.plist contains时,向用户请求位置权限时出现问题

<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:)这是可行的,但是你的权利,它肯定与文档不匹配!