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

前端之家收集整理的这篇文章主要介绍了当iOS设备进入睡眠模式(屏幕变黑)时,是否有一个检测事件?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想发现两个事件:

>设备锁定/解锁.
>设备进入睡眠状态,屏幕变黑.

我在这里能够实现的第一个:
Is there a way to check if the iOS device is locked/unlocked?

现在我想检测第二个事件,有没有办法呢?

解决方法

你基本已经有了解决方案,我猜你从我最近的一个答案中发现:)

使用com.apple.springboard.hasBlankedScreen事件.

当屏幕空白时,会出现多个事件,但是这个事件应该足够了:

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交互发生(按下按钮等),您知道屏幕必须当前处于开启状态.所以,接下来的BBankedScreen你应该指出屏幕是关闭的.

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

当屏幕重新打开时,您将再次看到com.apple.springboard.hasBlankedScreen.但是,在用户实际上通过滑动解锁设备(也可能是密码)之前,您将看不到com.apple.springboard.lockstate.

更新2:

还有另一种方法来做到这一点.您可以使用另一组API来侦听此通知,并且在通知到达时也可以使用get a state variable

#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");
}

并且您将需要保留一个ivar或一些其他持久性变量来存储通知标记(不要仅仅将这个注册方法中的本地变量)

int notifyToken;

您应该看到通过notify_get_state()获取的状态变量在0和1之间切换,这将使您区分屏幕开启和关闭事件.

虽然this document is very old,它确实列出哪些通知事件具有可通过notify_get_state()检索的关联状态.

警告:see this related question for some complications with this last technique

猜你在找的iOS相关文章