【问题标题】:iOS - CoreLocation and geofencing while app is closediOS - 应用程序关闭时的 CoreLocation 和地理围栏
【发布时间】:2013-06-14 23:20:22
【问题描述】:

我已经阅读了许多关于对我的 iOS 应用程序进行地理围栏的教程(即here),但没有提到 iOS 是否允许在应用程序关闭时处理任何特定于应用程序的位置数据。

例如,我知道当应用程序在后台时,这些服务仍然会持续存在(如果编码正确),但是当用户双击主页按钮并关闭应用程序时呢?位置数据还能获取吗?

【问题讨论】:

  • 是的,它仍然可以获取。只要应用程序一直在后台运行,并且程序员已经编写了代码,以便将位置更新发送到您的后端。
  • 一旦您通过双击主页按钮终止应用程序,您就很不幸。
  • 实际上,您应该重新访问文档。请看下面我的回答。 stackoverflow.com/a/17174344/662605

标签: ios objective-c core-location geofencing


【解决方案1】:

根据Apple Documentation,在Using Regions to Monitor Boundary Crossings部分:

在 iOS 中,您向位置管理器注册的区域仍然存在 在您的应用程序启动之间。 如果发生区域交叉 当您的 iOS 应用程序未运行时,系统会自动唤醒它 在后台启动(或重新启动),以便它可以处理 事件。重新启动时,您之前配置的所有区域 在任何位置的受监控区域属性中都可用 您创建的管理器对象。

所以是的,当系统的位置检测到您进入/退出(取决于您的设置)所需区域时,您的应用程序将被唤醒(或重新启动!),因此即使您的应用程序当然没有运行也是如此。您只需要在应用程序委托中正确处理它,当应用程序重新启动时,您会在选项字典中传递一个 UIApplicationLaunchOptionsLocationKey 键。有关详细信息,请参阅下面的文档链接。

请记住,-startMonitoringForRegion:desiredAccuracy: 方法在 iOS 6 中已弃用,因此不应使用它。而是使用-startMonitoringForRegion

要了解在位置事件后重新启动您的应用程序时如何处理,请参阅文档here,您将看到的信息是在讨论已弃用的方法但它仍然应该是相关的,我相信 Apple 忘记了当他们弃用旧方法时,将此信息迁移到新方法。我已经向他们提交了一个关于它的错误。

更新

Apple 在我的错误报告之后更新了 CLLocationManager 的文档。文档现在指定了应用程序在终止后启动或未启动的位置监控类型。 见Using Location Services in the Background

【讨论】:

  • 伟大的cmets!这正是我找不到的:-)(可能找错了地方)。谢谢!。
  • 如果有关应用程序委托的信息仍在 CLLocationManager 主文档页面上,那么您可能会看到它;)
  • 对于任何发现这一点的人,不幸的是在 iOS7 中它不再是真的。如果用户通过双击主页强制退出应用程序,并在多任务器中向上滑动,则无法重新启动。引用 Apple 论坛中的 pmarcos 的话,“正如我们在 6 月 WWDC 的多任务处理新功能会议上所讨论的,iOS 7 正在发生变化。当用户在 iOS 7 中终止应用程序时,操作系统不会以任何理由重新启动它.'
  • Marcin,Apple 工程师在 WWDC 上表示,因为 所有 应用程序都可以在 iOS 7 的后台启动,做一些事情,更新它们的快照并再次进入睡眠状态,它对于您明确退出以每隔一小时左右醒来的应用程序来说,这会很奇怪。为了保持一致,用户明确退出的应用程序现在永远不会像 pj4533 所说的那样在后台被唤醒。
  • iOS 7.1 应该改变这种行为。即,即使它没有在后台运行,ios 7.1 也应该重新启动您的应用程序。但我可以确认这仍然是一个问题。这不仅限于第三方应用程序。在 iOS 7.x 中,即使是“找朋友”或提醒等苹果原生应用程序也存在此问题。
【解决方案2】:

某些形式的位置更新需要应用在后台运行,而有些则不需要。如果您想要“持续”的位置更新,那么应用程序需要在后台运行。如果您只想进行重大更改(我认为它也适用于区域监控,尽管文档不是那么明确),那么如果应用程序被终止,它将重新启动:

如果您启动此服务并且您的应用程序随后被终止,如果有新事件到达,系统会自动将应用程序重新启动到后台...

(来自CLLocationManager docs

【讨论】:

    【解决方案3】:

    如果您使用区域监控功能,即使已关闭,您也可以以某种方式恢复您的应用程序,通常是通过创建本地通知,这样用户可以通过查看-applicationDidFinishLaunchingWithOptions: 中的选项字典来租用应用程序并执行特定任务

    【讨论】:

      【解决方案4】:

      即使应用已关闭,也有一些服务会重新启动应用以报告位置更新。
      以下文档很有帮助。 https://developer.apple.com/documentation/corelocation/getting_the_user_s_location/handling_location_events_in_the_background#2865362

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-14
        • 2016-12-27
        • 2013-03-30
        • 1970-01-01
        • 2014-11-24
        • 2018-05-17
        • 1970-01-01
        相关资源
        最近更新 更多