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

问题描述:

如何检测iPhone上的屏幕解锁事件?当用户解锁它时,我想在我的应用程序中执行一个操作。我搜索了谷歌搜索,但只找到与目标C相关的代码,将其更改为快捷但不工作。
关注此博客: http://kidtechblogs.blogspot.com/2014/07/how-to-detect-screen-lockunlock-events.html
任何帮助如何检测到它在迅速。 下面是代码改变进入迅捷..检测IOS中的屏幕解锁事件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) 
    } 
+0

达尔文通知是否在应用程序处于前台时起作用? – OhadM

+0

此代码无法使用。 – fmashkoor

+0

首先,你的方法displayStatusChanged假设是静态的。请检查。 – OhadM

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

,如果你想在*里破碎设备屏幕锁解锁事件时,可以找到下面的链接答案

Getting state for system wide notifications in iOS and OS X

Lock Unlock events iphone

Detect screen on/off from iOS service

有代码中的几个误区样品:

  • 在swift中使用CFString由简单的演员完成:myString as CFString,不再有CFSTR() ...
  • 获得通知回叫的最简单方法是添加使用Unmanaged.passUnretained(self).toOpaque()的观察者。这会给你赶上回调类

最终的可能性,迅速的版本是Objective-C的一个,在这里斯威夫特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") 
    } 
} 

,以防万一,请不要忘记删除您的观察者:

CFNotificationCenterRemoveObserver(CFNotificationCenterGetLocalCenter(), 
            Unmanaged.passUnretained(self).toOpaque(), 
            nil, 
            nil) 
+0

这适用于我,但是当我解锁iPhone时,我会收到消息“DEVICE UNLOCKED”两次。设备锁定状态比“锁定”和“解锁”更多吗? –

+0

@NikitaSavchuk你能解决双重信息的问题,你收到两次“DEVICE UNLOCKED”? – Tomasero

+0

@Tomasero悲伤但没有 –