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
相关产品推荐
相关产品推荐

