2013-11-21 42 views
2

我的iOS遊戲有音樂和音效。我想讓用戶聽他們自己的音樂來代替遊戲的背景音樂。當另一個應用程序開始/停止播放音頻時,我的應用程序能夠得到通知嗎?

一個簡單的解決方案是添加一個新的菜單項,禁用遊戲的背景音樂。不過,我想避免創建一個新的菜單項,除非我確信這種方法對用戶來說更糟糕。


我目前的做法:

  1. 設置音頻會話類別AVAudioSessionCategoryAmbient,讓遊戲音效有iPod(或其他音樂應用程序)播放的混合。
  2. applicationDidBecomeActive,檢查[[AVAudioSession sharedInstance] isOtherAudioPlaying]並關閉遊戲的音樂,如果另一個應用程序在後臺播放。

這似乎在大多數情況下工作。遊戲啓動時,會中斷後臺播放音樂應用程序。如果您想播放自己的音樂,則必須故意返回並在第三方音樂應用程序中按播放,或者使用iOS 7的輕掃式控制面板。否則,遊戲自己的音樂將會接管。

這都與一對夫婦的缺陷:

  1. 當第三方音樂應用程序的播放開始/由內置於iPhone/iPod的耳塞點擊鍵遙控器停止它不會檢測
  2. 雖然它適用於iPod應用程序,但它不適用於SoundCloud應用程序。我沒有測試任何其他人。

問題:

有沒有辦法收到通知時,第三方音樂應用程序(例如iPod的應用程序)啓動/停止播放?或者,當@property BOOL otherAudioPlaying的值發生變化時,是否有通知?

這種方法能否適得其反?不簡單地使用菜單項是愚蠢的嗎?

回答

0

我在我的iOS應用程序中遇到類似的問題,並通過'Bamsworld的解決方案解決了問題。 檢查link的詳細信息。

解決辦法:

試試這個在您applicationDelegates方法 - (BOOL)申請:(UIApplication的*)應用程序didFinishLaunchingWithOptions:(NSDictionary的*)launchOptions

// set audio session category AVAudioSessionCategoryPlayAndRecord with no options 
success = [[AVAudioSession sharedInstance] setCategory: AVAudioSessionCategoryPlayAndRecord error:nil]; 
if (!success) { 
    NSLog(@"setCategoryError"); 
} 

// set audio session mode to default 
success = [[AVAudioSession sharedInstance] setMode:AVAudioSessionModeDefault error:nil]; 
if (!success) { 
    NSLog(@"setModeError"); 
} 

// activate audio session 
success = [[AVAudioSession sharedInstance] setActive:YES error:nil]; 
if (!success) { 
    NSLog(@"activationError"); 
} 
1

在我的比賽,ArunJTS解決方案didnt工作。第一個用戶被問到麥克風。其次,它不檢測音樂狀態變化,我的應用程序做了什麼,並開始播放或用戶做了快速的應用程序切換到音樂應用程序。

我從官方app docs派生出來的。 段落:「檢查應用程序啓動期間是否播放其他音頻」。

我只是定期檢查是另一個應用程序玩的東西,並適當地作出反應。

我的解決辦法:

#pragma mark - Audio 

- (void) startCheckingIfOtherAppIsPlayingAudio:(BOOL)shouldStart 
{ 
    if (shouldStart == YES) 
    { 
     if (self.timerMusicCheck.isValid) 
     { 
      return; 
     } 

     //[self.timerMusicCheck fire]; 
    } 
    else 
    { 
     [self.timerMusicCheck invalidate]; 
     self.timerMusicCheck = nil; 
    } 
} 

- (NSTimer*) timerMusicCheck 
{ 
    if (_timerMusicCheck) 
    { 
     return _timerMusicCheck; 
    } 

    _timerMusicCheck = [NSTimer timerWithTimeInterval:30 target:self selector:@selector(checkIsOtherAudioPlaying) userInfo:nil repeats:YES]; 
    [[NSRunLoop currentRunLoop] addTimer:_timerMusicCheck forMode:NSDefaultRunLoopMode]; 

    return _timerMusicCheck; 
} 

- (void) checkIsOtherAudioPlaying 
{ 
    AVAudioSession *audioSession = [AVAudioSession sharedInstance]; 
    if (!audioSession.otherAudioPlaying) 
    { 
     K_LOG("game audio resume"); 
     KMiscTools::resumeBackgroundMusic(); 
    } 
    else 
    { 
     K_LOG("game audio suspend"); 
     KMiscTools::suspendBackgroundMusic(); 
    } 
} 

- (void) applicationDidFinishLaunching:(UIApplication *)application我打電話[self startCheckingIfOtherAppIsPlayingAudio:YES];,這一切。

所有這些駐留在應用程序委託實現文件中。

所以這將是我對你的問題的答案。我沒有發現任何有關weater Music應用程序或其他應用程序開始做某些事情的通知。我已經閱讀完整的音頻會話編程指南,看了AVPlayer,AVAudioSession類的引用,並沒有發現這樣的事情。如果有人知道更好,更聰明的解決方案,請讓我知道。

+0

那種不蘋果的方式,是否還沒有委託或通知呢? – s1ddok

相關問題