>设备锁定/解锁.
>设备进入睡眠状态,屏幕变黑.
我在这里能够实现的第一个:
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",¬ifyToken,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