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 授权在后台持续更新位置的主要内容,如果未能解决你的问题,请参考以下文章
在 MapKit / CoreLocation 中计算两个纬度/经度之间的距离