Quiero detectar si el usuario ha bloqueado su pantalla (en macOS) usando Swift .
Basado en esta respuesta , he creado el siguiente código:
import Cocoa import Quartz if let dict = Quartz.CGSessionCopyCurrentDictionary() as? [String : Any] { let locked = dict["CGSSessionScreenIsLocked"] print(locked as? String ?? "") }... que parece funcionar bien si ejecuto explícitamente el código.
Pero, ¿cómo es posible observar el valor para que me notifiquen cuando el valor cambió?
Puede observar las notificaciones distribuidas. No están documentados.
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") }Con Combine (disponible en macOS 10.15+):
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)