在iOS 8.3上SpriteKit playSoundFileNamed崩溃

时间:2015-06-19 05:33:01

标签: ios swift sprite-kit

我看到我应用程序的崩溃日志中有少量SpriteKit playSoundFileNamed崩溃。崩溃发生在iOS 8.3上。

0 CoreFoundation __exceptionPreprocess  
1 libobjc.A.dylib objc_exception_throw
2 CoreFoundation -[NSException initWithCoder:]
3 SpriteKit +[SKPlaySound playSoundFileNamed:atPosition:waitForCompletion:]
4 SpriteKit +[SKAction(SKActions) playSoundFileNamed:waitForCompletion:]
...

还有一些相关的崩溃:

0 CoreFoundation __exceptionPreprocess  
1 libobjc.A.dylib objc_exception_throw
2 CoreFoundation -[NSException raise:format:]
3 SpriteKit +[SKPlaySound playSoundFileNamed:atPosition:waitForCompletion:]
4 SpriteKit +[SKAction(SKActions) playSoundFileNamed:waitForCompletion:]
...

有谁知道导致此次崩溃的原因以及如何解决这个问题?我应该将每个调用包装到playSoundFileNamed:在try-catch块中吗?

被修改

更多信息:

我正在使用Swift。试图播放我自己的声音,我看到来自不同声音的崩溃。我也看到了iOS 8.2中的一些报告,因此这次崩溃可能不是特定于iOS 8.3的。

播放声音的线条:

var sound = SKAction.playSoundFileNamed("Sound/ABC.mp3", waitForCompletion: false)
self.runAction(sound)

3 个答案:

答案 0 :(得分:2)

我前段时间遇到过类似的问题。问题是变量无法快速播放,因为每次用户点击屏幕时我都会创建变量。尝试在didMoveToView中定义操作,并查看是否仍然遇到问题。 希望有所帮助

答案 1 :(得分:1)

试试这个,让我知道它是否正常工作。

var audioPlayer = AVAudioPlayer()

func playAudio() {
    // Set the sound file name & extension
    let alertSound = NSURL(fileURLWithPath: NSBundle.mainBundle().pathForResource("ABC", ofType: "mp3")!)


    // Preperation
    try! AVAudioSession.sharedInstance().setCategory(AVAudioSessionCategoryPlayback, withOptions: [])
    try! AVAudioSession.sharedInstance().setActive(true)

    // Play the sound
    do {
        try audioPlayer = AVAudioPlayer(contentsOfURL: alertSound)
        audioPlayer.prepareToPlay()
        audioPlayer.play()
    } catch {
        print("there is \(error)")
    }
}

答案 2 :(得分:0)

我有类似的问题。我的游戏(swift + spritekit)在iOS 8.x上崩溃不确定。但在9.x上完美无缺。一块日志:

2015-12-15 21:27:40.827 MyGame[24055:2285857]
        *** Terminating app due to uncaught exception 'NSInvalidArgumentException', 
        reason: 'Resource assets/mfx/my_sound.m4a can not be loaded'
    *** First throw call stack:
    (
    0   CoreFoundation     0x008ae746 __exceptionPreprocess + 182
    1   libobjc.A.dylib    0x02598a97 objc_exception_throw + 44
    2   CoreFoundation     0x008ae66d +[NSException raise:format:] + 141
    3   SpriteKit          0x011ca435 +[SKPlaySound playSoundFileNamed:atPosition:waitForCompletion:] + 628
    4   SpriteKit          0x011601b4 +[SKAction(SKActions) playSoundFileNamed:waitForCompletion:] + 78
    5   MyGame             0x0012eb25

解决方案是:仅将所有声音加载一次,作为常量(let)。每次要播放声音时都不要创建变量。

import SpriteKit
import AVFoundation

class Sounds
{
    static let SOUND1 = SKAction.playSoundFileNamed("assets/sound1.m4a", waitForCompletion: false)
    static let SOUND2 = SKAction.playSoundFileNamed("assets/sound2.m4a", waitForCompletion: false)
}

然后,在某些SKSpriteNode中例如:

func playSound1()
{
    self.runAction(Sounds.SOUND1)
}

在此处查找类似/相同的问题:Skaction.playsoundfilenamed crashes when repeat - sprite kit