在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]

Posted

技术标签:

【中文标题】在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]【英文标题】:Best way to use background location updates in iOS (Swift) [closed] 【发布时间】:2017-08-28 05:07:46 【问题描述】:

我必须使用 Swift 3 在 ios 中制作一个应用程序,该应用程序每 3 或 5 分钟通过 API 发送用户的位置,而该应用程序是后台运行的。我不知道哪种方法是最好的方法,或者由于 Apple 严格的背景规则是否有可能。位置必须非常精确,并且应用程序需要在后台运行很长时间,可能不会消耗太多电池。 如果不可能,很高兴知道在这种情况下哪种方法是最好的。非常感谢。

【问题讨论】:

你可以获得一些关于后台任务的信息并实现位置管理器,但它是在Objective-C中的。可能对你有用。 ***.com/questions/21440190/… 【参考方案1】:

每 3 或 5 分钟通过 API 发送用户的位置,而 应用程序是后台的

没有多大意义。如果用户在同一位置站立 5 分钟会怎样?你会在你的服务器中多次输入相同的位置吗?如果您可以在用户位置更改后使用用户位置更新您的服务器,而不是在特定时间间隔更新位置,这不是更好吗??

所以使用 locationManager,设置它的委托,并在用户位置发生变化时开始通过 API 更新您的服务器,而不是定期更新。

我不知道这是最好的方法,或者甚至 可能是因为 Apple 严格的后台规则

绝对有可能。您所要做的就是在 Xcode 中选择Location Updates 功能。

现在最好的方法是什么?它是一个相对术语。这取决于您的应用将如何使用用户的位置信息。如果您不必要地开始观察用户的位置,您将不必要地耗尽用户的 iPhone 电池,因此苹果会拒绝您的应用。

苹果进程的应用如何使用位置更新能力?

它非常简单。位置更新功能伴随着成本,如果您的应用程序在后台准确地观察到用户位置更新,它将耗尽设备电池。因为这是一个代价高昂的权衡,苹果希望您仅在您的应用程序需要时才使用它。

例如:如果您正在制作地图应用程序或跟踪用户位置变化的应用程序,然后在地图或其他东西上绘图并让用户知道他的移动(如运行应用程序),那么使用位置绝对没问题更新功能,因为您正在为用户增加价值。

如果你想着令人毛骨悚然!并尝试使用位置更新只是为了让您的应用程序保持活力,并且在后台应用程序中做一些与位置更新完全无关的事情将拒绝您的应用程序。就像很少有开发者试图过分聪明并使用位置更新来保持他们的应用程序与服务器同步或定期上传/下载文件或类似与位置更新无关的东西一样,苹果将拒绝此类应用程序。

所以没有办法让人毛骨悚然?并使用位置更新来做一些与位置本身无关的有用的事情?

是的,你可以。苹果足够慷慨,允许这样做。例如:当您从一个位置移动到另一个位置时,Dropbox 会在后台上传您的图像。它所做的只是寻找用户位置变化,一旦位置变化委托触发器,创建一个带有后台会话的上传任务并开始上传文件。

怎么做?

您仍然可以使用位置管理器。你所要做的就是使用

locationManager.startMonitoringSignificantLocationChanges()

这将仅在位置发生重大变化时触发您的位置委托:)

另一方面,如果您的应用实际上利用了用户位置并使用

startLocationUpdates()

确保您不会不必要地使用位置更新。确保根据您的应用要求正确放置距离过滤器。不要贪婪,不要不必要地浪费iOS资源,苹果会很高兴,不会给你带来麻烦:)

结论:

如果您的应用实际上利用了位置信息并为用户增加了一些价值(例如地图应用/运行应用/旅行应用),那么请使用 startLocationUpdates 并正确使用距离过滤器(可选,但拥有它很好)。

如果您感到毛骨悚然,请始终使用 startMonitoringSignificantLocationChanges 否则应用程序一定会被拒绝

【讨论】:

非常感谢您的回答。事实上,我的雇主告诉我每隔 X 分钟监控一次位置,但正如你所说,这不是一个好选择。我会尽力按照你说的去做并说服他:) @luigi-piccoli :让我用简单的话总结一下。如果您的应用程序实际上利用了位置并向用户(例如地图应用程序)添加了一些价值,那么请使用 startLocationUpdates 并正确使用距离过滤器(可选,但拥有它很好)。如果您感到毛骨悚然,请始终使用 startMonitoringSignificantLocationChanges 否则应用程序一定会被拒绝。希望很清楚:)。定期监控用户位置不是一种选择,因为即使您选择后台位置更新功能,也不能保证它每分钟触发一次,如果用户将手机放在桌面上并且从不移动怎么办 这就是为什么苹果提供委托模式:) 我发现如果用户不移动,那么如果我使用locationManager就不会有更新。当 iPhone 刚放在桌子上不动时,我怎样才能获得 LocationUpdate? @user6539552 :你不能伙计 :) 位置代表仅在设备位置更改时触发。只要不触发新的位置代表,您就可以假定设备位于其最后一个位置

以上是关于在 iOS (Swift) 中使用后台位置更新的最佳方式 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

iOS 后台任务 Swift

在后台永远运行Swift 2.0应用程序以更新服务器的位置

仅有时在 iOS 后台更新位置

位置更新在后台停止 - iOS

无法在 iOS 11 上获取后台位置更新

如何在 iOS 应用程序的后台发出间歇性 HTTP POST 请求 - Swift