我的应用程序崩溃,因为我的精灵套件游戏中未完成的声音

无法理解为什么我的应用程序崩溃总是在播放声音的时候出现背景。 如果这里没有声音的应用程序不会崩溃。 我有一个发挥声音的SKAction 。 我预先加载这个歌曲与static letActions类,并调用static func返回SKAction的声音。 所以我有完成水平的声音。 当它播放,我打回家button,他们回到应用程序。 有应用程序崩溃消息“线程1:EXC_BAD_ACCESS(代码= 1,地址= 0xff8e9abc)”。 有没有人知道这里发生了什么?

这是我的结构称为Actions

 public struct Actions { static let completionSound = SKAction.playSoundFileNamed("CompletionSound.mp3", waitForCompletion: false) static func playCompletionSound() -> SKAction { return completionSound } } 

在我的class级叫做Grid ,我有条件,不pipe级别是否完成:

 class Grid { var delegate: GridDelegate? private var completed: Bool = false ... ... private func completeLevel() { if completed { let waitAction = SKAction.wait(forDuration: 1.5) let blockAction = SKAction.run { let groupAction = self.settings.sound ? SKAction.group([Actions.playGridSwishSound(), Actions.removeGridAction()]) : Actions.removeGridAction() self.gridNode.run(groupAction, completion: { self.gridNode.removeAllChildren() self.delegate?.completionLevel() }) } let seq = SKAction.sequence([waitAction, blockAction]) run(groupAction) } } 

在那里我有一个节点,它显示SKLabelNode与“完成”文本。

 class CompletionNode: SKNode { private let completionLabel = SKLabelNode(fontNamed: MainFont) init(settings: Settings) { self.settings = settings super.init() isUserInteractionEnabled = false completionLabel.text = Titles.CompletedTitle completionLabel.fontSize = 46.0 completionLabel.fontColor = GoldenColor completionLabel.centering() completionLabel.position = CGPoint(x: 0.0, y: 0.0) completionLabel.xScale = 0.0 completionLabel.yScale = 0.0 completionLabel.alpha = 0.0 addChild(completionLabel) } func animate(completion: @escaping () -> ()) { let waitAction = Actions.waitAction(duration: 0.2) let scaleAction = SKAction.scale(to: 1.0, duration: 0.4) scaleAction.timingMode = .easeInEaseOut let fadeInAction = Actions.fadeInAction(duration: 0.4) fadeInAction.timingMode = .easeIn let groupAction = SKAction.group([scaleAction, fadeInAction]) let llBlock = SKAction.run { self.completionLabel.run(groupAction) } let seq = SKAction.sequence([waitAction, llBlock]) run(seq, completion: completion) } } 

gameNode ,我有grid实例,它是最后一个的代表,我将completionNode添加到场景中:

 class GameScene: SKNode { var gird: Grid? let hudNode = HUDNode() let completionNode = CompletionNode() var completionOn = false ... init() { super.init() grid = Grid() grid!.delegate = self grid!.position = CGPoint(x: 0.0, y: 0.0) addChild(grid!) hudNode.position = CGPoint(x: 0.0, y: MainSize.height * 0.44) hudNode.zPosition = 40.0 hudNode.delegate = self addChild(hudNode) completionNode.alpha = 0.0 completionNode.position = CGPoint(x: 0.0, y: 0.0) completionNode.zPosition = 60.0 addChild(completionNode) } internal func completeLevel() { addCompletionScene() } private func addCompletionNode() { run(Actions.playCompletionSound()) completionNode.alpha = 1.0 completionNode.animate { self.completionOn = true self.hudNode.isUserInteractionEnabled = true } } } 

当我到达关卡末尾时,按回家button,然后回到我的游戏,发生什么事情发生。

看起来playSoundFileNamed在保存audio会话时遇到问题,而您的应用程序/游戏在前景和背景模式之间转换。

根据您的实施情况,在应用程序在中断后恢复后,您会收到无法预知的行为,从静音播放到加载失败的声音资产,直至崩溃。

以下是一个讨论类似问题的主题: SKAction playSoundFileNamed在接到两个连续的电话后不起作用

我build议停止使用playSoundFileNamed操作,并使用AVAudioPlayer来播放声音文件。 它需要更多的努力来configuration它,但它已经存在了很长时间,并且完美地工作。