我的理解是,当一个iOS应用进入后台时,应用会运行一段时间,最终会被挂起,而在后台可以继续运行任务。然后,在没有任何活动的情况下,后台的应用程序将被挂起,但仍保留在内存中,但系统会在内存不足的事件中清除它。
当应用程序暂停时,它会停止执行代码。用户可以通过从主屏幕向上滑动来终止应用程序。当应用程序被用户挂起、清除或终止时,包括视图控制器在内的所有对象都会从内存中删除,并且无法从 UIApplication 对象接收更新。一个例外是区域更新,当应用程序处于后台、挂起或终止时,appDelegate 将获取该更新,并将“激活”应用程序以处理事件。
我也了解无论应用程序的状态如何,区域对象都会保留在内存中。因此,在进入一个区域时,appDelegate 可以处理在应用程序可能处于的任何状态下进入的区域。
我正在开发一个使用区域监控的应用程序。我已经将 didEnterRegion 和 didExitRegion CLLocationManagerDelegate 函数放在了 appDelegate 中,在那里我还设置并启动了位置服务。我有一个用于 UI 报告进入/退出区域活动的 MasterViewContoller,包括一个 processRegionEvent() 函数和一个 NSObject 类 Comm,它通过在 sendHttp() 函数中发送一个 http 帖子来处理进入/退出事件。这个 Comm 对象在 MasterviewController 中被实例化,如下所示:
let comm = Comm()
并且 MasterViewController 在 appDelegate 中被引用,如下所示:
var vc = MasterViewController()
在 appDelegate 我有 didEnterRegion 和 didExitRegion 函数:
func locationManager(_ manager: CLLocationManager, didEnterRegion region: CLRegion)
{
if region is CLCircularRegion {
let identifier = region.identifier
[NOTE: code here to issue a local notification for testing - this functions regardless of the app's state]
vc.processRegionEvent(regionid: identifier)
comm.sendHttp(theid: identifier)
}
}
只要应用程序不在后台或已被终止 - 例如由用户手动或由系统在后台运行一段时间,这将按预期工作。但是一旦应用程序终止或进入后台,viewController 或 Comm 类都不会始终响应。有时他们会回应,有时没有——这就是我试图隔离和解决的问题。
看起来即使 appDelegate “激活”并响应区域事件,这并不意味着应用程序及其对象已完全加载并准备好响应事件和函数调用。
当使用区域监控时,确保相关对象(例如 viewController 和其他类)被实例化并能够在应用程序处于后台或终止时响应 appDelegate 拾取的区域更改的首选方法是什么?是否有必要将整个代码放在 appDelegate 中?