2014-03-05 34 views
0

我目前正試圖實現一個系統,如鬧鐘,當事件發生時(在我的情況下是藍牙事件)提醒手機。即使手機處於靜音和背景中,我也希望發生此警報。iOS - 無法在背景中播放聲音

我創建了一個本地通知,但如果手機處於靜音模式(這似乎是正常現象,因爲我們將手機置於靜音狀態),我無法播放聲音。

所以我試圖自己管理聲音,我很努力地在後臺播放聲音。到目前爲止,我實施了「應用程序播放音頻或使用AirPlay流音頻/視頻」鍵在我的plist中,並使用此代碼。

AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
NSError *error = nil; 
BOOL result = [audioSession setActive:YES error:&error]; 
if (! result && error) { 
    NSLog(@"Error For AudioSession Activation: %@", error); 
} 

error = nil; 
result = [audioSession setCategory:AVAudioSessionCategoryPlayback error:&error]; 
if (! result && error) { 
    NSLog(@"Error For AudioSession Category: %@", error); 
} 

if (player == nil) { 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"bell" ofType:@"wav"]; 
    NSURL *url = [NSURL fileURLWithPath:path]; 
    NSError *err = nil; 
    player = [[AVAudioPlayer alloc] initWithContentsOfURL:url error:&err]; 
    if(err) 
    { 
     NSLog(@"Error Player == %@", err); 
    } 
    else { 
     NSLog(@"Play ready"); 
    } 
} 

[player prepareToPlay]; 
[player setVolume:1.0]; 

if([player play]) 
{ 
    NSLog(@"YAY sound"); 
} 
else { 
    NSLog(@"Error sound"); 
} 

即使在靜音模式下,聲音在前景效果很好,但我在背景中根本沒有聲音。有任何想法嗎 ?

感謝

編輯: 最後我得到它與上面的代碼工作。唯一缺少的一點是,當我在藍牙事件中正確播放聲音時,我試圖播放聲音有點像另一個線程,而不是我的函數調用它的工作。

+1

你有沒有試過用'applicationDidEnterBackground:'方法? –

+0

當應用程序在後臺執行某些長操作(如保存)時調用此方法。在我的情況下,通知可能會很長時間後(但我的應用程序可以執行一些操作,因爲它是一個藍牙事件) –

回答

0

連續播放音頻(即使應用程序在後臺運行時)的應用程序可以通過在Info.plist文件中包含UIBackgroundModes鍵(使用音頻值)將其註冊爲背景音頻應用程序。包含此密鑰的應用必須在後臺播放可聽內容給用戶。

Apple reference "Playing Background Audio"

Ensuring That Audio Continues When the Screen Locks

找到here

+0

我說:「我實施」應用程序播放音頻或流音頻/視頻使用AirPlay「在我的plist」 –

0

我不知道,如果你的問題是你沒有正確配置音頻會話輸出。在我的應用程序中播放.wav時遇到了類似的問題。我只是用耳機聆聽他們。這個方法對我有幫助:

- (void) configureAVAudioSession { 
    //get your app's audioSession singleton object 
    AVAudioSession *session = [AVAudioSession sharedInstance]; 

    //error handling 
    BOOL success; 
    NSError* error; 

    //set the audioSession category. 
    //Needs to be Record or PlayAndRecord to use audioRouteOverride: 
    success = [session setCategory:AVAudioSessionCategoryPlayAndRecord 
          error:&error]; 

    if (!success) NSLog(@"AVAudioSession error setting category:%@",error); 

    //set the audioSession override 
    success = [session overrideOutputAudioPort:AVAudioSessionPortOverrideSpeaker 
             error:&error]; 
    if (!success) NSLog(@"AVAudioSession error overrideOutputAudioPort:%@",error); 

    //activate the audio session 
    success = [session setActive:YES error:&error]; 
    if (!success) NSLog(@"AVAudioSession error activating: %@",error); 
    else NSLog(@"audioSession active"); } 

試一下!

+0

感謝您的幫助,我試圖添加overrideOutputAudioPort方法,但它仍然無法正常工作... –

0

您需要對plist文件進行幾處更改。

用於在應用程序進入背景時啓用聲音。

1)設置所需的背景模式到App播放音頻

2)設置在應用背景不運行爲YES。

NSError *setCategoryErr = nil; 
NSError *activationErr = nil; 
[[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayback error:&setCategoryErr]; 
[[AVAudioSession sharedInstance] setActive:YES error:&activationErr]; 

然後,你需要在AppDelegate中

寫這些太多的代碼現在,您可以輕鬆地運行,而手機屏幕鎖定或背景音樂。

它適用於我。 :)

的更多信息,請參見Playing Audio in background modeAudio Session Programming Guide