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

fma*_*oor 6 ios swift

如何在iPhone上检测屏幕解锁事件?当用户解锁时,我想在我的应用中执行操作.我搜索谷歌搜索但只找到与目标C相关的代码,将其更改为快速但不起作用.
关注此博客:http: //kidtechblogs.blogspot.com/2014/07/how-to-detect-screen-lockunlock-events.html.
任何帮助如何在swift中检测到它.下面是代码更改为swift ..

func displayStatusChanged(center: CFNotificationCenter, observer: Void, name: CFString, object: Void, userInfo: CFDictionaryRef) {
        // the "com.apple.springboard.lockcomplete" notification will always come after the "com.apple.springboard.lockstate" notification
        let lockState = (name as String)
        print("Darwin notification NAME = \(name)")
        if (lockState == "com.apple.springboard.lockcomplete") {
            print("DEVICE LOCKED")
        }
        else {
            print("LOCK STATUS CHANGED")
        }
    }

func registerforDeviceLockNotification() {
        //Screen lock notifications
        CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),     //center
                nil,     // observer
                displayStatusChanged,     // callback
                CFSTR("com.apple.springboard.lockcomplete"),     // event name
                nil,     // object
                .deliverImmediately)
        CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),     //center
                nil,     // observer
                displayStatusChanged,     // callback
                CFSTR("com.apple.springboard.lockstate"),     // event name
                nil,     // object
                .deliverImmediately)
    }
Run Code Online (Sandbox Code Playgroud)

tba*_*nes 9

代码示例中有一些错误:

  • CFString在swift中使用是通过一个简单的演员来完成的:myString as CFString不再CFSTR()......
  • 获取通知回调的最简单方法是使用添加观察者Unmanaged.passUnretained(self).toOpaque().这将使您有可能在课堂上收听回调

最后,swift版本与objective-c完全不同,这里是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")
    }
}
Run Code Online (Sandbox Code Playgroud)

为了以防万一,别忘了删除你的观察者:

CFNotificationCenterRemoveObserver(CFNotificationCenterGetLocalCenter(),
                                   Unmanaged.passUnretained(self).toOpaque(),
                                   nil,
                                   nil)
Run Code Online (Sandbox Code Playgroud)

  • 让catcher = Unmanaged &lt;MyClassObserving&gt; .fromOpaque(UnsafeRawPointer(OpaquePointer(cfObserver)!))。takeUnretainedValue()我在此行中遇到MyClassObserving错误。你能告诉我这是什么吗? (2认同)

Pat*_*k R 2

据我们所知,您无法使用本机代码检测屏幕锁定解锁状态。通过使用私有 api,将有机会检测屏幕锁定解锁状态。如果您使用苹果的私有API,您的应用程序可能会被拒绝。我们建议不要使用苹果私有api。

如果您想在越狱设备中进行屏幕锁定解锁事件,您可以从以下链接找到答案

获取 iOS 和 OS X 中系统范围通知的状态

锁定解锁事件 iPhone

从 iOS 服务检测屏幕开/关