应用终止时如何执行异步任务更新或结束Live Activity?
解决应用终止时更新/结束Live Activity的问题
核心问题原因
applicationWillTerminate(_)是同步执行的系统回调,你在里面创建的Task属于异步调度,系统不会等待异步任务完成就会终止应用进程,导致代码无法执行。而Live Activity中的定时器会受系统节能策略限制,后台或应用终止后大概率不会触发,所以靠定时器监听Group UserDefaults的方案不可靠。
可行解决方案:申请后台任务延长执行时间
通过申请后台任务,让系统给应用额外的时间来完成异步操作,具体代码修改如下:
首先在AppDelegate中定义一个后台任务标识符变量:
var terminateBackgroundTask: UIBackgroundTaskIdentifier = .invalid
然后修改applicationWillTerminate(_)方法:
func applicationWillTerminate(_ application: UIApplication) { // 申请后台任务,获取额外执行时间 terminateBackgroundTask = application.beginBackgroundTask(withName: "TerminateLiveActivityUpdate") { [weak self] in // 超时回调:如果异步任务没完成,主动结束后台任务 guard let self = self else { return } application.endBackgroundTask(self.terminateBackgroundTask) self.terminateBackgroundTask = .invalid } Task { [weak self] in defer { // 异步任务执行完成后,结束后台任务 guard let self = self else { return } application.endBackgroundTask(self.terminateBackgroundTask) self.terminateBackgroundTask = .invalid } if #available(iOS 16.2, *) { await LiveActivityManager.cancelAllRunningActivies() } } }
补充说明
- 系统给后台任务的执行时间有限(通常约30秒),但足够完成Live Activity的取消/更新操作。
applicationWillTerminate(_)仅在用户主动终止应用时触发,如果应用是被系统因内存不足等原因强制杀掉,这个回调不会执行,此时无法通过这种方式更新Live Activity,只能依赖Live Activity自身的过期策略或其他后台刷新机制。
内容的提问来源于stack exchange,提问作者zgjie
相关产品推荐
相关产品推荐

