如何判断iOS即将终止ReplayKit Broadcast Extension应用扩展
关于Broadcast Extension终止通知的问题
iOS 应用扩展的生命周期独立于主应用,由系统单独调度,不会触发主应用级别的UIApplicationWillTerminateNotification通知,你测试到的监听无响应是正常现象。
系统在锁屏、内存不足、扩展内存占用超过50MB上限、后台资源回收等场景下会直接终止扩展进程,不会给扩展提前发送任何终止类回调,只有两种明确场景会触发扩展自带的回调,你可以把清理逻辑放在对应位置:
- 用户主动从控制中心停止屏幕广播,会触发
RPBroadcastSampleHandler的broadcastFinished回调 - 广播因明确的配置错误、权限问题运行失败时,会触发
broadcastFailedWithError:回调
如果你的业务对数据完整性要求较高,建议不要把关键状态只存在扩展的内存中,可通过 App Group 共享容器增量存储运行数据,避免扩展被异常杀掉后数据丢失、业务异常。
主应用感知扩展终止的可行方案
常用的实现方案有三种,可根据业务复杂度选择:
- 共享心跳检测:通过 App Group 共享 UserDefaults,扩展每隔1~2秒写入当前的时间戳,主应用开启定时器定时读取该时间戳,若时间戳超过3秒未更新,即可判定扩展已终止,该方案实现成本最低,兼容性最好。
- Darwin 通知监听:通过
CFNotificationCenterGetDarwinNotifyCenter注册跨进程通知,扩展在正常运行时定时发送心跳通知,或在能触发终止回调时主动发送终止通知,主应用监听对应通知即可判断扩展状态,注意该方案在扩展被系统强制杀掉时无法主动发送通知,需搭配心跳机制使用。 - 跨进程长连接检测:主应用与扩展通过
NSXPCConnection建立长连接,一旦连接断开触发失效回调,即可判定扩展已终止,该方案判定精度最高,但实现复杂度相对较高。
内容的提问来源于stack exchange,提问作者user2891462
相关产品推荐
相关产品推荐

