2011-11-28 157 views
8

我正在開發一個在後臺播放音頻的iPhone應用程序。如果用戶鎖定屏幕,我希望音頻繼續播放,但如果他們決定切換到另一個應用程序(通過按主頁按鈕)則暫停播放。如何在iOS5上區分屏幕鎖定和主頁按鈕?

在iOS 4上沒有問題,因爲當屏幕被鎖定時,應用程序將進入非活動狀態,並且只有在按下主屏幕按鈕時纔會移動到背景。在iOS 5上,當屏幕被鎖定時,應用程序現在也移動到背景中,所以看起來不再可能區分這兩種狀態。有沒有解決這個問題的方法?

+0

這是一個惱人的問題,因爲任何谷歌搜索返回的iOS5通知中心。理想情況下,我們可以找到我們有能力註冊的所有系統通知的列表,並希望彈出一些東西 – Rich86man

+0

只要您相應地配置音頻會話,操作系統就會爲您解決這個問題,或者看起來如此(我我不是一個音頻程序員)。如果您在文檔中搜索「屏幕鎖定」,您可以在「音頻會話編程指南」(音頻會話手冊)中找到應該對您有幫助的信息。 –

+0

可能重複的[是否有可能區分鎖定設備和發送應用程序到背景?](http://stackoverflow.com/questions/7754317/is-it-possible-to-distinguish-between-locking-the -device-and-sending-an-app-to-b) – Pang

回答

1

有一種方法來獲得這種行爲,但它帶有一個警告。您必須在Info.plist中設置音頻背景模式,並禁用應用程序的多任務處理。

設置音頻會話類別來AVAudioSessionCategoryPlayback:

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

在你Info.plist文件,添加鍵值「所需的背景模式」,並添加項目「應用程序播放音頻」。然後添加鍵值「應用程序不能在後臺運行」,並將其設置爲「yes」 enter image description here

現在,鎖屏就會把你的應用程序在背景音頻模式(音頻保持運行),同時按下home鍵將終止你的應用程序(並沉默音頻)。當用戶從其他應用程序返回到您的應用程序時,它將再次啓動。因此,如果您的應用加載時間不會太長,並且您可以在重新啓動後返回到之前的狀態,則這可能是一個可行的解決方案。

我已經用iOS 4.3和iOS 5.0.1(在設備上)測試過它。

+2

不幸的是,這種配置現在違反了Apple的驗證程序。當我去驗證我的應用程序時,我得到了以下問題:「如果UIApplicationExitsOnSuspend的值爲Yes,那麼您的應用程序不能在UIBackgroundModes鍵中指定任何值。如果您的應用程序使用後臺服務,則UIApplicationExitsOnSuspend的值必須爲No.信息,請參閱信息屬性列表關鍵參考。「 – adamcohenrose

+0

太糟糕了。這是一個黑客無論如何 –

14

您可以通過檢查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"); 
    } 
} 
5

當applicationDidEnterBackground被觸發時,掛起UIApplicationState已經很好地工作了。可悲的是,現在已經改變了。

當我用XCode5編譯我的應用程序以支持所有iOS7的東西(但仍然將生成目標設置爲5.0)時,鎖定屏幕給出了現在的狀態UIApplicationStateBackground,當時我之前得到了UIApplicationStateInactive。

我從Apple支持部門詢問了他們,​​他們證實,這是從現在開始的工作方式。因此,無法檢測用戶是按Home還是屏幕鎖定。這很讓人傷心,因爲我有很好的用例來檢測它。

PS。在iOS7上運行時,使用XCode 4構建的應用程序仍舊可以工作。

+0

你可以添加一個鏈接到你的開發論壇帖子?這對有訪問權限的人有用。 – Abizern

4

我發現了一個更好的方法來做這件事。

Differentiate between screen lock and home button press on iOS7

這不僅可以幫助您在iOS5的& iOS6的& iOS7設備:),但它不會在iPhone模擬器工作。

在iOS7之前,您可以通過[[UIApplication sharedApplication] applicationState]來判斷它是鎖定屏幕還是帶有UIApplicationStateInactiveUIApplicationStateBackground的主頁按鈕。

但是這些在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"); 
     } 
    } 
} 

+0

這是否也適用於iOS5,如果是這樣,我建議將其編輯到您的答案中。另外,你能否解釋一下在編輯你的文章時代碼的作用?最好的Stack Overflow答案提供瞭解釋以及顯示代碼。如果你能做到這一點,我將能夠刪除這個downvote作爲編輯帖子有資格投票更改。至於dup這個帖子,我懷疑它可能會被合併到這個帖子中,並且會在一些人標記它之後自行解決。希望這有助於,並歡迎Stack Overflow! :) – jmort253

+0

@ jmort253我已經改變了它,這可能是我的英語錯誤。 – wqq

+0

我編輯來幫助語法。希望這可以幫助! :) – jmort253