3

我之前在 iOS 14.0 中遇到了以下问题 - 我可以使用后台位置权限:

  • 注册 iBeacon 区域监控
  • 从应用切换器中终止应用
  • 点击屏幕并在控制台中查看重新启动的应用程序。
  • 应用程序正在运行但不在应用程序切换器中

使用 iOS14 重新测试,在没有精确位置的情况下,我的应用程序不再从应用程序切换器终止时被唤醒。

重新启用精确定位权限,一切正常。

我需要做什么才能使后台应用程序在没有精确位置许可的情况下为 iBeacon 区域唤醒?

或者

如何检测到缺少精确位置权限并通知用户应用程序无法按预期运行?

ios14精确权限缺失

4

1 回答 1

5

精确位置开关是 iOS 14 的新功能,不幸的是,Apple 没有详细记录用户将其关闭时发生的情况。以下是基于实验的总结:

启用/禁用精确位置:

                                      Precise Location
CoreLocation Accuracy/Function        Enabled Disabled
----------------------------------    -------- -------
kCLLocationAccuracyThreeKilometers      YES     YES
kCLLocationAccuracyReduced              YES     YES
kCLLocationAccuracyBest                 YES    DEGRADED
kCLLocationAccuracyNearestTenMeters     YES    DEGRADED
kCLLocationAccuracyHundredMeters        YES    DEGRADED
kCLLocationAccuracyKilometer            YES    DEGRADED
Beacon Monitoring                       YES      NO
Beacon Ranging                          YES      NO

                                      Precise Location
CoreBluetooth                         Enabled Disabled
----------------------------------    -------- -------
Bluetooth LE scanning                   YES       NO

                                      Precise Location
NearbyInteraction                     Enabled Disabled
----------------------------------    -------- -------
NI Ranging                              YES       NO

禁用精确位置时,CoreLocation 的纬度/经度位置更新将降级到kCLAccuracyReduced提供的更新,类似于蜂窝塔数据提供的 3km 精度。

iBeacons 的测距和监控被阻止——委托方法回调不会进行,应用程序不会在后台启动。附近的交互测距被阻止。

当您关闭精确位置时,这些效果会立即生效。您可以通过查看应用程序运行时的日志记录,然后转到设置以关闭精确位置并查看行为变化来亲自查看这一点。

不幸的是,当用户禁用精确位置时,您无法强制 iOS 为您提供信标或其他位置更新。您可以做的最好的事情是检测用户是否已完成此操作(使用如下代码),然后提示用户在设置中更改此设置,以便您的应用程序正常运行。

        if CLLocationManager.locationServicesEnabled() {
            if #available(iOS 14.0, *) {
                switch self.locationManager.accuracyAuthorization {
                    case .fullAccuracy:
                        NSLog("Precise Location allowed")
                    case .reducedAccuracy:
                        NSLog("Precise location disabled")
                    default:
                        NSLog("Precise Location not known")
                }
            }
        }
于 2020-09-25T17:29:55.140 回答