在后台向服务器发送位置更新

Posted

技术标签:

【中文标题】在后台向服务器发送位置更新【英文标题】:Send Location Updates to Server in Background 【发布时间】:2022-01-10 01:35:18 【问题描述】:

即使在应用程序终止后,保持用户位置与服务器同步的最佳方法是什么? 这是我到目前为止发现的

    使用前台服务。我已经对此进行了测试,但它很耗电池,有时当您锁定手机或关闭屏幕时它会死机。 使用工作管理器。我也测试过,它每15分钟发送一次位置,但是太不可靠了,过了一会儿就停止发送了。 地理围栏。我读到 Geofencing api 会更频繁地获取位置更新,每隔几分钟左右,但我还没有测试过。 位置监听器。有一个方法叫 onLocationChanged,但我不知道它在后台如何工作。

是否有类似广播接收器的东西,只有在位置发生一定幅度变化时才会被触发?我认为这将是一个优化的解决方案。 我正在构建一个应用程序,它使用类似于 facebook 附近朋友的功能(很久以前就停止工作)或类似火种的东西来显示附近的人。 目前我需要这个用于android,但我也需要它用于ios,我正在开发一个flutter应用程序。

【问题讨论】:

即使应用程序不在前台,您也希望不断获取用户位置的更新,这似乎是一种隐私问题……我敢打赌,较新版本的 Android 不允许您这样做那种事不管。 tinder 是如何做到这一点的?它向您显示您周围的人与您的距离 好吧,我不是 Tinder,我几乎没有使用过它,但我想说它只有在你在应用程序内部(或应用程序在前台)时才会这样做。我会做的是,而不是 100% 地窥探用户的位置,我会在他们打开您的应用程序并使用它做任何您需要的事情时查询他们的位置,并将其保存在某个地方。一旦他们关闭应用程序,如果需要,您可以使用缓存的位置信息继续做您的事情。尽管第二部分对我来说仍然听起来像是隐私问题。如果有帮助,请让我写下来作为答案,让你接受! 虽然您确实需要考虑隐私方面,但它们独立于该问题的技术方面。在 iOS 上,如果用户允许,您的应用可以通过“始终”权限获取用户位置。如果您的应用程序被用户终止,那么您将不会获得更新,因为他们杀死了您的应用程序并且 iOS 假设他们希望它停止。在 iOS 上,您最好的方法可能是使用重要的位置更改更新。这是对电池友好的,但每 500m 左右只会为您提供更新。确保您还阅读了 iOS 如何使用“临时始终”来最初仅提供前台位置 一段时间后,系统会询问用户是否还想在后台向您的应用提供他们的位置。您可能需要单独查看 Android,因为我不知道该平台如何处理位置更新 【参考方案1】:

我已经在我的应用程序中使用了类似的方法:

我使用前台服务记录位置,电池消耗与位置请求的频率有关,而不是前台服务本身。确实使用 LocationListener 是一个不错的选择

然后我会定期使用workmanager检查前台服务,并在需要时重新启动它。

最好的

【讨论】:

【参考方案2】:

正如上面 cmets 中所讨论的,我真的不认为 Android 允许您在后台获取位置更新,即使应用程序未处于活动状态。

我建议您尝试在应用启动后立即查询位置,并快速跟进您需要对其执行的任何操作。作为一种选择,您还可以通过在他们与应用交互时缓存他们的位置来跟踪位置历史记录,以防您希望尽可能保持数据库的最新状态。

这里有一些伪代码作为一个简单的例子:

class MainActivity : AppCompatActivity() 

override fun onCreate(..) 
   queryForLocation(..)?.let 
      doSomething(it)
      cacheLocation(it)
    ?: Log.d(TAG, "Location = null")


override fun onDestroy() 
   queryForLocation(..)?.let 
      cacheLocation(it)
    ?: Log.d(TAG, "Location = null")

【讨论】:

以上是关于在后台向服务器发送位置更新的主要内容,如果未能解决你的问题,请参考以下文章

在后台将用户位置更新发送到服务器的最佳方式(Android)

当应用程序处于后台并且网络连接丢失时,位置更新计时器不起作用?

如何定期向 Web 服务器发送位置数据(纬度、经度)

在后台服务中使用融合位置获取GPS更新前(15分钟)?

如何在后台模式下获取当前位置并在后台模式下继续将该位置发送到服务器

即使应用程序关闭,也每 5 分钟向服务器发送纬度和经度