You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为什么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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.15 12:44:52