试图让我的应用程序使用更少的电量,它总是在后台跟踪位置,但我希望它自动暂停,这样我就可以打开区域监视并使用它来恢复精确的位置监控一旦用户四处走动一点。
我已经打开该应用程序半小时了,并且定位服务没有暂停。 我认为自从苹果在iOS 13中更改位置以来就是这种情况?我不太确定。 我能在网上找到的所有文档似乎都非常过时。
非常感谢任何建议,相关代码如下:
init() {
locationManager = CLLocationManager()
locationManager.delegate = self
locationManager.desiredAccuracy = kCLLocationAccuracyBest
locationManager.distanceFilter = 10
locationManager.activityType = .fitness
locationManager.requestAlwaysAuthorization()
locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = true
locationManager.showsBackgroundLocationIndicator = true
locationManager.startUpdatingLocation()
}
func locationManagerDidPauseLocationUpdates(_ manager: CLLocationManager) {
delegate?.paused(tracker: self)
print("MT | LOCATION SERVICES PAUSED!") <---- NEVER GETTING CALLED (been running for 40 minutes now, no location updates, still going though?)
// if not already, start region monitoring
}
func locationManager(_ manager: CLLocationManager, didUpdateLocations locations: [CLLocation]) {
// Collect data
for location in locations {
print("MT | New Location: (location)")
}
}
我不会依赖连接到Xcode。Xcode通常是贪婪的。它不希望您停止调试。因此,它永远不会将应用置于挂起状态。
locationManagerDidPauseLocationUpdates
的回调与 Xcode 阻止的应用被挂起有些相同。
我测试它的方法是使用os.log
.然后将输出记录到 Mac 的控制台应用程序。
只需确保该应用程序不是从您从Xcode运行启动的。我宁愿断开您的设备与Xcode的连接,杀死该应用程序。断开您的设备与 Xcode 的连接。然后只需再次点击应用程序图标。这样 Xcode 就无法干预。
该问题是由您想要的准确性引起的。
您将准确性设置为最佳,这将使您的应用程序连续运行,因此它永远不会在任何iOS版本中暂停。
此外,在实际测试中,无论是否暂停,都将精度更改为kCLLocationAccuracyHundredMeters
.它肯定会暂停。您可以根据需要更改过滤器精度以进行下一次更新。
您是否认为您的活动类型阻止了位置服务暂停?
活动类型
位置管理器使用此属性中的信息作为提示来确定何时可以自动暂停位置更新。暂停更新使系统有机会在用户位置不太可能更改的情况下节省电源。
。健康
仅当用户在一段时间内未移动很长的距离时,此活动才可能导致位置更新暂停。
我不知道您的特定用例是什么,但是,您是否考虑过使用以下功能进行后台位置跟踪?
开始监视显著位置更改((
您也可以尝试两者的混合,为日常使用打开重要的位置更改,并在执行跟踪运行等操作时允许 BackgroundLocation。
我认为从文档中可以清楚地看出,暂停功能不是那样工作的。首先,不能保证GPS硬件会暂停,这取决于活动类型以及系统中的其他活动。由iOS决定何时以及是否暂停位置更新,该属性只是一个提示。
更重要的是,您的用例将不起作用,因为如果它被暂停,用户将不得不手动与您的应用程序交互才能恢复更新。
Apple 特别提到了您的案例,并建议降低位置更新的准确性,以便仅使用手机信号塔三角测量而不是 GPS(请参阅上面的文档(。
因此,与其使用pausesLocationUpdatesAutomatically = true
,您可以执行desiredAccuracy = kCLLocationAccuracyThreeKilometers
。
引用苹果的话,
[...] 请考虑禁用此属性,并将位置精度更改为
kCLLocationAccuracyThreeKilometers
应用移动到后台时。这样做可以让您继续以电源友好的方式接收位置更新
这不涵盖您的用例吗?