Swift 4(Mac平台)无法接收ScreenIsLocked/ScreenIsUnlocked通知求助
排查Mac Swift 4无法接收ScreenIsLocked/ScreenIsUnlocked通知的问题
我来帮你搞定这个锁屏通知收不到的问题,你遇到的情况大概率是几个常见的小失误导致的,咱们一步步来修正:
核心问题:用错了通知中心
ScreenIsLocked和ScreenIsUnlocked属于系统级分布式通知,不是App内部的本地通知,所以不能用默认的NotificationCenter.default来监听,必须用DistributedNotificationCenter——这是很多开发者踩过的坑!
修正步骤&完整代码示例
1. 替换通知中心类型
改用DistributedNotificationCenter.default()来注册观察者,这个中心专门用来接收系统或其他App广播的跨进程通知。
2. 使用正确的通知名称
系统广播的锁屏/解锁通知的完整名称是:
- 锁屏:
com.apple.screenIsLocked - 解锁:
com.apple.screenIsUnlocked
注意是小写开头的完整域名格式,别漏了前缀!
3. 完善观察者注册代码
你提供的代码片段里addObserver没有写完,这里给你补全完整的可运行代码:
import Cocoa @NSApplicationMain class AppDelegate: NSObject, NSApplicationDelegate { @objc func screenLocked() { NSLog("✅ 屏幕已锁定") } @objc func screenUnlocked() { NSLog("✅ 屏幕已解锁") } func applicationDidFinishLaunching(_ aNotification: Notification) { // 初始化分布式通知中心 let distributedCenter = DistributedNotificationCenter.default() // 注册锁屏通知监听 distributedCenter.addObserver( self, selector: #selector(screenLocked), name: NSNotification.Name("com.apple.screenIsLocked"), object: nil ) // 注册解锁通知监听 distributedCenter.addObserver( self, selector: #selector(screenUnlocked), name: NSNotification.Name("com.apple.screenIsUnlocked"), object: nil ) } func applicationWillTerminate(_ aNotification: Notification) { // 程序退出时移除观察者,避免内存泄漏 DistributedNotificationCenter.default().removeObserver(self) } }
额外注意事项
- 测试时确保是系统触发的锁屏:比如你设置的屏保后自动锁屏,或者按电源键/触控条锁屏,手动在系统偏好设置里点击“立即锁定”也能触发。
- 这些通知在App处于后台时也能正常接收,不需要额外申请权限。
内容的提问来源于stack exchange,提问作者Guy




