![](/img/trans.png)
[英]Preventing SpriteKit game crash when deallocating playSoundFileNamed action
[英]SpriteKit playSoundFileNamed crash on iOS 8.3
我從我的應用程序的崩潰日志中看到一些少量的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)
我前段時間遇到過類似的問題。 問題是變量無法快速播放,因為每次用戶點擊屏幕時我都會創建變量。 嘗試在didMoveToView中定義操作,並查看是否仍然遇到問題。 希望有所幫助
試試這個,讓我知道它的工作原理。
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)")
}
}
我有類似的問題。 我的游戲(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崩潰 - 精靈工具包
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.