【问题标题】:Disabling allowsBackgroundLocationUpdates (CLLocationManager) doesn't work after is was enabled启用后禁用allowBackgroundLocationUpdates(CLLocationManager)不起作用
【发布时间】:2017-06-01 22:32:28
【问题描述】:

我的应用程序适用于持续的后台位置更新。 当然它拥有所有的权限和其他的东西,比如

allowsBackgroundLocationUpdates = true

最初,我想在后台使用NSProcessInfoPowerStateDidChange 通知 LowPowerMode 更改做出反应。并禁用allowsBackgroundLocationUpdates 停止更新位置而不调用stopUpdatingLocation

但是我收到通知并设置后发现

allowsBackgroundLocationUpdates = false

后台应用程序正在运行。

所以我更进一步发现,在最初设置为 true 之后,禁用 allowsBackgroundLocationUpdates 即使在前台 也根本不起作用。应用程序继续在后台运行。

Apple 关于此事的文档

您使用此属性来启用和禁用基于您的行为 应用的行为


来自 CLLocationManager 类,allowsBackgroundLocationUpdates 属性的描述

将 UIBackgroundModes 设置为在 Info.plist 中包含“位置”,您 每次调用时还必须在运行时将此属性设置为 YES -startUpdatingLocation 意图在后台继续。将此属性重置为 NO 相当于省略“位置” 来自 UIBackgroundModes 值。

Simple project 在 GitHub 上显示了我提到的行为。

那么问题来了,这是财产的故意行为吗?

【问题讨论】:

  • 我在 iOS 11 中也发现了这一点。奇怪的是,这似乎在模拟器中工作,但在实际设备上却没有。我必须重新启动我的应用才能使其生效,因此“切换”不起作用。

标签: ios objective-c swift core-location cllocationmanager


【解决方案1】:

我发现如果之前已设置为 true,则将 allowBackgroundLocationUpdates 设置为 false 时,我必须停止并重新启动位置更新才能生效

locationManager?.allowsBackgroundLocationUpdates = false
locationManager?.stopUpdatingLocation()
locationManager?.startUpdatingLocation()

然后就生效了..

【讨论】:

    【解决方案2】:

    尽管名称可能具有误导性,但看起来 requestWhenInUseAuthorization() 为您提供了您想要的行为(如 @zhongwuzw said)。

    来自文档:

    如果用户向您的应用授予“使用时”授权,则您的应用可以在前台启动大多数(但不是全部)定位服务。 (应用程序不能使用任何自动重新启动应用程序的服务,例如区域监控或重大位置更改服务。)在前台启动时,如果您的应用程序启用了后台,服务将继续在后台运行 Xcode 项目的 Capabilities 选项卡中的位置更新。在您的应用在后台运行时尝试启动定位服务将会失败。

    如果您需要“始终”权限(或者用户在没有您通过设置应用程序请求的情况下授予它),我发现停止并立即重新启动位置管理器会强制 allowsBackgroundLocationUpdates 生效。

    【讨论】:

      【解决方案3】:

      当此属性的值为 false 时,应用在前台或根据其当前授权运行时正常接收位置更新。更新仅在应用暂停时停止,从而阻止应用被唤醒以处理这些事件。Apple API Discussion

      我认为属性讨论可以解决你的问题。

      【讨论】:

      • 实际上,这种解释只会让事情变得更糟。在 WWDC 2015 中,CoreLocation 的新增功能,他们明确将其描述为当设置为 false developer.apple.com/videos/play/wwdc2015/714/?time=505 时停止后台更新的标志。此外,关于我的示例,如果您未将allowBackgroundLocationUpdates 设置为true,则后台更新将不起作用。如果您设置为 true,然后设置为 false,则后台更新将起作用。就是这个问题。
      • @Sander,我看了你的github sample project,你用requestAlwaysAuthorization(),我想是这个原因,你可以用requestWhenInUseAuthorization()代替,然后它会如你所愿。
      猜你喜欢
      • 2016-01-15
      • 2012-07-26
      • 2016-05-30
      • 2014-12-07
      • 1970-01-01
      • 2023-03-08
      • 1970-01-01
      • 2013-12-20
      相关资源
      最近更新 更多