在调用applicationWillResignActive:之后,在Sprite Kit中运行音频文件的操作将停止运行

Som*_*Guy 2 iphone audio ios ios7 sprite-kit

我的应用程序中的所有内容在常规​​使用中完全正常.但是,如果应用程序被电话中断,应用程序恢复时,播放声音文件的操作将不再播放声音文件.在电话通话之前,它每次都会播放.

关于导致什么/如何解决这个问题的任何想法?

san*_*ony 6

使用SKAction运行音频对于将应用程序发送到后台的中断(如电话呼叫,按主页按钮等)不可靠......

解决方案是使用AVAudioPlayer代替短暂的声音效果.

你必须:

  1. 仅对您的所有音频使用AVAudioPlayer,因为它经过设计和测试可以处理中断.
  2. 使用NSData作为与AVAudioPlayer一起使用的声音容器(可选).
  3. 每个声音都应该有自己的临时AVAudioPlayer实例,仅用于声音生命周期.

有关如何在iKnowSomething.com上执行此操作的详细说明,具体涉及:

  1. 使用[SKAction playSoundFileNamed:]的SpriteKit应用程序导致应用程序退出或进入后台崩溃.

  2. 在AppDelegate applicationDidEnterBackground中取消激活AVAudioSession:失败并显示错误(无效停用):错误域= NSOSStatusErrorDomain代码= 560030580"操作无法完成.(OSStatus错误560030580.)

  3. 在AVAudioSession中断(例如呼叫到达)上使用[SKAction playSoundFileNamed:]的SpriteKit应用程序无法重新激活(静音).

  4. 如何实现AVAudioPlayer代替SpriteKit [SKAction playSoundFileNamed:]?

LearnCocos2D还针对当应用程序进入后台并使用AVAudioPlayer时防止崩溃的问题写了一个很好的答案.

#import <AVFoundation/AVFoundation.h>
...

- (void)applicationWillResignActive:(UIApplication *)application
{
    // prevent audio crash
    [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

- (void)applicationDidEnterBackground:(UIApplication *)application
{
    // prevent audio crash
    [[AVAudioSession sharedInstance] setActive:NO error:nil];
}

- (void)applicationWillEnterForeground:(UIApplication *)application
{
    // resume audio
    [[AVAudioSession sharedInstance] setActive:YES error:nil];
}
Run Code Online (Sandbox Code Playgroud)

他的原始答案就在这里.