[英]How to differentiate between screen lock and home button press on iOS5?
我正在開發一個在后台播放音頻的iPhone應用程序。 如果用戶鎖定屏幕,我希望音頻繼續播放,但是如果他們決定切換到其他應用程序(通過按下主屏幕按鈕),則我會暫停播放。
在iOS 4上沒有問題,因為在屏幕鎖定時該應用程序將進入非活動狀態,並且僅在按下主屏幕按鈕時該應用程序才會移至后台。 在iOS 5上,當屏幕鎖定時,該應用程序現在也移到了后台,因此似乎不再可能分辨出這兩種狀態之間的區別。 有解決這個問題的方法嗎?
您可以通過檢查UIApplication
的applicationState
屬性來區分這兩種情況。 它將被設置為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");
}
}
觸發applicationDidEnterBackground時查找UIApplicationState效果很好。 可悲的是,現在已經改變了。
當我使用XCode5編譯我的應用程序以支持所有iOS7內容(但仍將build target設置為5.0)時,鎖定屏幕現在顯示的狀態為UIApplicationStateBackground,而之前我確實獲得了UIApplicationStateInactive。
我從Apple支持人員那里詢問了這一點,他們確認,這就是從現在開始的工作方式。 因此,無法檢測用戶是否按下了主屏幕或屏幕鎖定。 這是可悲的,因為我有很好的用例來檢測它。
PS。 當在iOS7上運行時,使用XCode 4構建的我的應用程序仍然可以使用舊方法。
我找到了一種更好的方法來執行此操作。
這可以在iOS5&iOS6&iOS7設備上為您提供幫助:)。但是在iOS Simulator中不起作用。
在 [[UIApplication sharedApplication] applicationState]
您可以使用UIApplicationStateInactive
和UIApplicationStateBackground
來獲取[[UIApplication sharedApplication] applicationState]
來判斷是鎖屏還是主頁按鈕。
但是這些在iOS7上變成了相同的狀態 UIApplicationStateBackground
,您可以通過屏幕亮度來判斷它。
處於鎖定屏幕狀態時,屏幕亮度應為0;否則,屏幕亮度應為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"); } } }
有一種方法可以實現此目的,但需要注意。 您必須在Info.plist中設置音頻背景模式,並為應用程序禁用多任務處理。
將音頻會話類別設置為AVAudioSessionCategoryPlayback:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &error];
在您的Info.plist文件中,添加鍵“必需的背景模式”並添加項“應用程序播放音頻”。 然后添加密鑰“應用程序不在后台運行”並將其設置為“是”
現在,鎖定屏幕將使您的應用程序進入音頻背景模式(音頻繼續運行),同時按下主屏幕按鈕將終止您的應用程序(並使音頻靜音)。 當用戶從另一個應用程序返回到您的應用程序時,它將再次啟動。 因此,如果您的應用加載時間不會太長,並且您可以在重新啟動后返回到之前的狀態,那么這可能是一個可行的解決方案。
我已經使用iOS 4.3和iOS 5.0.1(在設備上)對其進行了測試。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.