如何区分锁屏和home

来源:互联网 发布:ubuntu网络邻居 编辑:程序博客网 时间:2024/05/18 01:57

  最近的项目中,当app进入后台时,需要执行一些操作。根据需求,还需要判断,是哪种操作导致app进入后台的:按home键;按锁屏键;在app中跳转到别的app。目前遇到的情况,就这三种。

  进入正题,找到AppDelegate.m 文件,然后:

  1、在方法 - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 中,添加如下代码:

CFNotificationCenterAddObserver(CFNotificationCenterGetDarwinNotifyCenter(),

                                   NULL,

                                   displayStatusChanged,

                                   CFSTR("com.apple.springboard.lockcomplete"),

                                   NULL,

                                CFNotificationSuspensionBehaviorDeliverImmediately);


  2、在AppDelegate.m文件中,实现上一步中所出现的displayStatusChanged方法:

staticvoid displayStatusChanged(CFNotificationCenterRef center,

                                 void *observer,

                                 CFStringRef name,

                                 const void *object,

                                 CFDictionaryRef userInfo) {

   if (name ==CFSTR("com.apple.springboard.lockcomplete")) {

        [[NSUserDefaultsstandardUserDefaults]setBool:YESforKey:@"kDisplayStatusLocked"];

        [[NSUserDefaultsstandardUserDefaults]synchronize];

    }

}


  3、在方法- (void)applicationDidEnterBackground:(UIApplication *)application中,添加如下代码:

UIApplicationState state = [[UIApplicationsharedApplication]applicationState];

   if (state ==UIApplicationStateInactive) {

       NSLog(@"按了锁屏键");

    }

   elseif (state ==UIApplicationStateBackground) {

       if (![[NSUserDefaultsstandardUserDefaults]boolForKey:@"kDisplayStatusLocked"]) {

           NSLog(@"按了home键,或者跳转到另一个app");

        }

        else {

           NSLog(@"按了锁屏键");

        }

    }


  4、在方法- (void)applicationWillEnterForeground:(UIApplication *)application 中,添加如下代码:
[[NSUserDefaults standardUserDefaults] setBool:NOforKey:@"kDisplayStatusLocked"];

[[NSUserDefaultsstandardUserDefaults]synchronize];


  5、真机调试,查看输出。

  个人理解:这个判断思路主要是根据,当锁屏时,iOS系统会触发一个通知,即com.apple.springboard.lockcomplete,当接收到这个通知时,我们设置一个标志位,即kDisplayStatusLocked,接着在applicationDidEnterBackground方法中(以下简称后台方法),判断该标志位的值。可能有的小伙伴会问,后台方法中出现的UIApplicationStateInactive是个什么什么鬼?我的理解是,iOS7之前,若是按锁屏键进入后台,则后台方法中,application.state是UIApplicationStateInactive,而按home键进入后台,application的状态是UIApplicationStateBackground。而iOS7之后,无论是锁屏,还是home键,进入后台时,application的状态都是UIApplicationStateBackground。因此,这个含有UIApplicationStateInactive的if语句,其实是用来适应iOS7之前的系统。

  参考资料:Differentiate between screen lock and home button press on iOS7
  
  PS:若有错误,请不吝赐教。
0 0