仅当应用程序在后台请求位置后进入前台时才调用 didUpdateLocations

Posted

技术标签:

【中文标题】仅当应用程序在后台请求位置后进入前台时才调用 didUpdateLocations【英文标题】:didUpdateLocations called only when app comes to foreground after location is requested while in background 【发布时间】:2019-05-16 22:06:41 【问题描述】:

我有一个 ios 应用程序,它为远程通知启用了后台模式。贯穿始终的CLLocationManager 实例是通过requestAlwaysAuthorization 授权的。

我有一个内部逻辑,可以在收到来自 didReceiveRemoteNotification 的静默推送通知 (content-available: 1) 时触发应用程序,该通知进一步调用 CLLocationManager 对象上的 requestLocation

当应用程序处于前台时,一切正常,并且应用程序在收到静默推送后的一段时间内从 iOS 接收位置更新。

但是,在应用程序处于后台的情况下,didReceiveRemoteNotification 会被正确触发,requestLocation 会被调用。但是,在此之后的很长一段时间内,我都没有收到对 didUpdateLocations 的任何点击。之后,当应用再次回到前台时,通过回调接收位置更新。

因此,看起来该应用正在等待进入前台以触发位置更新(尽管很久以前就已请求)。

    这背后的逻辑原因是什么?或者,这是否特定于任何设备或 iOS 版本? 有什么办法可以解决这个问题?

【问题讨论】:

您应该显示您的代码,但您需要 1) 在收到位置更新之前不要调用完成处理程序,或者 2) 使用 beginBackgroundTask 延长后台运行时间,直到您获得位置更新 @Paulw11 抱歉,由于涉及敏感信息,无法按原样共享代码。这实际上是在另一个示例项目上工作,该示例项目是为测试此功能而创建的,但不适用于我们的主项目。所以我试图看看我可能错过了什么。而且,completionHandler 在收到更新之前不会被调用。 @Paulw11 而且,我已经在问题中包含了所有对方法的调用。 如果您无法共享代码,那么您将很难为您提供帮助。这就是你在 in didRecieveRemoteNotification 所做的事情,这就是问题所在。简单地告诉我们你正在调用的函数和你已经实现的委托方法是没有帮助的。 @Paulw11 抱歉延迟回复。我也理解。但是,我一直在运行一个示例应用程序来演示相同的情况是不可行的。但是,后来我确实找到了问题的根本原因。可能很快就会在下面添加它。 【参考方案1】:

请从项目的功能中启用后台模式并启用“位置更新”。启用此功能后,在后台获取更新(不是处于终止状态)的唯一配置是将'allowsBackgroundLocationUpdates'设置为true(您已经这样做了)。

有关在后台获取位置的更多信息,请关注:

https://developer.apple.com/documentation/corelocation/cllocationmanager/1620568-allowsbackgroundlocationupdates

【讨论】:

位置更新的后台模式显然也是我去验证的第一件事。但这已经启用了。

以上是关于仅当应用程序在后台请求位置后进入前台时才调用 didUpdateLocations的主要内容,如果未能解决你的问题,请参考以下文章

仅当侦听器为该提供者注册时才调用 onProviderEnabled 吗?

斯威夫特 |后台线程中的网络调用立即超时

仅在前台应用:如何避免“未声明后台位置访问”

React Native:如何检测应用程序是不是在启动时/从 AppSwitcher 关闭应用程序后进入前台?

Spring REST:仅当请求者是朋友时才显示用户的某些数据

仅当最小值小于另一表中的值时才在一个表中加入值 - 雪花