应用程序在后台运行一段时间后,位置跟踪会停止

oca*_*nal 23 core-location cllocationmanager ios swift

我创建了一个简单的应用程序,它可以跟踪用户位置,并在每次更新位置时创建本地通知.

我启用了下面的背景模式,

在此输入图像描述

let locationManager = CLLocationManager()

open override func viewDidLoad() {
       locationManager.delegate = self;
       locationManager.desiredAccuracy = kCLLocationAccuracyBest;
       locationManager.distanceFilter = 10
       locationManager.allowsBackgroundLocationUpdates = true
       locationManager.startUpdatingLocation()
}

open func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
       let notification = UILocalNotification()
       notification.alertBody = "location updated"
       notification.fireDate = Date()
       UIApplication.shared.scheduleLocalNotification(notification)
}
Run Code Online (Sandbox Code Playgroud)

我设置字符串NSLocationAlwaysUsageDescription并请求许可.用户授予第一次加载应用时始终使用的权限.


当应用程序处于前台时它运行良好,当背景仍然工作至少在5-40分钟的时间范围内,可以通过电池或其他打开的应用程序进行更改.

问题是为什么它停止工作,它不会继续工作?

我从未在Apple文档中看到时间限制.

Vim*_*din 24

当应用移动到后台时切换到重要的位置更新.如果应用程序无限期地在后台保持活动状态,iOS将卸载该应用程序.

locationManager.pausesLocationUpdatesAutomatically = false
Run Code Online (Sandbox Code Playgroud)

  • @ocanal FYI没有这个,它将在大约17分钟(没有其他人在他们的问题中提到过这个。我已经验证过)之后停止。您的5-40是移动的结果,其他的则保持约17分钟。如果将“ pausesLocationUpdatesAutomatically”设置为false,可能会耗尽电池电量。**仅供参考,仅当应用在前景中时位置暂停时才能恢复**,否则您将无法在后台恢复它。在这方面的文档非常差。 (2认同)
  • @ocanal我建议设置一个计时器,例如,在经过100分钟的运动5分钟后,将精度降低到OneKilometer / ThreeKilometer。在降低准确性之前,请保存上一个位置...然后使用另一个计时器:每5/10分钟一次**立即将准确性升级到您喜欢的位置,然后将该位置与保存的位置进行比较。如果移动不太多(例如100米),则保持降级,否则会提高准确性。(时间和仪表会根据您的业务需求而有所不同。您可能会或可能不想长时间降低精度) (2认同)

Adr*_*ski 7

降低精度

设置desiredAccuracy位置管理器对象的属性

self.locationManager.desiredAccuracy = kCLLocationAccuracyBestForNavigation
Run Code Online (Sandbox Code Playgroud)

您可以使用CLLocationAccuracy常量之一

重要

默认情况下,iOS设备上的标准位置更新以最佳准确性级别运行。更改这些设置以符合您的应用程序的要求。否则,您的应用程序将不必要地浪费能量。


自动暂停

pausesLocationUpdatesAutomatically位置管理器对象的属性设置为true

self.locationManager.pausesLocationUpdatesAutomatically = true
Run Code Online (Sandbox Code Playgroud)

重要

对于具有使用中授权的应用,暂停位置更新会终止对位置更改的访问,直到再次启动该应用并能够重新启动这些更新。如果您不希望位置更新完全停止,请考虑禁用此属性并将位置精度更改为 kCLLocationAccuracyThreeKilometers 应用程序移至后台。这样做可以使您继续以省电的方式接收位置更新。


允许后台更新

allowsBackgroundLocationUpdates位置管理器对象的属性设置为true

self.locationManager.allowsBackgroundLocationUpdates = true
Run Code Online (Sandbox Code Playgroud)

希望在挂起时接收位置更新的应用程序必须在其应用程序的Info.plist文件中包含UIBackgroundModes键(具有位置值),并将此属性的值设置为true。进行后台更新时,需要使用带有位置值的UIBackgroundModes键


指定活动类型

设置activityType属性以让Core Location知道您的应用在给定时间执行的位置活动类型

self.locationManager.activityType = .automotiveNavigation 
Run Code Online (Sandbox Code Playgroud)

您可以使用其中一种CLActivityType情况


推迟位置更新

在具有GPS硬件的受支持设备上,您可以让位置管理器在您的应用程序在后台运行时推迟位置更新的交付。例如,跟踪用户在远足径上位置的健身应用可以将更新推迟到用户移动一定距离或经过一定时间后再进行。