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上运行时仍然可以使用旧版本.
有一种方法可以实现这种行为,但有一个警告。您必须在 Info.plist 中设置音频背景模式并禁用应用程序的多任务处理。
将音频会话类别设置为 AVAudioSessionCategoryPlayback:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &error];
Run Code Online (Sandbox Code Playgroud)
在 Info.plist 文件中,添加“所需背景模式”键并添加“应用程序播放音频”项。然后添加键“应用程序不在后台运行”并将其设置为“是”

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