2014-02-25 121 views
4

我有一個ios應用程序,它在移動到後臺時繼續播放音樂。現在,如果有電話回答與否,應用程序不會繼續播放音樂。 兩天來,我一直在這裏閱讀有關這個​​問題的帖子。沒有一個解決了我的問題。恢復通話後在後臺運行的應用程序ios

我在使用AVQueuePlayer對象時,也會在需要時流式播放我的音樂。 現在委託方法已被棄用,因爲ios6。所以我使用Notications。

令人驚奇的是,中斷結束(電話呼叫結束)的通知,播放音樂也是寫代碼,但應用程序強制犯規播放音樂,直到它涉及到前臺(與另一個通知)

這裏是我的代碼

-(void)viewWillAppear 
{..... 
    ........ 
    ..... 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionNotification:) name:AVAudioSessionInterruptionNotification object:nil]; 
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(audioInterruptionNotification:) name:UIApplicationDidBecomeActiveNotification object:nil] 
} 

-(void)audioInterruptionNotification:(NSNotification *) aNotification { 

NSLog(@"Interrupt %@", aNotification); 
NSDictionary *dict = [aNotification userInfo]; 
NSUInteger typeKey = [[dict objectForKey:@"AVAudioSessionInterruptionTypeKey"] unsignedIntegerValue]; NSLog(@"%d", typeKey); 
if (typeKey == 0) 
{ 
     [avPlayer play]; 
     NSLog(@"1......."); 
    } 
else if (typeKey == 1) 
{ 
    [avPlayer play]; 
    NSLog(@"3..............."); 

    ; 
} 

}

而且,我已經試圖通過調度隊列引起的延遲。 委託方法似乎不起作用。 但是gaana,saavn和蘋果的官方音樂應用程序在通話後恢復。所以這是可能的。 我似乎錯過了某些東西。 如果我使用核心電話。我將不得不添加整個框架,這將增加應用程序的大小。 如果這是唯一的方式,請告訴我們如何。

謝謝,我真的很感激你的時間。

+0

你使用過'UIApplicationWillEnterForegroundNotification'嗎?請參閱https://developer.apple.com/library/ios/documentation/uikit/reference/UIApplication_Class/Reference/Reference.html#//apple_ref/c/data/UIApplicationWillEnterForegroundNotification –

+1

爲什麼前景通知會被解僱?我的應用程序從非活動狀態轉換爲背景狀不過謝謝你。 –

回答

3

所以我回了一段時間後,我看到我的問題仍然沒有答案。那麼我已經解決了我的問題。原來,這只是一個簡單的陳述,失蹤了。

[[UIApplication sharedApplication] beginReceivingRemoteControlEvents];

以及我寫在我的問題中的代碼。

+0

對我來說不是必需的。只需在dispatch_after中包裝unpause就行了。雖然這是在iOS 8.3上。可能是版本之間的微小差異。 – user3099609

+1

關於多媒體事件的最重要的方法。 – OhadM

0

我已經解決了這個問題 - 應用程序被電話中斷,音樂消失如何?

  1. 當應用程序啓動,請致電:
    OSStatus result1 = AudioSessionInitialize(NULL, NULL, interruptionListener, NULL);
  2. 實現interruptionListener

    void interruptionListener(void * inClientData, UInt32 inInterruptionState){ 
        if (inInterruptionState == kAudioSessionBeginInterruption) 
        { 
         NSLog(@"Begin kAudioSessionBeginInterruption");   
         alcMakeContextCurrent(NULL); // important 
        } 
        else if (inInterruptionState == kAudioSessionEndInterruption) 
        { 
         AVAudioSession * audioSession = [AVAudioSession sharedInstance]; 
         NSError * err = nil; 
         [audioSession setCategory :AVAudioSessionCategoryPlayback error:&err];  // important 
         if(err){ 
          NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); 
          return; 
         } 
         err = nil; 
         [audioSession setActive:YES error:&err]; 
         if(err){ 
          NSLog(@"audioSession: %@ %ld %@", [err domain], (long)[err code], [[err userInfo] description]); 
          return; 
         } 
    
         //AudioSessionSetActive(true); //sometimes have no effect 
    
         // use alcMakeContextCurrent to set the context——with the context you stored before // important 
         NSLog(@"End kAudioSessionEndInterruption"); 
        } 
    } 
    

    現在它的確定,當鍾或電話中斷,音樂仍然可以播放。

  3. 但是,如果您接聽電話並觸摸'HOME'(尚未掛斷),並回到掛斷狀態,並返回到應用程序,音樂無法播放,您應該這樣做:
    當應用程序從後臺轉到前臺時,請設置AVAudioSessioncontext。 (不只是在中斷結束時設置它們)