当另一个应用程序开始/停止播放audio时,可以通知我的应用程序?

我的iOS游戏有音乐和音效。 我想让用户听取他们自己的音乐来代替游戏的背景音乐。

一个简单的解决scheme是添加一个新的菜单项,禁用游戏的背景音乐。 但是,我想避免创build一个新的菜单项,除非我确信这种方法对用户来说更糟。


我目前的做法:

  1. 将audio会话类别设置为AVAudioSessionCategoryAmbient以允许游戏audio与iPod(或其他音乐应用程序)的混音播放。
  2. applicationDidBecomeActive ,检查[[AVAudioSession sharedInstance] isOtherAudioPlaying]并closures游戏的音乐,如果另一个应用程序在后台播放。

这似乎在大多数情况下工作。 游戏启动时,会中断后台播放的音乐应用程序。 如果您想播放自己的音乐,则必须故意返回并在第三方音乐应用程序中按播放,或使用iOS 7的向上滑动控制面板。 否则,游戏自己的音乐将接pipe。

这带来了一些缺陷:

  1. 它不会检测第三方音乐应用程序何时通过iPhone / iPod耳塞内置的点击式遥控器启动/停止播放。
  2. 虽然它适用于iPod应用程序,但不适用于SoundCloud应用程序。 我没有testing任何其他人。

问题是:

当第三方音乐应用程序(例如iPod应用程序)开始/停止播放时,是否有办法接收通知? 或者,有没有办法通知@property BOOL otherAudioPlaying的值更改?

这种方法能适得其反吗? 不简单地使用菜单项是愚蠢的吗?

在我的游戏中,ArunJTS解决scheme没有工作。 第一个用户被问到麦克风。 其次,它不检测音乐状态的变化,我的应用程序做了什么,并开始播放或用户做了快速的应用程序切换到音乐应用程序。

我从官方的应用程序文档中得到了什么。 段落:“检查应用程序启动期间是否正在播放其他audio”。

我只是定期检查是另一个应用程序播放的东西,并作出适当的反应。

我的解决scheme

 #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音乐应用程序或其他一些应用程序开始做任何事情的通知。 我已经阅读了整个audio会话编程指南,看了AVPlayer,AVAudioSession类的引用,发现没有这样的事情。 如果有人知道更好,更聪明的解决scheme,请让我知道。

我在iOS应用程序中遇到了类似的问题,并通过Bamsworld的解决scheme解决了这个问题。 检查链接的详细信息。

解决scheme:

尝试这个你applicationDelegates方法 – (布尔)应用程序:(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"); }