首页 文章

终止/暂停时重要更改位置API的行为?

提问于
浏览
108

这是描述startMonitoringSignificantLocationChanges应用行为的CLLocationManager文档中的部分:

如果您启动此服务并且您的应用程序随后终止,则系统会在新事件到达时自动将应用程序重新启动到后台 . 在这种情况下,传递给应用程序的选项字典:didFinishLaunchingWithOptions:应用程序委托的方法包含密钥UIApplicationLaunchOptionsLocationKey,以指示您的应用程序是由于位置事件而启动的 . 重新启动后,您仍必须配置位置管理器对象并调用此方法以继续接收位置事件 . 重新启动位置服务时,会立即将当前事件传递给您的代理 . 此外,即使在启动位置服务之前,也会使用最新的位置对象填充位置管理器对象的位置属性 .

所以我的理解是,如果你的应用程序终止(并假设你没有从applicationWillTerminate调用stopMonitoringSignificantLocationChanges),你将被UIApplicationLaunchOptionsLocationKey参数唤醒application:didFinishLaunchingWithOptions . 此时,您创建CLLocationManager,调用startMonitoringSignificantLocationChanges并对limited time进行后台位置处理 . 这一点我很好 .

前一段只谈到应用程序终止时会发生什么,它不会建议您在应用程序暂停时执行的操作 . didFinishLaunchingWithOptions的文档说:

该应用程序在后台跟踪位置更新,已被清除,现在已重新启动 . 在这种情况下,字典包含一个键,表示由于新的位置事件导致应用程序重新启动 .

建议您在终止后启动应用程序(因为位置更改)时才会收到此呼叫 .

但是Location Awareness Programming GuideSignificant Change Service的段落有如下说法:

如果您使此服务保持运行并且您的应用程序随后被暂停或终止,则该服务会在新位置数据到达时自动唤醒您的应用程序 . 在唤醒时,您的应用程序将被置于后台并给予少量时间来处理位置数据 . 由于您的应用程序位于后台,因此应该执行最少的工作并避免任何可能阻止其在分配的时间到期之前返回的任务(例如查询网络) . 如果没有,您的申请可能会被终止 .

这表明如果您的应用已被暂停,您会被位置数据唤醒,但未提及您是如何被唤醒的:

在写这篇文章的过程中,我想我可能刚刚回答了我自己的问题,但是如果有更多知识渊博的人对我的理解得到证实,那就太棒了 .

3 回答

  • 80

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

    也就是说,您的被暂停的应用已被唤醒,您的应用代表未收到任何回调,而是通过现有的CLLocationManagerDelegate收到您的位置更新 . 您可以通过检查applicationState来检测您在后台运行,并针对您从挂起状态唤醒以进行位置处理的情况进行有限的工作 .

    [UIApplication sharedApplication].applicationState == UIApplicationStateBackground
    

    我通过位置测试工具得出了这个结论,欢迎您使用download并试用 . 这是一个非常简单的应用程序,允许您通过用户界面打开重大更改和GPS更改API,并记录您收到的所有响应 .

    N.B. 上一个答案中的第六点不正确 . 冻结已挂起的应用程序在从挂起状态唤醒时会收到CLLocationManagerDelegate回调 .

  • 25

    我的理解如下(我正在编写依赖于此API的应用程序,但尚未完成此组件以便开始测试):

    • 您的应用程序是第一个运行的时间,您注册到 startMonitoringSignificantLocationChanges ,并提供回调函数 . 当您的应用程序正在运行时,它会在收到重大更改时调用该回调 .

    • 如果您的应用程序被置于后台,UIApplication将收到 applicationWillResignActive ,然后是 applicationDidEnterBackground .

    • 如果您的申请在后台暂停时被杀,您将不会收到通知;但是,如果您的应用程序在运行时被终止(前景或背景知识),您将获得 applicationWillTerminate 的片刻 . 您无法从此功能请求额外的背景时间 .

    • 尽管在后台被杀,操作系统将重新启动您的应用程序 . 如果您的应用程序仅由操作系统启动以进行更改,您将收到 application didFinishLaunchingWithOptions 的调用:

    if ([launchOptions objectForKey:UIApplicationLaunchOptionsLocationKey])
    

    将帮助您确定是否从背景位置更改返回 .

    • 如果您当前正在后台运行,并且您的应用由用户手动重新启动,您将收到 applicationWillEnterForeground ,然后是 applicationDidBecomeActive .

    • 无论发生的情况如何,当您的应用程序重新启动时(除非由于后台任务仍在后台运行并且所述任务已开始监视更改),您需要明确告诉它再次启动监控重要位置更改,因为回调是在“冷冻干燥”后不再附着 . 是的,一旦从暂停状态返回后重新附加某种位置处理程序,您只需要在didUpdateToLocation中实现代码 .

    这就是我现在正在进行的代码开发 . 正如我之前提到的,我还没准备好在设备上测试这个,所以我不知道我是否正确解释了所有内容,所以评论者请随时纠正我(尽管我已经对话题) .

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

    祝好运!

  • 1

    如果应用程序由于位置更改而从挂起状态唤起应用程序将以后台状态启动 .

    所有对象都将处于活动状态,您将在现有委托中接收位置更新 .

相关问题