Swift:如何在macOS中观察屏幕是否被锁定

Swift:如何在macOS中观察屏幕是否被锁定,swift,macos,cocoa,quartz,Swift,Macos,Cocoa,Quartz,我想检测用户是否使用Swift锁定了屏幕(在macOS中) 基于此,我创建了以下代码: import Cocoa import Quartz if let dict = Quartz.CGSessionCopyCurrentDictionary() as? [String : Any] { let locked = dict["CGSSessionScreenIsLocked"] print(locked as? String ?? "") } …如果我显式运行代码,这似乎可

我想检测用户是否使用
Swift
锁定了屏幕(在macOS中)

基于此,我创建了以下代码:

import Cocoa
import Quartz

if let dict = Quartz.CGSessionCopyCurrentDictionary() as? [String : Any] {
    let locked = dict["CGSSessionScreenIsLocked"]
    print(locked as? String ?? "")
}
…如果我显式运行代码,这似乎可以正常工作


但是,如何才能观察到值,以便在值发生更改时收到通知?

您可以观察分布式通知。它们没有记录在案

let dnc = DistributedNotificationCenter.default()

lockObserver = dnc.addObserver(forName: .init("com.apple.screenIsLocked"),
                               object: nil, queue: .main) { _ in
    NSLog("Screen Locked")
}

unlockObserver = dnc.addObserver(forName: .init("com.apple.screenIsUnlocked"),
                                 object: nil, queue: .main) { _ in
    NSLog("Screen Unlocked")
}
使用联合收割机(在macOS 10.15+上提供):

导入联合收割机
var bag=Set()
设dnc=DistributedNotificationCenter.default()
publisher(用于:Notification.Name(rawValue:“com.apple.screenIsLocked”))
.sink{打印中(“屏幕锁定”}
.存储(在:&袋中)
publisher(用于:Notification.Name(rawValue:“com.apple.screenissunlocked”))
.sink{打印中(“屏幕解锁”}
.存储(在:&袋中)

请相应地更改问题标题。你说得对@Desdenova,我已经更改了。
import Combine

var bag = Set<AnyCancellable>()

let dnc = DistributedNotificationCenter.default()

dnc.publisher(for: Notification.Name(rawValue: "com.apple.screenIsLocked"))
    .sink { _ in print("Screen Locked" }
    .store(in: &bag)

dnc.publisher(for: Notification.Name(rawValue: "com.apple.screenIsUnlocked"))
    .sink { _ in print("Screen Unlocked" }
    .store(in: &bag)