我的应用程序在后台运行时使用区域监控。一旦应用程序进入后台,我就会获取它们的位置(我已经在前台)并在其周围创建一个区域并开始监视该区域。
我正在使用cocoa lumberjack进行日志记录,而在applicationDidFinishLaunchingWithOptions内部我设置了日志记录,一旦我登录“正在开始记录...”。通常情况下,我希望只有在应用程序首次打开时才能看到这一点,或者由于某种原因应用程序崩溃,我必须重新启动它并查看日志以确定原因。今天开始进行测试我在5小时的过程中发现了15个“开始记录”的实例,总是在创建区域后几分钟,这样(我删除了特定于位置的信息):
(这里我做了几个快速的位置更新,看看他们是否移动并向服务器发送请求,这需要大约1秒钟,然后创建另一个区域来监控...)
(这里我做了几个快速的位置更新,看看他们是否移动并向服务器发送请求,这需要大约1秒钟,然后创建另一个区域来监控...)
我删除了与位置更新相关的日志和我认为不相关的服务器请求...我只是想知道为什么在那些点调用了applicationDidFinishLaunching,因为我只看到它被称为当应用程序在用户强制终止后第一次启动时,手机本身重新启动,或者应用程序崩溃,而不是从后台唤醒,这是我对区域监控的期望读。这是预期的行为还是我的应用程序崩溃,然后以某种方式再次被操作系统启动?
有一点需要注意的是,我可能会开始启动后台任务来处理位置更新并发送请求,因为我确定有时候位置更新可能需要一些时间并且请求可能需要一段时间因此我需要超过我读过的~10秒才能处理didExitRegion更新,但这似乎与我看到的这种看似奇怪的行为无关。任何帮助将不胜感激。
答案 0 :(得分:1)
这是预期和正常的行为。通过设置区域监控,您无法在后台保持应用程序处于活动状态。操作系统仍将决定何时以及是否在后台睡眠或杀死您的应用。您的受监控区域会一直存在,并且您的应用会在适当的时候被唤醒。
如果您的应用被杀或入睡,您会看到被调用的app委托的application:willFinishLaunchingWithOptions:
和application:didFinishLaunchingWithOptions:
方法。您可以查看选项键,以判断您的应用是否已被位置事件唤醒。
从app委托类引用:
UIApplicationLaunchOptionsLocationKey此键的存在 表示该应用程序是为响应传入而启动的 位置事件。此键的值是包含的NSNumber对象 布尔值。您应该使用此键作为信号 创建CLLocationManager对象并启动位置服务 再次。位置数据仅传递给位置管理员 委托而不使用此密钥。
在大多数情况下,如果您的locationManager是使用此方法创建的,则不会采取任何不同的方式。根据您的使用情况,您可以在后台以不同方式处理委托调用,或者您可以在所有状态下做出相同的反应。这是你必须自己考虑的事情。