iOS开发之应用内检测手机锁屏,解锁状态

iPhone的锁屏监测分为两种方式监听:

1. 程序在前台,这种比较简单。直接使用Darwin层的通知就可以了:

#import

#defineNotificationLockCFSTR("com.apple.springboard.lockcomplete")

#defineNotificationChangeCFSTR("com.apple.springboard.lockstate")

#defineNotificationPwdUICFSTR("com.apple.springboard.hasBlankedScreen")

staticvoidscreenLockStateChanged(CFNotificationCenterRefcenter,void*observer,CFStringRefname,constvoid*object,CFDictionaryRefuserInfo)

{

NSString*lockstate=(__bridgeNSString*)name;

if([lockstate isEqualToString:(__bridgeNSString*)NotificationLock]){

NSLog(@"locked.");

}else{

NSLog(@"lock state changed.");

}

}

-(BOOL)application:(UIApplication*)application didFinishLaunchingWithOptions:(NSDictionary*)launchOptions

{

// Override point for customization after application launch.

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),

NULL, screenLockStateChanged, NotificationLock, NULL,

CFNotificationSuspensionBehaviorDeliverImmediately);

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),

NULL, screenLockStateChanged, NotificationChange, NULL,

CFNotificationSuspensionBehaviorDeliverImmediately);

//setScreenStateCb();

return YES;

}

2. 第二种是程序退后台后,这时再锁屏就收不到上面的那个通知了,需要另外一种方式, 以循环的方式一直来检测是否是锁屏状态,会消耗性能并可能被苹果挂起;

staticvoidsetScreenStateCb()

{

uint64_t locked;

__blockinttoken=0;

notify_register_dispatch("com.apple.springboard.lockstate",&token,dispatch_get_main_queue(),^(intt){

});

notify_get_state(token,&locked);

NSLog(@"%d",(int)locked);

}

-(void)applicationDidEnterBackground:(UIApplication*)application

{

while(YES){

setScreenStateCb();

sleep(1);

}

}

推荐阅读更多精彩内容