我的应用在背景时使用区域监视。应用程序进入背景后,我将其位置(我已经在前景中已经存在),并在其周围创建一个区域并开始监视该区域。
我正在使用可可伐木工人进行记录,并且在ApplicationDidfinishlaunchingwithoptions中,我设置了日志记录,并且一旦我登录"开始记录..."。通常,我希望只有在应用程序首次打开时才会看到它,或者出于某种原因崩溃,我必须重新启动它并查看日志以确定原因。今天进行测试,我注意到5个小时的时间里,我的文件中有15个实例,在我创建一个区域后的几分钟内总是(我删除了位置特定的信息):
>- 7:17 pm:创建区域:区域:[xxx,-xxx] radius:200
- 7:25 pm:开始记录....
(在这里,我进行了几个快速的位置更新,以查看它们是否移动并将请求发送到服务器,该请求大约需要1秒钟,然后创建另一个区域进行监视...)
- 7:25 PM:创建区域:区域:[xxx,-xxx]半径:200
- 7:44 pm:开始记录....
(在这里,我进行了几个快速的位置更新,以查看它们是否移动并将请求发送到服务器,该请求大约需要1秒钟,然后创建另一个区域进行监视...)
- 7:44 pm:创建区域:区域:[42.77846,-71.42591]半径:100
- 8:04 pm:开始记录....
我删除了与位置更新相关的删除之间的日志和我认为与之相关的服务器请求...我只是想知道为什么在这些点上调用了heck ApplicationDidfinishLaunching,因为我只看到它当该应用程序被用户强行终止后第一次启动时,手机本身已重新启动或崩溃,而不是从背景中唤醒,这是我期望从区域监视的情况下,读。这是预期的行为还是我的应用程序崩溃了,然后以某种方式由OS启动?
要注意的一件事是,我可能会朝着启动背景任务处理位置更新并发送请求,因为我确定位置更新可能需要一些时间,并且请求可能需要一段时间同样,我需要的是我读过的〜10秒,您可以处理Didexitregion更新,但这似乎与我看到的这种看似奇怪的行为无关。任何帮助将不胜感激。
这是预期的和正常行为。通过设置区域监视,您不会在后台保持应用程序的活力。操作系统仍将决定何时以及是否在后台睡觉或杀死您的应用程序。您的受监视区域持续存在,您的应用程序适当时会唤醒。
如果您的应用程序被杀死或入睡,则会看到该应用程序委托的application:willFinishLaunchingWithOptions:
和application:didFinishLaunchingWithOptions:
。您可以检查选项键,以确定您的应用程序是否已通过位置活动唤醒。
来自应用程序委托类参考:
uiapplicationlaunchoptionslocationkekekeke 表示该应用是根据传入启动的 位置活动。该密钥的值是一个包含的nsnumber对象 布尔值。您应该将此键的存在作为信号 创建一个CllocationManager对象并启动位置服务 再次。位置数据仅交付给位置管理器 委托而不是使用此键。
在大多数情况下,如果您的位置管理器是在此方法中创建的,则您不会做任何不同的事情。根据您的用例,您可以在背景中以不同的方式处理代表呼叫,否则您在所有州都可以做出同样的反应。这是您必须考虑的事情。