进入后台时出现 AVAudioSession 问题

Posted

技术标签:

【中文标题】进入后台时出现 AVAudioSession 问题【英文标题】:AVAudioSession issue when entering background 【发布时间】:2015-01-15 19:21:01 【问题描述】:

我试图在我的游戏进入后台之前停止音乐播放器,但没有成功。我查看了与我遇到的相同问题的所有问题,但找不到我需要的答案。我正在从主视图控制器播放我的游戏音乐:

XYZViewController.h

@import AVFoundation;

@interface XYZViewController : UIViewController 
@property (readwrite)AVAudioPlayer* backgroundMusicPlayer;

编辑添加这段代码,这是我分配并初始化音乐播放器。忘记了,之前补充一下,不好意思:

XYZViewController.m
- (void)viewDidLoad


    [super viewDidLoad];
    [self gameCenterLogin];

    // Configure the view.
    SKView * skView = (SKView *)self.view;
    skView.showsFPS = YES;
    skView.showsNodeCount = YES;


    //AUDIO BACKground
    NSError *error;
    NSURL * backgroundMusicURL = [[NSBundle mainBundle] URLForResource:@"Astro World music" withExtension:@"mp3"];
    self.backgroundMusicPlayer = [[AVAudioPlayer alloc] initWithContentsOfURL:backgroundMusicURL error:&error];
    self.backgroundMusicPlayer.numberOfLoops = -1;
    [self.backgroundMusicPlayer prepareToPlay];
    [self.backgroundMusicPlayer play];

[skView presentScene:scene];


我的 viewController 中有这两个公共方法来停止和播放我的音乐:

-(void)stopPlayer
    [self.backgroundMusicPlayer stop];

-(void)playMusic

    [self.backgroundMusicPlayer play];

这是我在进入后台之前从 appDelegate.m 执行的操作,我从 viewController 调用该方法以在停止 AVAUdiosession 之前停止音乐

    - (void)applicationWillResignActive:(UIApplication *)application

    // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state.
    // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game.


    XYZViewController* mainController = (XYZViewController*)  self.window.rootViewController;
    [mainController stopPlayer];
    [[AVAudioSession sharedInstance] setActive:NO error:nil];
    NSLog(@"pause music");

但无论我做什么,我总是得到同样的错误:

    RROR:     [0x35aa49dc] AVAudioSession.mm:646: -[AVAudioSession setActive:withOptions:error:]: Deactivating an audio session that has running I/O. All I/O should be stopped or paused prior to deactivating the audio session.
2015-01-15 20:09:49.080 Astro World[269:23154] pause music

任何帮助将不胜感激,谢谢!

【问题讨论】:

你检查stopPlayer是否被调用? 您是否正确实现了 AVAudioSession 委托方法? @0x141E 是的,我在 stopPlayer 方法中使用 NSLog 进行了检查,是的,它正在被调用。 @sangony 我没有任何代表 AVAudioSession。这些真的很重要吗?我真的需要它们吗? 没有代表就无法正常工作。 【参考方案1】:

将此代码插入到 AVAudioPlayerDelegate 的方法中。

-(void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag
  [audioPlayer stop];
  [audioPlayer prepareToPlay];

其中 audioPlayer 是在我的类的标题中声明的变量。

prepareToPlay 指令应该可以解决您的问题!

这可能对你有帮助:)

【讨论】:

以上是关于进入后台时出现 AVAudioSession 问题的主要内容,如果未能解决你的问题,请参考以下文章

将 AVAudioSession 模式设置为 AVAudioSessionModeVideoChat 时出现麦克风低语音录制问题

AVAudioSession 错误激活:错误域 = NSOSStatusErrorDomain 代码 = 561017449:将 CallKit API 集成到 Objective C 时出现音频设备

NSUrlSessionDownloadTask - 进入后台时出现didCompleteWithError

从后台运行应用程序时重新启动应用程序时出现闪屏问题

在后台模式下使用应用程序更改应用程序权限(从常规设置)时出现问题

iOS - 后台的 AVAudioSession 路由更改通知