SpriteKit在iOS 8.3上播放音效文件时崩溃

9

我在我的应用程序的崩溃日志中看到了一些少量的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)

请提供更多信息:您是尝试播放自己的声音还是系统捆绑的声音?是特定的声音崩溃还是所有声音都崩溃?它只在iOS 8.3上崩溃吗?您能粘贴创建/播放声音的行吗?等等... - lchamp
你使用的是哪种编程语言 - Swift 还是 Obj-C? - sangony
我正在使用Swift编程语言。尝试播放自己的声音,但是我看到来自不同声音的崩溃。我还看到了一些来自iOS 8.2的报告,所以可能不仅限于iOS 8.3。 - user1615898
你尝试过使用不同的音频编码和/或不同的声音文件吗? - aramusss
你好,你找到答案了吗?我的一个应用程序在播放声音时崩溃并抛出相同的异常。这种情况并不总是发生,只有少数几次。 - Araib karim
也许你应该看一下这个答案:http://stackoverflow.com/questions/5720984/accelerometer-crashing-after-shaken-cocoa-touch - Araib karim
3个回答

2

我曾经遇到过类似的问题。问题出在变量不能够快速地被创建,因为每次用户点击屏幕时都会创建变量。尝试在didMoveToView中定义操作,看看是否还会出现这个问题。 希望能有所帮助。


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)")
    }
}

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重复播放时崩溃 - Sprite Kit


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接