Swift2 在Swift 3中的iOS9和iOS10上检测屏幕锁定或主页按钮按下

Swift2 在Swift 3中的iOS9和iOS10上检测屏幕锁定或主页按钮按下,swift2,ios9,swift3,ios10,xcode8,Swift2,Ios9,Swift3,Ios10,Xcode8,Rean Wen在这篇文章中提供的答案在Swift 2.2中非常有效,但现在我用Swift 3升级到XCode 8.0,它不再有效了 我收到以下错误消息: .../project/AppDelegate.swift:41:108: Cannot convert value of type '(@convention(c) (CFNotificationCenter?, UnsafeMutableRawPointer?, CFString?, UnsafeRawPointer?, CFDictio

Rean Wen在这篇文章中提供的答案在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,任何帮助都将不胜感激。

这可能对您有用

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),
                                    nil,
                                    { (_, observer, name, _, _) in

                                        print("received notification: \(name)")
        },
                                    "com.apple.springboard.lockcomplete" as CFString!,
                                    nil,
                                    .deliverImmediately)

您可以查看此项了解更多详细信息。

我最近在开发任务管理应用程序时遇到了相同的问题。我尝试使用Darwin通知和CFNotificationCallback方法来解决这个问题

步骤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: 在
didfishlaunchingwithoptions
中,添加以下代码:

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
}
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.")
        }
    }
}
func applicationWillEnterForeground(_ application: UIApplication) {
    print("Back to foreground.")
    //restore lock screen setting
    let isDisplayStatusLocked = UserDefaults.standard
    isDisplayStatusLocked.set(false, forKey: "isDisplayStatusLocked")
    isDisplayStatusLocked.synchronize()  
}
步骤3: 在
ApplicationIdentinterBackground
中,添加以下代码:

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
}
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.")
        }
    }
}
func applicationWillEnterForeground(_ application: UIApplication) {
    print("Back to foreground.")
    //restore lock screen setting
    let isDisplayStatusLocked = UserDefaults.standard
    isDisplayStatusLocked.set(false, forKey: "isDisplayStatusLocked")
    isDisplayStatusLocked.synchronize()  
}
步骤4: 在
应用程序的内部,添加以下代码:

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
}
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.")
        }
    }
}
func applicationWillEnterForeground(_ application: UIApplication) {
    print("Back to foreground.")
    //restore lock screen setting
    let isDisplayStatusLocked = UserDefaults.standard
    isDisplayStatusLocked.set(false, forKey: "isDisplayStatusLocked")
    isDisplayStatusLocked.synchronize()  
}
您可以通过一个演示项目来了解详细的方法: