我的iOS游戏有音乐和音效。我想让用户听他们自己的音乐代替游戏的背景音乐。
一个简单的解决方案是添加一个禁用游戏背景音乐的新菜单项。但是,我想避免创建一个新的菜单项,除非我可以确信这种方法对用户来说更糟糕。
AVAudioSessionCategoryAmbient
,以允许将游戏音频与iPod(或其他音乐应用)播放混合。applicationDidBecomeActive
中,检查[[AVAudioSession sharedInstance] isOtherAudioPlaying]
,如果其他应用在后台播放,请关闭游戏的音乐。这在大多数情况下似乎都有效。当游戏启动时,它会中断背景音乐应用程序的播放。如果您想播放自己的音乐,则必须故意返回并在第三方音乐应用中按播放,或使用iOS 7的向上滑动控制面板。否则,游戏自己的音乐将接管。
这有几个缺陷:
当第三方音乐应用(例如iPod应用)开始/停止播放时,有没有办法接收通知?或者,有没有办法在@property BOOL otherAudioPlaying
的值发生变化时收到通知?
这可能会适得其反吗?简单地使用菜单项是不是很愚蠢?
答案 0 :(得分:1)
在我的游戏中,ArunJTS解决方案无效。第一个用户被问及麦克风。其次,它没有检测到音乐状态的变化,例如,我的应用程序做了什么并开始播放,或者用户是否已将应用程序快速切换到音乐应用程序。
我所做的是我从官方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];
,这就是全部。
所有这些都存在于app delegate实现文件中。
所以这将是我对你问题的回答。我没有发现有关weater音乐应用程序或其他应用程序开始做某事的任何通知。我已经阅读了整个音频会话编程指南,看了AVPlayer,AVAudioSession类引用,发现没有这样的事情。如果有人知道更好,更智能的解决方案,请告诉我。
答案 1 :(得分:0)
我在iOS应用程序中遇到了类似的问题,并通过'Bamsworld的解决方案解决了这个问题。 查看link以获取详细信息。
解决方案:
在你的applicationDelegates方法 - (BOOL)应用程序中尝试这个:(UIApplication *)application 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");
}