2015-06-19 20 views
9

Widzę pewne niewielkie ilości błędów SpriteKit playSoundFileNamed z dziennika awarii mojej aplikacji. Awarie występują w systemie iOS 8.3.SpriteKit crash playSoundFileNamed na 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:] 
... 

i kilka związanych z awarii:

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:] 
... 

Czy ktoś wie, co powoduje tę katastrofę i jak to naprawić? Czy powinienem zawijać wszystkie wywołania do playSoundFileNamed: w bloku try-catch?

Edited

Więcej informacji:

Używam Swift. Próbuję odtwarzać własne dźwięki i widzę wypadki pochodzące z różnych dźwięków. Widzę też kilka raportów z iOS 8.2, więc ta awaria może nie być specyficzna dla iOS 8.3.

Linie, które odtwarzają dźwięk:

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

Proszę podać więcej informacji: Czy próbujesz odtworzyć własny dźwięk, czy też z zestawu systemowego? Czy jest to szczególny dźwięk, który zawiesza się lub wszystkie z nich? Czy awarię dotyczy tylko iOS 8.3? Czy możesz wkleić linie, które tworzą/odtwarzają dźwięk? etc ... – lchamp

+0

Jakiego języka używasz - Swift lub Obj-C? – sangony

+0

Używam Swift. Próbuję odtwarzać własne dźwięki i widzę wypadki pochodzące z różnych dźwięków. Widzę też kilka raportów z iOS 8.2, więc może to być w szczególności system iOS 8.3. – user1615898

Odpowiedz

2

przeżyłem podobny problem jakiś czas temu. Problem polegał na tym, że zmiennej nie można było zrobić wystarczająco szybko, aby grać, ponieważ tworzyłem zmienną za każdym razem, gdy użytkownik stuknął w ekran. Spróbuj zdefiniować akcję w didMoveToView i sprawdź, czy nadal masz problem. Nadzieję, że pomaga

0

Miałem podobny problem. Moja gra (swift + spritekit) zawieszała się na platformie iOS 8.x. ale 9.x działa idealnie. Kawałek dziennika:

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 

Rozwiązanie: ładuj wszystkie dźwięki tylko raz, jako stałe (let). Nie twórz zmiennej za każdym razem, gdy chcesz odtwarzać dźwięk.

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

Następnie, w pewnym SKSpriteNode na przykład:

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

znaleźć podobne/sam problem tutaj: Skaction.playsoundfilenamed crashes when repeat - sprite kit

1

Spróbuj i daj mi znać, jeśli jego pracy.

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)") 
    } 
} 
Powiązane problemy