我正在开发一款在后台播放音频的iPhone应用。如果用户锁定屏幕,我希望音频继续播放,但如果他们决定切换到另一个应用程序(通过按主页按钮),则暂停播放。
在iOS 4上没有问题,因为当屏幕被锁定时应用程序将进入非活动状态,并且只有在按下主页按钮时才会移动到后台。在iOS 5上,当屏幕被锁定时,应用程序现在也被移动到后台,因此似乎不再可能分辨出这两种状态之间的区别。这个问题有解决方案吗?
答案 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]
判断它是锁定屏幕还是带有UIApplicationStateInactive
和UIApplicationStateBackground
的主页按钮。
但这些在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文件中,添加“必需的背景模式”键,然后添加“应用播放音频”项。然后添加“应用程序不在后台运行”键并将其设置为“是”
现在,锁定屏幕会将您的应用程序置于音频后台模式(音频保持运行),而按下主页按钮将终止您的应用程序(并使音频静音)。当用户从另一个应用程序返回您的应用程序时,它将再次启动。因此,如果您的应用不需要太长时间加载,并且您可以在重新启动后返回到之前的状态,这可能是一个可行的解决方案。
我已经使用iOS 4.3和iOS 5.0.1(在设备上)进行了测试。