位置权限问题iOS 11和iOS 10

时间:2017-09-25 05:52:55

标签: ios swift ios11 core-location ios-permissions

我在使用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()函数时,没有调用委托方法,就好像它从未接收过该调用,并且没有向用户显示警告对话框。

3 个答案:

答案 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()

请参阅https://developer.apple.com/documentation/corelocation/choosing_the_authorization_level_for_location_services/request_always_authorization

  

概述要配置位置服务的始终授权,请执行此操作   以下内容:添加NSLocationWhenInUseUsageDescription键和   您的Info.plist文件的NSLocationAlwaysAndWhenInUsageDescription键。   (Xcode将这些键显示为&#34;隐私 - 使用时的位置用法   描述&#34;和&#34;隐私 - 位置始终和何时使用   描述&#34;在Info.plist编辑器中。)如果您的应用程序支持iOS 10   和更早版本,将NSLocationAlwaysUsageDescription键添加到您的   Info.plist文件。 (Xcode将此密钥显示为&#34;隐私 - 位置   始终使用说明&#34;在Info.plist编辑器中。)创建和   配置您的CLLocationManager对象。打电话给   requestWhenInUseAuthorization()最初是为了启用你应用的基本功能   位置支持。仅调用requestAlwaysAuthorization()方法   当您使用需要该级别授权的服务时。