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

Stu*_*her 8 objective-c ios4 ios ios5

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

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

Tam*_*ese 14

您可以通过检查applicationState属性来区分这两种情况UIApplication.它将设置UIApplicationStateInactive为由于锁定屏幕而进入后台的应用程序,否则将设置为UIApplicationStateBackground.

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    UIApplicationState state = [application applicationState];
    if (state == UIApplicationStateInactive) {
        NSLog(@"Sent to background by locking screen");
    } else if (state == UIApplicationStateBackground) {
        NSLog(@"Sent to background by home button/switching to other app");
    } 
}
Run Code Online (Sandbox Code Playgroud)


小智 5

当applicationDidEnterBackground被触发时,为UIApplicationState重新上载已经很好地工作了.可悲的是,现在已经改变了.

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

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

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


Dor*_*Roy 1

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

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

[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &error];
Run Code Online (Sandbox Code Playgroud)

在 Info.plist 文件中,添加“所需背景模式”键并添加“应用程序播放音频”项。然后添加键“应用程序不在后台运行”并将其设置为“是” 在此输入图像描述

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

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

  • 不幸的是,这种配置现在违反了苹果的验证程序。当我去验证我的应用程序时,出现以下问题:“如果 UIApplicationExitsOnSuspend 的值为 Yes,则您的应用程序不得在 UIBackgroundModes 键中指定任何值。如果您的应用程序使用后台服务,则 UIApplicationExitsOnSuspend 的值必须为 No。了解更多信息,请参阅信息属性列表关键参考。” (2认同)