且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

在IOS Swift中检测屏幕解锁事件

更新时间:2021-09-23 22:20:59

代码示例中有一些错误:

There a few errors in your code sample:


  • 在swift中使用 CFString 是通过一个简单的演员来完成的: myString as CFString ,不再 CFSTR() ...

  • 最简单的方法获取通知回调是使用 Unmanaged.passUnretained(self).toOpaque()添加观察者。这将使你有可能在你的班级中捕捉回调

  • 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

最后,swift版本与目标完全不同 - c one,这里是Swift 3中的完整代码:

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)