【问题标题】:SKAction playSoundFileNamed doesn't work after receiving two consecutive phone callsSKAction playSoundFileNamed 连续接到两个电话后不起作用
【发布时间】:2015-12-07 02:22:12
【问题描述】:

我试图弄清楚为什么 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 作为一种解决方法,但仍然不确定播放大量简单短声音的性能如何......

【问题讨论】:

  • 我很久以前就在处理这个问题。我从来没有找到解决办法。对我来说,它只需要一个电话。但是还有一个更糟糕的情况,您可能还想检查一下。我正在使用 iAd,每次展示有声音的广告(如那些战争游戏广告)时,这也会停止 playSoundFileNamed: 的工作,直到应用程序重新启动。我唯一能做的就是从我的游戏中删除广告。如果他们碰巧收到带有音频的广告,我不能冒险让所有游戏音效失败的用户体验。我只希望用户不要接到电话。

标签: ios objective-c audio sprite-kit skaction


【解决方案1】:

SKAction playSoundFileNamed 在应用程序在后台和前台之间转换方面存在问题。这就是您遇到此问题的原因。我不确定这个问题是否已在 iOS 9 中得到纠正。

至于解决方法,您说您不感兴趣,但为了完整起见,我将包括一个。使用 AVAudioPlayer 而不是 SKAction。 AVAP 能够根据您应用的状态停止和启动(使用其委托)。

【讨论】:

  • 是的,playSoundFileNamed 行为有问题,可能在发言的那一刻我们无法做任何改变。我想我可以对此进行调查。
【解决方案2】:

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

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

【讨论】:

  • neave - 我尝试了您的解决方案并进行了测试,但它对我不起作用。关于这个主题有很多信息,但它非常过时。这仍然适用于您的应用程序吗?我无法切换 - 每当我使用其他声音引擎时,都会遇到性能问题。感谢您提供任何信息
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-20
  • 1970-01-01
  • 2015-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多