ios - SKAction playSoundFileNamed 在接到两个连续的电话后不起作用

标签 ios objective-c audio sprite-kit 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 作为解决方法,但仍然不确定播放很多简单的短声音的性能如何......

最佳答案

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

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

关于ios - SKAction playSoundFileNamed 在接到两个连续的电话后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32507946/

相关文章:

javascript - 我如何使用 node.js 切片音频文件

javascript - `AudioContext().audioWorklet.addModule()`,如何通过 `Blob` 加载?

ios - 如何确定当前设备是否具有支持 P3 的显示屏?

ios - 使用 Core Data 存储自定义对象

ios - 无法通过 faSTLane 在 Crashlytics Beta 发行说明中包含表情符号

objective-c - 在设置 Cocoa Pods 和安装 Ruby 更新时出错

location - iOS 的 kCLLocationAccuracyHundredMeters 常量

ios - Hook 任何事件并计算时间执行

ios - 从 Objective C 转换为 Swift 后,问题位移位 UInt8

android - 在Android中通过WIFI网络连续发送音频数据