当应用关闭并收到推送通知时,我想快速处理该通知并将其显示给用户,然后让应用返回关闭(或暂停)状态。相反,该应用程序将保持运行状态,甚至尝试加载根视图控制器。 我的代码注册为后台工作,完成后注销。
var backgroundTask: UIBackgroundTaskIdentifier = UIBackgroundTaskInvalid
func registerBackgroundTask() {
if backgroundTask == UIBackgroundTaskInvalid {
backgroundTask = UIApplication.shared.beginBackgroundTask { [weak self] in
self?.endBackgroundTask()
}
assert(backgroundTask != UIBackgroundTaskInvalid)
}
}
func endBackgroundTask() {
print("Background task ended.")
UIApplication.shared.endBackgroundTask(backgroundTask)
backgroundTask = UIBackgroundTaskInvalid
}
由于新的APNs推送通知,我可以使用Xcode来测试我的代码,使其在启动时附加到我的应用程序中。通知处理完成后,应用仍然有效。 我是否需要强制应用暂停? 我以为iOS会在完成处理通知后立即关闭或暂停该应用程序,因此我调用endBackgroundTask。 另外,如果我关闭Xcode从而使应用程序调试器停止运行,然后在我的设备上启动它,我会看到它正在运行并显示根视图控制器(尽管尚未完全初始化,因为该代码不适用于此类启动)。 我想念什么?
答案 0 :(得分:0)
首先,两次调用“ registerBackgroundTask”将导致“ backgroundTask”被覆盖,并且您将失去终止最新任务之外的任务的能力。
相反,应用程序保持运行状态,甚至尝试加载根视图控制器。
第二,确保您已阅读有关应用程序生命周期的信息:[1]和委托方法[2]。通常,您的应用程序将在后台运行(处于后台执行模式或处于挂起状态),但推送通知也可能会强制您的应用程序启动(以防万一它根本没有运行)。然后由您来优雅地处理它,并在不需要时不加载UI。
1-https://developer.apple.com/documentation/uikit/core_app/managing_your_app_s_life_cycle 2-https://developer.apple.com/documentation/uikit/uiapplicationdelegate