【问题标题】:Detect if iPhone screen is on/off检测 iPhone 屏幕是否打开/关闭
【发布时间】:2011-09-01 03:54:21
【问题描述】:

有什么方法可以检测 iPhone 的屏幕是打开还是关闭?例如,当按下手机的屏幕锁定按钮时。

我一直在使用(void)applicationWillResignActive:(UIApplication *)application; 为此类事件做准备(大部分情况下都可以正常工作),但此方法也会在来电、短信等时触发。

据我所知,没有记录的方法可以确定这一点。

我一直在尝试一些解决方法,例如检查屏幕分辨率是否改变、检查方向是否未知或获取设备的亮度。还没有任何结果。

是否有人对此有任何创造性/解决方案?

【问题讨论】:

    标签: iphone ios4


    【解决方案1】:

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

    【讨论】:

    • 用户如何启用内容保护
    【解决方案2】:

    您可以使用Darwin notifications 来监听事件。我不能 100% 确定,但在我看来,在越狱的 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
    

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

    【讨论】:

    • 这个问题与越狱设备无关。
    • @Zee 如果你仔细阅读我的回答,我声明这个解决方案应该在非越狱设备上工作。
    • 抱歉,我的意思不是关于使用 private-api,我正在寻找解决方案,我的应用在 AppStore 上。
    • @Zee,从技术上讲,它也没有使用私有 API。正如you can see hereCFNotificationCenterAddObserver 是一个公共 API。事件的字符串名称不在公共标头中,而只是一个字符串。我很确定您可以使用它,或者如果您确实需要,可以对其进行混淆以使其获得批准。它更像是操作系统的“未记录”功能,当然,可以在未来的版本中进行更改。
    【解决方案3】:

    尝试this 解决方法。作者声称它在 4.2 上运行良好

    我已经在 iOS 3.1 (iPhone 3G) 上检查过 - 运行良好。

    更新:不适用于 iOS 5 beta 7 (iPod Touch 4G) :-(

    update2:当屏幕锁定时应用程序进入后台,因此解决方案在 iOS 5 beta 7 上有点工作:-)

    【讨论】:

      猜你喜欢
      • 2012-01-02
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-28
      • 1970-01-01
      相关资源
      最近更新 更多