当iOS设备进入睡眠模式(当屏幕变黑时)时,是否有检测事件的方法?

当iOS设备进入睡眠模式(当屏幕变黑时)时,是否有检测事件的方法?,ios,iphone-privateapi,sleep-mode,Ios,Iphone Privateapi,Sleep Mode,我想检测两个事件: 设备被锁定/解锁 设备进入睡眠状态,屏幕变黑 我在这里实现的第一个目标是: 现在我想检测第二个事件,有什么办法吗?你基本上已经找到了解决方案,我猜你从我最近的一个答案中找到了:) 使用com.apple.springboard.hasbankedscreen事件 屏幕空白时会发生多个事件,但这一个就足够了: CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //cente

我想检测两个事件:

  • 设备被锁定/解锁
  • 设备进入睡眠状态,屏幕变黑
  • 我在这里实现的第一个目标是:


    现在我想检测第二个事件,有什么办法吗?

    你基本上已经找到了解决方案,我猜你从我最近的一个答案中找到了:)

    使用
    com.apple.springboard.hasbankedscreen
    事件

    屏幕空白时会发生多个事件,但这一个就足够了:

    CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(), //center
                                    NULL, // observer
                                    hasBlankedScreen, // callback
                                    CFSTR("com.apple.springboard.hasBlankedScreen"), // event name
                                    NULL, // object
                                    CFNotificationSuspensionBehaviorDeliverImmediately);
    
    其中回调为:

    static void hasBlankedScreen(CFNotificationCenterRef center, void *observer, CFStringRef name, const void *object, CFDictionaryRef userInfo)
    {
        NSString* notifyName = (__bridge NSString*)name;
        // this check should really only be necessary if you reuse this one callback method
        //  for multiple Darwin notification events
        if ([notifyName isEqualToString:@"com.apple.springboard.hasBlankedScreen"]) {
           NSLog(@"screen has either gone dark, or been turned back on!");
        }
    }
    

    更新:正如@VictorRonin在下面的评论中所说,应该很容易跟踪屏幕当前是打开还是关闭。这允许您确定当屏幕打开或关闭时,是否发生
    hasBlankedScreen
    事件。例如,当应用程序启动时,设置一个变量以指示屏幕已打开。此外,任何时候发生任何UI交互(按下按钮等),您都知道屏幕当前必须处于打开状态。因此,您得到的下一个
    hasbankedscreen
    应该指示屏幕关闭

    另外,我想确保我们清楚术语。当屏幕因超时而自动变暗时,或当用户手动按下电源按钮时,设备将锁定。无论用户是否配置了密码,都会发生这种情况。此时,您将看到
    com.apple.springboard.hasBlankedScreen
    com.apple.springboard.lockcomplete
    事件

    当屏幕再次打开时,您将再次看到
    com.apple.springboard.hasbankedscreen
    。但是,在用户真正用刷卡(可能还有密码)解锁设备之前,您不会看到
    com.apple.springboard.lockstate


    更新2:

    还有另一种方法可以做到这一点。您可以使用另一组API来侦听此通知,以及在通知发出时:

    #import <notify.h>
    
    int status = notify_register_dispatch("com.apple.springboard.hasBlankedScreen",
                                          &notifyToken,
                                          dispatch_get_main_queue(), ^(int t) {
                                              uint64_t state;
                                              int result = notify_get_state(notifyToken, &state);
                                              NSLog(@"lock state change = %llu", state);
                                              if (result != NOTIFY_STATUS_OK) {
                                                  NSLog(@"notify_get_state() not returning NOTIFY_STATUS_OK");
                                              }
                                          });
    if (status != NOTIFY_STATUS_OK) {
        NSLog(@"notify_register_dispatch() not returning NOTIFY_STATUS_OK");
    }
    
    您应该看到通过
    notify_get_state()
    获得的
    state
    变量,在0和1之间切换,这将使您能够区分屏幕打开和关闭事件

    不过,它确实列出了哪些通知事件具有可通过
    notify\u get\u state()
    检索的关联状态


    警告:

    您也可以订阅通知:“com.apple.springboard.lockstate”并使用API确定设备是否锁定。

    这是关于iPhone专用API的问题吗?什么都可以,我不打算在app Store上提交我的应用程序。事实证明,我已经尝试过了,此通知在两种情况下都会出现,即设备进入睡眠状态和设备从睡眠中醒来时。:Jan 16 18:48:53未知跳板[15]:发布'com.apple.iokit.hid.displayStatus'notifyState=0 Jan 16 18:48:53未知Myapp[1921]:Darwin notification NAME=com.apple.springboard.hasBlankedScreen一个16 18:50:29未知跳板[15]:发布'com.apple.iokit.hid.displayStatus'notifyState=1 Jan 16 18:50:29未知Myapp[1921]:Darwin notification NAME=com.apple.springboard.hasBlankedScreen您可以保留一个状态变量,设备现在处于休眠状态还是处于唤醒状态。我是否正确地注意到,如果锁定操作发生时,我的应用程序已经在后台,那么它将不会收到lockstate或lockcomplete通知?@SpencerWilliams,不一定。如果您只需按Home键以设置应用程序的后台,假设您的app.plist未指定它在挂起时退出,则您将收到通知。现在,与任何事情一样,你的应用程序在后台的时间是有限制的,因此如果你想无限期地收到这些通知,你可能不得不处理一些事情。这实际上是另一个问题,取决于我们是否在谈论越狱应用程序。但是,从根本上说,Darwin通知不会因为您进入了后台而停止。@SpencerWilliams,还要注意我注册通知时传递的最后一个参数。如果您没有立即使用
    cfNotificationSuspendionBehaviorDelivery
    ,那么当您的应用程序位于后台时,您很可能看不到通知。如何调用和使用它?实际上,我只想在屏幕变黑时检测事件,即屏幕从开/关转换。提前感谢。信息:这不是越狱设备。第一次通知与内特编写的代码相同。SBGetScreenLockStatus在链接文章中进行了描述。我添加这些事件作为“设备被锁定/解锁”的答案。它可以在非越狱设备上工作。@大家:请看这个问题,因为它解释了这种方法的一些潜在陷阱:
    int notifyToken;