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


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

我一直在用 (void)applicationWillResignActive:(UIApplication *)application; 为这些事件做准备(大部分工作都很好),但是对于来电,短信等也会触发这种方法。

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

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

有没有人有这方面的创意/解决方案?


3849
2018-05-24 17:52


起源



答案:


是的,没有确定的方法。 UIApplication 有房产 protectedDataAvailable 将返回 YES 当屏幕解锁时 NO 如果锁定 仅当用户启用内容保护时。所以这是我能想到的最接近但不可靠的。在这种情况下,你甚至可以听 UIApplicationProtectedDataDidBecomeAvailable 和 UIApplicationProtectedDataWillBecomeUnavailable 通知。


9
2018-05-24 18:53



用户如何启用 内容保护 ? - user454322
@ user454322: support.apple.com/kb/ht4175 - dsjoerg


答案:


是的,没有确定的方法。 UIApplication 有房产 protectedDataAvailable 将返回 YES 当屏幕解锁时 NO 如果锁定 仅当用户启用内容保护时。所以这是我能想到的最接近但不可靠的。在这种情况下,你甚至可以听 UIApplicationProtectedDataDidBecomeAvailable 和 UIApplicationProtectedDataWillBecomeUnavailable 通知。


9
2018-05-24 18:53



用户如何启用 内容保护 ? - user454322
@ user454322: support.apple.com/kb/ht4175 - dsjoerg


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

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

注意: 根据海报的说法 对我在这里回答的类似问题发表评论,这应该适用于非越狱手机。

要使用它,请注册这样的事件(这只注册一个事件,但如果这不适合你,请尝试另外两个):

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
2018-01-08 11:17



这个问题不是关于越狱设备。 - Zee
@Zee如果你仔细阅读我的答案,我说这个解决方案应该适用于非越狱设备。 - Nate
对不起,我的意思是问题不是关于使用private-api,我正在寻找解决方案,我的应用程序在AppStore上。 - Zee
@Zee,从技术上讲,它也没有使用私有API。如 你可以在这看到, CFNotificationCenterAddObserver 是一个公共API。事件的字符串名称不在公共标题中,但它只是一个字符串。我很确定你可以使用它,或者如果你真的需要,可以对它进行模糊处理以使其获得批准。它更像是操作系统的“未记录”功能,当然,在将来的版本中可以更改。 - Nate


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

我在iOS 3.1(iPhone 3G)上查了一下 - 效果很好。

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

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


1
2017-09-23 15:26