我正在開發一個在後臺播放音頻的iPhone應用程序。如果用戶鎖定屏幕,我希望音頻繼續播放,但如果他們決定切換到另一個應用程序(通過按主頁按鈕)則暫停播放。如何在iOS5上區分屏幕鎖定和主頁按鈕?
在iOS 4上沒有問題,因爲當屏幕被鎖定時,應用程序將進入非活動狀態,並且只有在按下主屏幕按鈕時纔會移動到背景。在iOS 5上,當屏幕被鎖定時,應用程序現在也移動到背景中,所以看起來不再可能區分這兩種狀態。有沒有解決這個問題的方法?
我正在開發一個在後臺播放音頻的iPhone應用程序。如果用戶鎖定屏幕,我希望音頻繼續播放,但如果他們決定切換到另一個應用程序(通過按主頁按鈕)則暫停播放。如何在iOS5上區分屏幕鎖定和主頁按鈕?
在iOS 4上沒有問題,因爲當屏幕被鎖定時,應用程序將進入非活動狀態,並且只有在按下主屏幕按鈕時纔會移動到背景。在iOS 5上,當屏幕被鎖定時,應用程序現在也移動到背景中,所以看起來不再可能區分這兩種狀態。有沒有解決這個問題的方法?
有一種方法來獲得這種行爲,但它帶有一個警告。您必須在Info.plist中設置音頻背景模式,並禁用應用程序的多任務處理。
設置音頻會話類別來AVAudioSessionCategoryPlayback:
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error: &error];
在你Info.plist文件,添加鍵值「所需的背景模式」,並添加項目「應用程序播放音頻」。然後添加鍵值「應用程序不能在後臺運行」,並將其設置爲「yes」
現在,鎖屏就會把你的應用程序在背景音頻模式(音頻保持運行),同時按下home鍵將終止你的應用程序(並沉默音頻)。當用戶從其他應用程序返回到您的應用程序時,它將再次啓動。因此,如果您的應用加載時間不會太長,並且您可以在重新啓動後返回到之前的狀態,則這可能是一個可行的解決方案。
我已經用iOS 4.3和iOS 5.0.1(在設備上)測試過它。
不幸的是,這種配置現在違反了Apple的驗證程序。當我去驗證我的應用程序時,我得到了以下問題:「如果UIApplicationExitsOnSuspend的值爲Yes,那麼您的應用程序不能在UIBackgroundModes鍵中指定任何值。如果您的應用程序使用後臺服務,則UIApplicationExitsOnSuspend的值必須爲No.信息,請參閱信息屬性列表關鍵參考。「 – adamcohenrose
太糟糕了。這是一個黑客無論如何 –
您可以通過檢查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的東西(但仍然將生成目標設置爲5.0)時,鎖定屏幕給出了現在的狀態UIApplicationStateBackground,當時我之前得到了UIApplicationStateInactive。
我從Apple支持部門詢問了他們,他們證實,這是從現在開始的工作方式。因此,無法檢測用戶是按Home還是屏幕鎖定。這很讓人傷心,因爲我有很好的用例來檢測它。
PS。在iOS7上運行時,使用XCode 4構建的應用程序仍舊可以工作。
你可以添加一個鏈接到你的開發論壇帖子?這對有訪問權限的人有用。 – Abizern
我發現了一個更好的方法來做這件事。
Differentiate between screen lock and home button press on iOS7
這不僅可以幫助您在iOS5的& iOS6的& iOS7設備:),但它不會在iPhone模擬器工作。
在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");
}
}
}
這是一個惱人的問題,因爲任何谷歌搜索返回的iOS5通知中心。理想情況下,我們可以找到我們有能力註冊的所有系統通知的列表,並希望彈出一些東西 – Rich86man
只要您相應地配置音頻會話,操作系統就會爲您解決這個問題,或者看起來如此(我我不是一個音頻程序員)。如果您在文檔中搜索「屏幕鎖定」,您可以在「音頻會話編程指南」(音頻會話手冊)中找到應該對您有幫助的信息。 –
可能重複的[是否有可能區分鎖定設備和發送應用程序到背景?](http://stackoverflow.com/questions/7754317/is-it-possible-to-distinguish-between-locking-the -device-and-sending-an-app-to-b) – Pang