尽管启用了后台位置更新,但CLLocationManager委托在应用程序暂停后仍未接收位置更新

时间:2017-01-15 23:42:43

标签: swift background location cllocationmanager

我正在尝试在我的应用程序暂停时收到位置更新 - 根据我读过的文档,这不应该是一个问题,我正在执行所有必需的步骤,但是一旦应用程序被暂停,位置似乎没有发生更新。

我见过类似的帖子,其中包含使用startMonitoringSignificantLocationChanges的解决方案,但根据我对文档的理解,我不需要在startUpdatingLocation之上实现它。

根据文档,如果启用了后台位置更新,系统将被暂停,但会在有新位置数据时被唤醒。

由于文档声明“在暂停的应用程序的情况下,系统唤醒应用程序,将更新传递给位置管理员的代理”我希望我可以处理位置更新,如同如果应用程序位于前台或后台。

我在Capabilities选项卡和info.plist中选择了位置更新,UIBackgroundModes键包含值数组中的位置。

我错过了什么?

作为参考,这就是我声明我的CLLocationManager的方式。

lazy var locationManager: CLLocationManager = {
    let locationManager = CLLocationManager()
    locationManager.desiredAccuracy = kCLLocationAccuracyBest
    locationManager.delegate = self
    locationManager.activityType = .fitness
    locationManager.requestAlwaysAuthorization()
    locationManager.requestWhenInUseAuthorization()
    locationManager.allowsBackgroundLocationUpdates = true
    locationManager.pausesLocationUpdatesAutomatically = true
    return locationManager
}()

https://developer.apple.com/library/content/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/BackgroundExecution/BackgroundExecution.html#//apple_ref/doc/uid/TP40007072-CH4-SW1

“您可以在Xcode项目的”功能“选项卡的”后台模式“部分启用位置支持。(您还可以通过在应用的Info.plist文件中包含UIBackgroundModes键和位置值来启用此支持。)启用此模式不会阻止系统暂停应用程序,但它确实告诉系统,只要有新的位置数据要提供,它就应该唤醒应用程序。因此,此键有效地让应用程序在后台运行以处理位置每当它们发生时都会更新。“

https://developer.apple.com/library/content/documentation/UserExperience/Conceptual/LocationAwarenessPG/CoreLocation/CoreLocation.html#//apple_ref/doc/uid/TP40009497-CH2-SW1

“当应用程序处于前台,正在后台运行或被暂停时,系统会向后台位置应用程序提供位置更新。如果是暂停的应用程序,系统会唤醒应用程序,提供对位置管理员委托的更新,然后尽快将应用程序恢复到暂停状态。“

1 个答案:

答案 0 :(得分:2)

我遇到了同样的问题,阻止应用程序暂停的唯一方法是设置

locationManager.pausesLocationUpdatesAutomatically = false

pausesLocationUpdatesAutomatically设置为true时,系统会将应用置于暂停状态,并且不再接收位置更改,直到用户手动将应用再次置于前台。