为什么UIApplication的applicationState发布者仅触发一次?
问题原因与解决方案
问题出在UIApplication.applicationState并不支持自动发送KVO通知——你通过publisher(for: \.applicationState)创建的KVO发布者只能获取属性的初始值,后续应用状态变化时,系统不会触发对应的KVO通知,因此发布者不会推送新的状态值。
UIKit中部分属性虽然标注了KVO兼容,但实际并未实现完整的KVO通知逻辑,applicationState就属于这类情况。要可靠监听应用状态变化,应该使用官方推荐的生命周期通知方案:
// 合并所有应用状态相关的通知,统一处理 let appStateChangeEvents = Publishers.Merge4( NotificationCenter.default.publisher(for: UIApplication.didEnterBackgroundNotification), NotificationCenter.default.publisher(for: UIApplication.willEnterForegroundNotification), NotificationCenter.default.publisher(for: UIApplication.didBecomeActiveNotification), NotificationCenter.default.publisher(for: UIApplication.willResignActiveNotification) ) appStateChangeEvents .map { _ in UIApplication.shared.applicationState } .removeDuplicates() // 过滤重复的状态值,避免无效回调 .receive(on: DispatchQueue.main) .sink(receiveValue: { state in print("state", state.rawValue) }) .store(in: &cancellables)
补充说明
- 上述代码通过
Merge4合并了四个核心的应用生命周期通知,覆盖了所有状态切换场景; removeDuplicates()可以避免同一种状态被重复推送(比如连续触发的通知可能导致状态值相同);receive(on: DispatchQueue.main)确保回调在主线程执行,符合UIKit的线程要求。
内容的提问来源于stack exchange,提问作者Tometoyou
相关产品推荐
相关产品推荐

