在 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 上的屏幕锁定或主页按钮按下的主要内容,如果未能解决你的问题,请参考以下文章

iOS9中,swift判断相机,相册权限,选取图片为头像

在iOS9 swift中的字典类型中添加数组作为键和值

企业(内部)Swift 应用程序在 iOS9 上启动时退出

swift 2 解析facebookSDK ios9

swift3下通讯录的开发

如何在 Swift 3 中打开 WIFI 设置