禁用allowBackgroundLocationUpdates(CLLocationManager)在启用后不起作用

时间:2017-01-17 18:21:20

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

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

allowsBackgroundLocationUpdates = true

最初我想在后台使用LowPowerMode通知时 NSProcessInfoPowerStateDidChange更改作出反应。并且无需调用allowsBackgroundLocationUpdates即可停用stopUpdatingLocation 以停止更新位置

但是,我在收到通知并设置

后发现了
allowsBackgroundLocationUpdates = false
后台应用程序中的

正在继续工作。

所以我进一步确定了,禁用 allowsBackgroundLocationUpdates甚至在前景中在最初设置为true之后就没有了工作。应用程序继续在后台工作。

Apple关于此事的文件

  

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

从CLLocationManager类,allowsBackgroundLocationUpdates属性

的描述
  

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

GitHub上的

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

所以问题是,财产的故意行为是什么?

3 个答案:

答案 0 :(得分:1)

  

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

我认为财产讨论可以解决您的问题。

答案 1 :(得分:0)

尽管它可能具有误导性的名称,但看起来requestWhenInUseAuthorization()会给你你想要的行为(比如@ zhongwuzw said)。

来自文档:

  

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

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

答案 2 :(得分:0)

我发现我必须停止并重新启动位置更新,以使allowBackgroundLocationUpdates在以前设置为true时将其设置为false

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

然后它将生效。.