在iOS7上检测应用程序从lockscreen与其他iOS应用程序变为活动状态

前端之家收集整理的这篇文章主要介绍了在iOS7上检测应用程序从lockscreen与其他iOS应用程序变为活动状态前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我的应用程序在从锁定屏幕激活时处于不同的行为(锁定时处于活动状态),或从任何其他方式变为活动状态.

在iOS 6及更低版本上,我可以检测到这个

UIApplicationState state = [[UIApplication sharedApplication] applicationState];
if (UIApplicationStateInactive == state)
    // Coming from locked screen (iOS 6)
else
    // Coming from Springboard,another app,etc...

但是在iOS 7中,这两种情况下的状态值都是UIApplicationStateBackground.这是预期的行为吗?如何正确检测应用程序是否从锁定屏幕启动?

注册开发商,我已经在NDA解除之前将其发布在devforums上,见here

解决方法

我能够找出一个黑客,到目前为止似乎是可靠的.它只适用于设备,而不是模拟器,并且已经在运行iOS 7的iPhone 5s,5和4S上进行了测试.

似乎没有可能的方式来检测iOS 7上的应用程序的发布位置,但是有一种方法可以检测是否要进入锁屏vs跳板.诀窍是在applicationDidEnterBackground中读取屏幕亮度.当应用程序由于按下锁定按钮或自动锁定超时而触发背景时,iOS 7上的亮度将为0.0.否则,将>按住主页按钮时为0,或从多任务选择器或通知中心启动其他应用程序.

- (void)applicationDidEnterBackground:(UIApplication *)application {
    CGFloat screenBrightness = [[UIScreen mainScreen] brightness];
    NSLog(@"Screen brightness: %f",screenBrightness);
    self.backgroundedToLockScreen = screenBrightness <= 0.0;
}

现在我有一个ivar持有这个信息,我可以在applicationWillEnterForeground中使用它来确定我的应用程序流程.

- (void)applicationWillEnterForeground:(UIApplication *)application {
    if (self.backgroundedToLockScreen) {
        ... // app was backgrounded to lock screen
    } else {
        ... // app was backgrounded on purpose by tapping the home button or switching apps.
    }
    self.backgroundedToLockScreen = NO;
}

它不是与iOS 6的行为完全相同.在iOS 6中,您可以检查UIApplicationState以检测您的来自哪里,并且该解决方案可以解答与应用程序背景时所处的位置相似但并非完全相同的问题.例如,由于屏幕锁定超时,也许该应用程序是背景化的,但是另一个应用程序的通知会唤醒设备,并且用户直接从锁定屏幕中进入,然后返回到我的应用程序.我的应用程序将确定用户进入锁屏的背景知识,但是当他们回来时,他们实际上是从活跃的屏幕上来的.对于我的应用程序来说,这个差异是微不足道的,但是你的体重可能会有所不同.

那么老版本的操作系统支持呢?我的应用程序还支持iOS 6,所以我需要得到旧的行为.简单.只是应用状态监控到前台方法

- (void)applicationWillEnterForeground:(UIApplication *)application {
    UIApplicationState state = [[UIApplication sharedApplication] applicationState];
    if (UIApplicationStateInactive == state ||  // detect if coming from locked screen (iOS 6)
        self.backgroundedToLockScreen)          // detect if backgrounded to the locked screen (iOS 7)
    {
        ... // app is coming from or was backgrounded to lock screen
    } else {
        ... // app was backgrounded on purpose by tapping the home button or switching apps
    }
    self.backgroundedToLockScreen = NO;
}

我不知道亮度读数有多可靠,或者将来的操作系统版本是否会改变,但同时这个黑客似乎是我们能够获得的最好的.希望这可以帮助.

猜你在找的iOS相关文章