There a few errors in your code sample:
- Using
CFString
in swift is done by a simple cast: myString as CFString
, no more CFSTR()
...
- The easiest way to get the notification callback is to have add an observer using
Unmanaged.passUnretained(self).toOpaque()
. That will give you the possibility to catch the callback in your class
In the end, the swift version is quite different from the objective-c one, here the full code in Swift 3:
func registerforDeviceLockNotification() {
//Screen lock notifications
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
Unmanaged.passUnretained(self).toOpaque(), // observer
displayStatusChangedCallback, // callback
"com.apple.springboard.lockcomplete" as CFString, // event name
nil, // object
.deliverImmediately)
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
Unmanaged.passUnretained(self).toOpaque(), // observer
displayStatusChangedCallback, // callback
"com.apple.springboard.lockstate" as CFString, // event name
nil, // object
.deliverImmediately)
}
private let displayStatusChangedCallback: CFNotificationCallback = { _, cfObserver, cfName, _, _ in
guard let lockState = cfName?.rawValue as? String else {
return
}
let catcher = Unmanaged<MyClassObserving>.fromOpaque(UnsafeRawPointer(OpaquePointer(cfObserver)!)).takeUnretainedValue()
catcher.displayStatusChanged(lockState)
}
private func displayStatusChanged(_ lockState: String) {
// the "com.apple.springboard.lockcomplete" notification will always come after the "com.apple.springboard.lockstate" notification
print("Darwin notification NAME = (lockState)")
if (lockState == "com.apple.springboard.lockcomplete") {
print("DEVICE LOCKED")
} else {
print("LOCK STATUS CHANGED")
}
}
and just in case, don't forget to remove your observer:
CFNotificationCenterRemoveObserver(CFNotificationCenterGetLocalCenter(),
Unmanaged.passUnretained(self).toOpaque(),
nil,
nil)
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…