CoreLocation - 使用authorizedWhenInUse 授权在后台持续更新位置

Posted

技术标签:

【中文标题】CoreLocation - 使用authorizedWhenInUse 授权在后台持续更新位置【英文标题】:CoreLocation - Continuous location update in background with authorizedWhenInUse authorization 【发布时间】:2020-06-01 11:21:53 【问题描述】:

我需要在后台跟踪用户位置,例如 waze 和苹果地图中的导航功能。

但是,我想在 authorizedWhenInUse 权限下使用它。

据我了解,即使具有 authorizedWhenInUse 权限,应用程序也可以跟踪用户位置,因为在这种状态下,应用程序被视为 foreground(蓝线出现在状态顶部bar - 表示用户知道应用程序在做定位工作)

当我授予 authorizedAlways 权限时,一切正常。

但是,当权限为authorizedWhenInUse,并且我将应用程序发送到后台时,出现蓝线,但应用程序在大约一分钟后被终止,并且日志中出现以下消息: 来自调试器的消息:由于信号 9 而终止

这是我在进入后台之前跟踪位置更新的方法:

locationManager.allowsBackgroundLocationUpdates = true
locationManager.pausesLocationUpdatesAutomatically = false
locationManager.delegate = self
locationManager.startUpdatingLocation()

我的 plist 包含后台模式:

<key>UIBackgroundModes</key>
<array>
    <string>location</string>
</array>

【问题讨论】:

【参考方案1】:

这可能与核心位置无关。信号 9 表示您因使用过多内存或类似情况而被杀死。您可能需要在进入后台之前释放资源。或者,您可能正试图在后台做一些您没有告诉我们的事情。

【讨论】:

"如果用户授予 authorizedAlways 权限,一切正常。" 您知道信号 9 并不总是意味着内存问题。它可以在其他一些情况下收到。但是,检查使用您的资源是个好主意。活动的 UI 更新可能会导致应用程序终止。使用仪器 - 这是个好主意。此外,请检查您是否为位置更新设置了过滤器,并且不处理每个位置更新。 @dor506 是的,这就是为什么我说“或类似”和“你可能正在尝试做其他事情”。 确实如此。我注意到在将应用程序发送到后台后,由于某些视图动画中的错误,cpu 使用率增加到 120% (!!)。就目前而言(在修复问题并且 cpu 为 0% 后),应用程序在后台“生存”并获得了 authorizedWhenInUse 授权。【参考方案2】:

尝试将showsBackgroundLocationIndicator属性设置为true

https://developer.apple.com/documentation/corelocation/choosing_the_location_services_authorization_to_request 说:

位置服务适用于具有以下功能的应用 CLAuthorizationStatus.authorizedWhenInUse 仅在应用程序处于“in 采用”。在所有支持使用时授权的平台上,应用 被认为在使用中:

当应用在前台运行时。

在应用程序离开前台后的几秒钟内,短暂的宽限期 您的应用程序完成用户当前位置任务的时间 启动。

当应用显示后台位置使用指示器时 (显示BackgroundLocationIndicator)。在 ios 上,指示灯为蓝色 屏幕顶部的条形或药丸;在 watchOS 上,它是一个小图标。

阅读整篇文章会很好:)

如果您不想在顶部看到蓝条,请使用authorizedAlways auth 类型。

【讨论】:

这是关于崩溃,而不是蓝条。

以上是关于CoreLocation - 使用authorizedWhenInUse 授权在后台持续更新位置的主要内容,如果未能解决你的问题,请参考以下文章

无法通过 Corelocation 找到位置

在 MapKit / CoreLocation 中计算两个纬度/经度之间的距离

如何使用 CoreLocation 获取多个 iBeacon?

使用 CoreLocation 获取最近的位置

CoreLocation 负值

CoreLocation 不能与 Estimotes Beacon 一起使用