如何区分iOS5上的屏幕locking和主页button?

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

在iOS 4上,没有任何问题,因为当屏幕被locking时,应用程序将进入非活动状态,并且只有在主button被按下时才被移动到后台。 在iOS 5上,当屏幕被locking时,应用程序现在也被移动到背景中,所以看起来不再可能区分这两种状态。 有没有解决这个问题?

你可以通过检查UIApplicationapplicationState属性来区分这两种情况。 对于因locking屏幕而进入后台的应用程序,将设置为UIApplicationStateInactive ,否则将设置为UIApplicationStateInactive

 - (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"); } } 

当applicationDidEnterBackground被触发的时候,为UIApplicationState起了一个很好的作用。 可悲的是,现在已经改变了。

当我用XCode5编译我的应用程序来支持所有的iOS7的东西(但仍build立目标设置为5.0),locking屏幕现在状态UIApplicationStateBackground,早些时候,我得到了UIApplicationStateInactive。

我从苹果的支持问到这个问题,他们证实,这是从现在开始的。 因此,无法检测用户是按Home还是锁屏。 这很难过,因为我有很好的用例来检测它。

PS。 在iOS7上运行时,使用XCode 4构build的应用程序仍旧以旧方式运行。

我find了一个更好的方法来做这件事情。

在iOS7上区分屏幕locking和主页button

这可以帮助你在iOS5和iOS6和iOS7设备:)但是它不适用于iOS模拟器。

您可以在iOS7之前使用UIApplicationStateInactiveUIApplicationStateBackground来获得[[UIApplication sharedApplication] applicationState]是否是locking屏幕或homebutton。

但是这些在iOS7上成为了UIApplicationStateBackground的状态,你可以通过屏幕亮度来判断它。

锁屏状态下屏幕亮度应为0; 否则,它是主页button状态。

你可以把代码片段放在- (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"); } } } 

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

将audio会话类别设置为AVAudioSessionCategoryPlayback:

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

在Info.plist文件中,添加“必需的背景模式”键并添加“应用程序播放audio”项目。 然后添加“应用程序不在后台运行”键并将其设置为“是” 在这里输入图像说明

现在,locking屏幕会将您的应用程序置于audio后台模式(audio持续运行),同时按主页button将终止您的应用程序(并使audio静音)。 当用户从其他应用程序返回到您的应用程序,它将再次启动。 所以如果你的应用不需要太长的时间来加载,你可以在重新启动后返回到之前的状态,这可能是一个可行的解决scheme。

我用iOS 4.3和iOS 5.0.1(在设备上)testing过它。