2013-11-21 20 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

相关问题