在 Swift 3 中检测 iOS9 和 iOS10 上的屏幕锁定或主页按钮按下
Posted
技术标签:
【中文标题】在 Swift 3 中检测 iOS9 和 iOS10 上的屏幕锁定或主页按钮按下【英文标题】:Detect screen lock or home button press on iOS9 and iOS10 in Swift 3 【发布时间】:2016-10-06 03:48:47 【问题描述】:Rean Wen 在post 中提供的答案在 Swift 2.2 中运行良好,但现在我使用 Swift 3 升级到 XCode 8.0,它不再工作了。
我收到以下错误消息:
.../project/AppDelegate.swift:41:108: Cannot convert value of type '(@convention(c) (CFNotificationCenter?, UnsafeMutableRawPointer?, CFString?, UnsafeRawPointer?, CFDictionary?) -> Void)!' to expected argument type 'CFNotificationCallback!'
从这一行开始:
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), nil, LockNotifierCallback.notifierProc(), "com.apple.springboard.lockcomplete", nil, CFNotificationSuspensionBehavior.DeliverImmediately)
在 AppDelegate.swift 文件中。
有谁知道如何解决这个问题?由于我刚开始学习 Swift,任何帮助将不胜感激。
【问题讨论】:
【参考方案1】:这可能对你有用。
CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
nil,
(_, observer, name, _, _) in
print("received notification: \(name)")
,
"com.apple.springboard.lockcomplete" as CFString!,
nil,
.deliverImmediately)
您可以查看answer 了解更多详情。
【讨论】:
【参考方案2】:我最近在开发任务管理应用时遇到了同样的问题。我尝试使用带有 CFNotificationCallback 方法的 Darwin Notification 来解决这个问题。
第1步:在 AppDelegate 类声明下添加以下代码
class AppDelegate: UIResponder, UIApplicationDelegate
var window: UIWindow?
let displayStatusChanged: CFNotificationCallback = center, observer, name, object, info in
let str = name!.rawValue as CFString
if (str == "com.apple.springboard.lockcomplete" as CFString)
let isDisplayStatusLocked = UserDefaults.standard
isDisplayStatusLocked.set(true, forKey: "isDisplayStatusLocked")
isDisplayStatusLocked.synchronize()
//other functions
第2步:
在didFinishLaunchingWithOptions
内,添加如下代码:
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions:
[UIApplicationLaunchOptionsKey: Any]?) -> Bool
let isDisplayStatusLocked = UserDefaults.standard
isDisplayStatusLocked.set(false, forKey: "isDisplayStatusLocked")
isDisplayStatusLocked.synchronize()
// Darwin Notification
let cfstr = "com.apple.springboard.lockcomplete" as CFString
let notificationCenter = CFNotificationCenterGetDarwinNotifyCenter()
let function = displayStatusChanged
CFNotificationCenterAddObserver(notificationCenter,
nil,
function,
cfstr,
nil,
.deliverImmediately)
return true
第 3 步:
在applicationDidEnterBackground
内,添加如下代码:
func applicationDidEnterBackground(_ application: UIApplication)
let isDisplayStatusLocked = UserDefaults.standard
if let lock = isDisplayStatusLocked.value(forKey: "isDisplayStatusLocked")
// user locked screen
if(lock as! Bool)
// do anything you want here
print("Lock button pressed.")
// user pressed home button
else
// do anything you want here
print("Home button pressed.")
第4步:
在applicationWillEnterForeground
内,添加如下代码:
func applicationWillEnterForeground(_ application: UIApplication)
print("Back to foreground.")
//restore lock screen setting
let isDisplayStatusLocked = UserDefaults.standard
isDisplayStatusLocked.set(false, forKey: "isDisplayStatusLocked")
isDisplayStatusLocked.synchronize()
您可以通过演示项目在此处查看详细方法:swift-home-vs-lock-button
【讨论】:
以上是关于在 Swift 3 中检测 iOS9 和 iOS10 上的屏幕锁定或主页按钮按下的主要内容,如果未能解决你的问题,请参考以下文章