You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

Swift 4(Mac平台)无法接收ScreenIsLocked/ScreenIsUnlocked通知求助

排查Mac Swift 4无法接收ScreenIsLocked/ScreenIsUnlocked通知的问题

我来帮你搞定这个锁屏通知收不到的问题,你遇到的情况大概率是几个常见的小失误导致的,咱们一步步来修正:

核心问题:用错了通知中心

ScreenIsLockedScreenIsUnlocked属于系统级分布式通知,不是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

火山引擎 最新活动