检测iPhone屏幕是否打开/关闭

时间:2011-05-24 17:52:04

标签: iphone ios4

有没有办法检测iPhone的屏幕是打开还是关闭?例如,按下手机的屏幕锁定按钮时。

我一直在使用(void)applicationWillResignActive:(UIApplication *)application;为这些事件做准备(大部分都可以正常工作),但是对于来电,文本等也会触发此方法。

据我所知,没有文件化的方法来确定这一点。

我一直在玩一些解决方法,比如检查屏幕分辨率是否改变,检查方向是否未知,或获得设备的亮度。什么都没有消失。

有没有人为此提供任何创意/解决方法?

3 个答案:

答案 0 :(得分:9)

是的,没有确定的方法。 UIApplication有一个属性protectedDataAvailable,当屏幕解锁时会返回YES,如果仅在用户启用内容保护时锁定,则会NO 。所以这是我能想到的最接近但不可靠的。在这种情况下,您甚至可以收听UIApplicationProtectedDataDidBecomeAvailableUIApplicationProtectedDataWillBecomeUnavailable通知。

答案 1 :(得分:2)

您可以使用Darwin notifications来收听事件。我不是百分百肯定,但它看起来像是在越狱的iOS 5.0.1 iPhone 4上运行,其中一个事件可能就是你所需要的:

com.apple.iokit.hid.displayStatus
com.apple.springboard.hasBlankedScreen
com.apple.springboard.lockstate

注意:根据海报的comments to a similar question I answered here,这也适用于非越狱手机。

要使用此功能,请注册此类事件(仅注册一个事件,但如果这不适合您,请尝试另外两个):

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                NULL, // observer
                                displayStatusChanged, // callback
                                CFSTR("com.apple.iokit.hid.displayStatus"), // event name
                                NULL, // object
                                CFNotificationSuspensionBehaviorDeliverImmediately);

其中displayStatusChanged是您的事件回调:

static void displayStatusChanged(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo) {
    NSLog(@"event received!");
    // you might try inspecting the `userInfo` dictionary, to see 
    //  if it contains any useful info
    if (userInfo != nil) {
        CFShow(userInfo);
    }
}

我相信当屏幕同时打开关闭,锁定和解锁时,我上面列出的事件会被触发。您可能需要自己跟踪状态。另外,

com.apple.springboard.lockcomplete

仅在屏幕锁定时调用,而不是在解锁时调用。

答案 2 :(得分:1)

尝试this解决方法。作者声称它在4.2

上运行良好

我已在iOS 3.1(iPhone 3G)上查看过 - 效果很好。

更新:在iOS 5 beta 7(iPod Touch 4G)上不起作用: - (

update2:应用程序在屏幕锁定时转到后台,因此解决方案有点适用于iOS 5 beta 7: - )