检测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)
}
据我们所知,你不能使用本地代码检测锁屏解锁状态。通过使用私人API,将有机会检测屏幕锁定解锁状态。如果您使用Apple的私人API,您的应用可能会被拒绝。我们建议不要使用苹果私人API。
,如果你想在*里破碎设备屏幕锁解锁事件时,可以找到下面的链接答案
有代码中的几个误区样品:
- 在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)
这适用于我,但是当我解锁iPhone时,我会收到消息“DEVICE UNLOCKED”两次。设备锁定状态比“锁定”和“解锁”更多吗? –
@NikitaSavchuk你能解决双重信息的问题,你收到两次“DEVICE UNLOCKED”? – Tomasero
@Tomasero悲伤但没有 –
达尔文通知是否在应用程序处于前台时起作用? – OhadM
此代码无法使用。 – fmashkoor
首先,你的方法displayStatusChanged假设是静态的。请检查。 – OhadM