2015-09-10 21 views
10

我想弄清楚为什么playSoundFileNamed在接到两个连续的电话呼叫后不起作用。实际上,它只有在收到第一个电话后才有效。重现步骤是:SKAction playSoundFileNamed在收到两个连续的电话后不工作

  1. 开始游戏
  2. 等待一个电话,去背景
  3. 电话通话结束(拒绝或打断来电者)
  4. 回到前台

之后,播放声音从touchesBegan仍然有效。

当我重复上面的步骤(跳过第一步)时,touchesBegan的机制停止工作。不知道为什么会这样......这里是一个可以产生描述的行为代码:

@interface GameScene() 

@property (nonatomic, strong) SKAction *sound; 
@end 

@implementation GameScene 

-(void)didMoveToView:(SKView *)view { 
    self.sound = [SKAction playSoundFileNamed:@"sound1.wav" waitForCompletion:NO]; 
} 

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event { 
    /* Called when a touch begins */ 
    [self runAction:self.sound]; 
} 
@end 

我知道有与此相关的SO一些问题,但鉴于答案相关的解决方法。 我对解决方法不感兴趣,而是为什么会发生这种情况?它是否与AVAudioSession有关? (可能不是)我知道我可以使用AVAudioPlayer作为解决方法,但仍然不知道播放大量简单的短音的性能有多高...

+1

我刚才在处理这个问题。我从未找到解决方案。对我来说,它只需要一个电话。但是有一种更糟糕的情况,你可能也想检查一下。我使用的是iAd,每当有声音的广告(如战争游戏广告)被呈现时,这也会阻止playSoundFileNamed:从工作到应用程序重新启动。我唯一能做的就是从我的游戏中删除广告。我不能冒险让用户体验到所有游戏音效都会失败,如果他们碰巧收到一个带有音频的广告。我不得不希望用户不要打电话。 – Brad

回答

2

SKAction playSoundFileNamed对于应用程序之间的转换背景和前景。这就是你遇到这个问题的原因。我不确定这个问题是否已在iOS 9中得到纠正。

至于解决方法,您声明您不感兴趣,但为了完成的目的,我将包含一个。使用AVAudioPlayer而不是SKAction。 AVAP有能力根据您的应用程序状态停止并开始(使用其代表)。

+1

是的,playSoundFileNamed扮演越野车,可能在讲话的那一刻,我们无法做任何改变。我想我可以填写一个关于这个的雷达。 – Whirlwind

+0

刚刚在iOS9上进行了测试。它不工作。 – Whirlwind

0

这可能是混合音频的问题。我发现启用混合音频不会在中断,广告视频播放或应用后台停止时停止SpriteKit的音频引擎。

try? AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryAmbient)