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

iOS设备电量模式监听:通知观察者未正确触发Selector函数问题

iOS低电量模式通知观察者未触发的解决方案

1. 改用Block式通知观察者替代Selector

Selector模式偶尔会因OC-Swift桥接、方法签名匹配出现隐性故障,换用Block写法可规避这类问题:

// 定义观察者引用用于后续移除
var powerStateObservation: NSObjectProtocol?

override func viewDidLoad() {
    super.viewDidLoad()
    // 添加Block式观察者
    powerStateObservation = NotificationCenter.default.addObserver(
        forName: ProcessInfo.powerStateDidChangeNotification,
        object: nil,
        queue: .main
    ) { [weak self] _ in
        guard let self = self else { return }
        if ProcessInfo.processInfo.isLowPowerModeEnabled {
            print("Low power mode enabled")
        } else {
            print("Low power mode disabled")
        }
    }
}

// 在视图消失时移除观察者,避免内存泄漏
override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    if let observation = powerStateObservation {
        NotificationCenter.default.removeObserver(observation)
    }
}

2. 替换为现代通知名称常量

虽然NSProcessInfoPowerStateDidChange是兼容写法,但使用系统提供的现代常量更可靠:

// 替换原通知名称为:
ProcessInfo.powerStateDidChangeNotification

3. 调整观察者添加时机

将观察者添加逻辑移到viewWillAppear而非viewDidLoad,确保视图控制器处于活跃状态时才监听:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)
    NotificationCenter.default.addObserver(
        self,
        selector: #selector(handleSystemPowerStateChange(_:)),
        name: ProcessInfo.powerStateDidChangeNotification,
        object: nil
    )
}

override func viewWillDisappear(_ animated: Bool) {
    super.viewWillDisappear(animated)
    // 精准移除对应通知的观察者
    NotificationCenter.default.removeObserver(
        self,
        name: ProcessInfo.powerStateDidChangeNotification,
        object: nil
    )
}

4. 排查首次安装的缓存异常

首次安装出现的问题可能和系统缓存有关,可尝试:

  • 删除应用后重启iOS设备,再重新安装
  • 在Xcode中按下Cmd+Shift+K清理构建缓存,重新编译安装

内容的提问来源于stack exchange,提问作者Rahul N

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 13:12:53