如何在iOS5上区分屏幕锁定和主页按钮按下?

时间:2011-11-28 23:09:35

标签: objective-c ios ios4 ios5

我正在开发一款在后台播放音频的iPhone应用。如果用户锁定屏幕,我希望音频继续播放,但如果他们决定切换到另一个应用程序(通过按主页按钮),则暂停播放。

在iOS 4上没有问题,因为当屏幕被锁定时应用程序将进入非活动状态,并且只有在按下主页按钮时才会移动到后台。在iOS 5上,当屏幕被锁定时,应用程序现在也被移动到后台,因此似乎不再可能分辨出这两种状态之间的区别。这个问题有解决方案吗?

4 个答案:

答案 0 :(得分:14)

您可以通过检查applicationState的{​​{1}}属性来区分这两种情况。对于因锁定屏幕而输入后台的应用程序,它将设置为UIApplication,否则设置为UIApplicationStateInactive

UIApplicationStateBackground

答案 1 :(得分:5)

当kickDidEnterBackground被触发时,为UIApplicationState调用它可以很好地工作。可悲的是,现在已经改变了。

当我使用XCode5编译我的应用程序以支持所有iOS7的东西(但仍然将构建目标设置为5.0)时,锁定屏幕现在提供状态UIApplicationStateBackground,当我之前获得UIApplicationStateInactive时。

我从Apple的支持中询问了这一点,他们证实,这是从现在开始的。因此,无法检测用户是否按下了Home或Screen lock。这很难过,因为我有很好的用例来检测它。

PS。使用XCode 4构建的应用程序在iOS7上运行时仍然可以使用旧版本。

答案 2 :(得分:4)

我找到了一种更好的方法来做这件事。

Differentiate between screen lock and home button press on iOS7

这可以帮助你在iOS5和iOS上iOS6& iOS7设备:)。但它在iOS模拟器上不起作用。

在iOS7之前,您可以[[UIApplication sharedApplication] applicationState]判断它是锁定屏幕还是带有UIApplicationStateInactiveUIApplicationStateBackground的主页按钮。

但这些在iOS7上变为相同的状态UIApplicationStateBackground,您可以通过屏幕亮度判断它。

处于锁定屏幕状态时,屏幕亮度应为0;否则,它是主页按钮状态。

您可以将代码段放在- (void)applicationDidEnterBackground:(UIApplication *)application

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplicationState state = [[UIApplication sharedApplication] applicationState];
    if (state == UIApplicationStateInactive) {
        NSLog(@"Sent to background by locking screen");
    } else if (state == UIApplicationStateBackground) {
        CGFloat screenBrightness = [[UIScreen mainScreen] brightness];
        NSLog(@"Screen brightness: %f", screenBrightness);
        if (screenBrightness > 0.0) {
            NSLog(@"Sent to background by home button/switching to other app");
        } else {
            NSLog(@"Sent to background by locking screen");
        }
    }
}

答案 3 :(得分:1)

有一种方法可以获得这种行为,但它有一个警告。您必须在Info.plist中设置音频背景模式,并为您的应用禁用多任务处理。

将音频会话类别设置为AVAudioSessionCategoryPlayback:

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &error];

在Info.plist文件中,添加“必需的背景模式”键,然后添加“应用播放音频”项。然后添加“应用程序不在后台运行”键并将其设置为“是” enter image description here

现在,锁定屏幕会将您的应用程序置于音频后台模式(音频保持运行),而按下主页按钮将终止您的应用程序(并使音频静音)。当用户从另一个应用程序返回您的应用程序时,它将再次启动。因此,如果您的应用不需要太长时间加载,并且您可以在重新启动后返回到之前的状态,这可能是一个可行的解决方案。

我已经使用iOS 4.3和iOS 5.0.1(在设备上)进行了测试。

相关问题