簡體   English   中英

如何在iOS5上區分屏幕鎖定和按下主屏幕按鈕?

[英]How to differentiate between screen lock and home button press on iOS5?

我正在開發一個在后台播放音頻的iPhone應用程序。 如果用戶鎖定屏幕,我希望音頻繼續播放,但是如果他們決定切換到其他應用程序(通過按下主屏幕按鈕),則我會暫停播放。

在iOS 4上沒有問題,因為在屏幕鎖定時該應用程序將進入非活動狀態,並且僅在按下主屏幕按鈕時該應用程序才會移至后台。 在iOS 5上,當屏幕鎖定時,該應用程序現在也移到了后台,因此似乎不再可能分辨出這兩種狀態之間的區別。 有解決這個問題的方法嗎?

您可以通過檢查UIApplicationapplicationState屬性來區分這兩種情況。 它將被設置為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構建的我的應用程序仍然可以使用舊方法。

我找到了一種更好的方法來執行此操作。

區分iOS7上的屏幕鎖定和主頁按鈕按下

這可以在iOS5&iOS6&iOS7設備上為您提供幫助:)。但是在iOS Simulator中不起作用。

[[UIApplication sharedApplication] applicationState]您可以使用UIApplicationStateInactiveUIApplicationStateBackground來獲取[[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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM