我的 iOS 游戏有音乐和音效。我想让用户听自己的音乐来代替游戏的背景音乐。
一个简单的解决方案是添加一个新的菜单项来禁用游戏的背景音乐。但是,我想避免创建新的菜单项,除非我确信这种方法对用户来说更糟糕。
我目前的做法:
- 将音频会话类别设置为
AVAudioSessionCategoryAmbient
允许将游戏音频与 iPod(或其他音乐应用程序)播放混合。
- In
applicationDidBecomeActive
, check [[AVAudioSession sharedInstance] isOtherAudioPlaying]
如果其他应用程序正在后台运行,请关闭游戏音乐。
这似乎在大多数情况下都有效。当游戏启动时,它会中断背景音乐应用程序的播放。如果你想播放自己的音乐,那么你必须特意返回并按第三方音乐应用程序中的播放,或者使用iOS 7的向上滑动控制面板。否则,游戏本身的音乐将接管。
这有几个缺陷:
-
它没有检测到当第三方音乐应用程序通过 iPhone/iPod 耳塞内置的点击式遥控器开始/停止播放时。
- 虽然它适用于 iPod 应用程序,但不适用于 SoundCloud 应用程序。我没有测试过任何其他人。
问题:
有没有办法在第三方音乐应用程序(例如 iPod 应用程序)开始/停止播放时接收通知?或者,有没有办法在值时得到通知@property BOOL otherAudioPlaying
变化?
这种方法会适得其反吗?不简单地使用菜单项是不是很愚蠢?
在我的游戏中,ArunJTS 解决方案不起作用。第一个用户被问到有关麦克风的问题。其次,它不会检测音乐状态变化,例如我的应用程序是否执行了某些操作并开始播放,或者用户是否快速应用程序切换到音乐应用程序。
我所做的来自官方app docs https://developer.apple.com/library/ios/documentation/Audio/Conceptual/AudioSessionProgrammingGuide/ConfiguringanAudioSession/ConfiguringanAudioSession.html#//apple_ref/doc/uid/TP40007875-CH2-SW10。
段落:“检查应用程序启动期间是否正在播放其他音频”。
我只是定期检查是否有另一个应用程序在播放某些内容并做出适当的反应。
我的解决方案:
#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();
}
}
In - (void) applicationDidFinishLaunching:(UIApplication *)application
i call [self startCheckingIfOtherAppIsPlayingAudio:YES];
就这样。
所有这些都位于应用程序委托实现文件中。
这就是我对你问题的回答。我没有发现任何有关天气音乐应用程序或其他应用程序开始执行某些操作的通知。我已经阅读了整个音频会话编程指南并查看了 AVPlayer、AVAudioSession 类参考文献,但没有发现这样的东西。如果有人知道更好、更智能的解决方案,请告诉我。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)