代码之家  ›  专栏  ›  技术社区  ›  RedBlueThing

终止/暂停时重大变更位置API的行为?

  •  109
  • RedBlueThing  · 技术社区  · 14 年前

    这是 CLLocationManager 描述应用程序行为的文档 startMonitoringSignificantLocationChanges :

    如果您启动此服务 随后申请 系统自动终止 将应用程序重新启动到 新事件到达时的背景。在 这样的情况,期权字典 传递给 应用程序:DidFinishLaunchingWith选项: 应用程序委托的方法 包含密钥 ui应用程序启动按钮位置键 以表明您的申请 由于位置事件而启动。 重新启动后,您必须 配置位置管理器对象 并调用此方法继续 接收位置事件。当你 重新启动位置服务,当前 活动已传递给您的代表 立即。另外,地点 地点经理的财产 对象被最多的 最近的位置对象甚至在您之前 启动位置服务。

    所以我的理解是如果你的应用程序终止(如果你不打电话 stopMonitoringSignificantLocationChanges applicationWillTerminate )你会被一个 UIApplicationLaunchOptionsLocationKey 参数到 application:didFinishLaunchingWithOptions . 在这一点上,你创造了 cllocation管理器 ,呼叫 开始监视重要位置更改 做你的背景定位处理 limited time . 所以我对这一点没意见。

    上一段只讨论应用程序终止时会发生什么,它不建议您在应用程序挂起时做什么。文件 didFinishLaunchingWithOptions 说:

    应用程序跟踪位置 后台更新,已清除, 现在已经重新启动了。在这 case,字典包含一个键 指示应用程序 由于新位置而重新启动 事件。

    建议您只有在您的应用程序在终止后启动(由于位置更改)时才会收到此呼叫。

    然而,关于 Significant Change Service Location Awareness Programming Guide 有以下说法:

    如果您让此服务运行并且 你的申请随后 暂停或终止服务 自动唤醒您的 新位置数据时的应用程序 到达。在起床的时候, 将应用程序置于后台 给了一点时间 处理位置数据。因为 您的应用程序在后台, 它应该做最少的工作并避免 任何任务(如查询 网络)可能会阻止 在分配的时间之前返回 到期。如果没有,您的 申请可能会被终止。

    这意味着如果你的应用被挂起,你会被位置数据唤醒,但没有提到你是如何被唤醒的:

    在写这篇文章的过程中,我想我可能只是回答了我自己的问题,但是如果有一个知识渊博的人能证实我对这一点的理解,那就太好了。

    3 回复  |  直到 7 年前
        1
  •  80
  •   Pang Ajmal PraveeN    7 年前

    自从我问这个问题以来,我做了一些测试(主要是在家庭和工作之间的火车上),并确认了暂停应用程序的行为是我在问题结束时怀疑的。

    也就是说,挂起的应用程序被唤醒,你不会收到应用程序代理的任何回调,而是通过你现有的位置更新来接收。 CLLocationManagerDelegate . 您可以通过检查 应用程序状态 ,并对从暂停状态唤醒的情况执行有限的工作以进行位置处理。

    [UIApplication sharedApplication].applicationState == UIApplicationStateBackground
    

    我得出这个结论时,带着一个位置测试工具,欢迎您使用。 download 试试看。这是一个非常简单的应用程序,它允许你通过用户界面打开重大变化和GPS变化API,并记录你得到的所有回复。

    N.B. 前一个答案中的第六点不正确。 冻干 挂起的应用程序确实接收 cllocationManagerDelegate公司 当他们从暂停状态被唤醒时进行回调。

        2
  •  25
  •   Aaron    14 年前

    我的理解如下(我正在编写一个依赖此API的应用程序,但还没有完成足够的组件来开始测试):

    1. 您的应用程序是第一次运行,注册到 开始监视重要位置更改 ,并提供回调函数。当应用程序运行时,它将在收到重大更改时调用该回调。
    2. 如果您的应用程序置于后台,uiapplication将收到 应用程序将恢复签名 紧随其后 应用程序输入背景 .
    3. 如果您的应用程序在后台挂起时被终止,您将不会收到通知;但是,如果您的应用程序在运行时被终止(据我所知,是前台还是后台),您将与 应用程序将终止 . 不能从该函数请求额外的后台时间。
    4. 尽管在后台被杀,操作系统还是会重新启动您的应用程序。如果您的应用程序只是由操作系统启动进行更改,您将接到 应用程序didFinishLaunchingWithOptions :

      if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
      

      将帮助您确定是否从后台位置更改回来。

    5. 相反,如果您当前正在后台运行,并且您的应用程序由用户手动重新启动,则您将收到 应用程序将进入前台 然后 应用程序已激活 .
    6. 不管是如何发生的,当重新启动应用程序时(除非由于后台任务而它仍在后台运行,并且所说的任务已开始监视更改),您需要明确地告诉它 开始监视重要位置更改 同样,因为回调在“冻干”之后不再附加。是的,一旦从挂起状态返回后附加了某种类型的位置处理程序,就只需要在didUpdateToLocation中实现代码。

    这就是我现在正在进行的代码开发。正如我之前提到的,我还没有准备好在一个设备上测试这个,所以我不能判断我是否正确地解释了所有的事情,所以评论者,请随时纠正我(尽管我已经做了大量的关于这个主题的阅读)。

    哦,如果运气不好,你发布了一个应用程序,我想让我做什么,我可能会哭:)

    祝你好运!

        3
  •  1
  •   Anshu    10 年前

    如果应用程序由于位置更改而从暂停状态调用,应用程序将在后台状态启动。

    所有对象都将是活动的,您将在现有委托中接收位置更新。