2013-11-26 8 views
9

Alles klar, ich habe eine App entwickelt, in der ich ein NSMutableDictionary mit einem SKAction-Objekt habe. Der SKAction dient zum Abspielen eines Sounds.Spritekit stürzt beim Eingeben des Hintergrunds ab

Das alles funktioniert gut, außer ... die App stürzt auf Hintergrund mit dem folgenden Stack-Trace eingeben:

* thread #1: tid = 0x187d7, 0x3461b932 libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient + 10, queue = 'com.apple.spritekit.renderQueue, stop reason = EXC_BAD_ACCESS (code=1, address=0x1) 
frame #0: 0x3461b932 libGPUSupportMercury.dylib`gpus_ReturnNotPermittedKillClient + 10 
frame #1: 0x3461c3d0 libGPUSupportMercury.dylib`gpusSubmitDataBuffers + 104 
frame #2: 0x2eafc4a4 IMGSGX554GLDriver`SubmitPackets + 124 
frame #3: 0x31f83cb0 GLEngine`gliPresentViewES + 168 
frame #4: 0x31f8e136 OpenGLES`-[EAGLContext presentRenderbuffer:] + 62 
frame #5: 0x002622e6 libglInterpose.dylib`EAGLContext_presentRenderbuffer(EAGLContext*, objc_selector*, unsigned int) + 370 
frame #6: 0x323f9064 SpriteKit`-[SKView _renderContent] + 1220 
frame #7: 0x3a90b0ae libdispatch.dylib`_dispatch_client_callout + 22 
frame #8: 0x3a90f8f2 libdispatch.dylib`_dispatch_barrier_sync_f_invoke + 26 
frame #9: 0x323f8b72 SpriteKit`-[SKView renderContent] + 82 
frame #10: 0x323f651a SpriteKit`__29-[SKView setUpRenderCallback]_block_invoke + 130 
frame #11: 0x32418c86 SpriteKit`-[SKDisplayLink _callbackForNextFrame:] + 254 
frame #12: 0x002615fe libglInterpose.dylib`-[DYDisplayLinkInterposer forwardDisplayLinkCallback:] + 270 
frame #13: 0x321d7ad2 QuartzCore`CA::Display::DisplayLinkItem::dispatch() + 98 
frame #14: 0x321d787c QuartzCore`CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 344 
frame #15: 0x34dd476c IOMobileFramebuffer`IOMobileFramebufferVsyncNotifyFunc + 104 
frame #16: 0x30a5ebe4 IOKit`IODispatchCalloutFromCFMessage + 248 
frame #17: 0x2fd3cb80 CoreFoundation`__CFMachPortPerform + 136 
frame #18: 0x2fd47776 CoreFoundation`__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 34 
frame #19: 0x2fd47712 CoreFoundation`__CFRunLoopDoSource1 + 346 
frame #20: 0x2fd45ede CoreFoundation`__CFRunLoopRun + 1406 
frame #21: 0x2fcb0470 CoreFoundation`CFRunLoopRunSpecific + 524 
frame #22: 0x2fcb0252 CoreFoundation`CFRunLoopRunInMode + 106 
frame #23: 0x349b72ea GraphicsServices`GSEventRunModal + 138 
frame #24: 0x32565844 UIKit`UIApplicationMain + 1136 
frame #25: 0x000bd1bc SpritekitCrash`main(argc=1, argv=0x27d4dc5c) + 116 at main.m:16 

Da sagte EXC_BAD_ACCESS, ich Zombie-Objekte vermutet, aber sie in der Regelung didn ermöglichen Es hilft nichts, diesen Unfall zu verstehen.

Dies geschieht auch in dem minimalistischen Projekt-Setup (buchstäblich 2 Zeilen Code) in MyScene.m:

self.arrSounds = [[NSMutableDictionary alloc] init]; 
[self.arrSounds setObject:[SKAction playSoundFileNamed:[NSString stringWithFormat:@"70.caf"] waitForCompletion:NO] forKey:[NSString stringWithFormat:@"1"]]; 

Wie ist das möglich?

Sie können dieses Projekt von meinem GitHub-Seite herunterladen: https://github.com/SabatinoMasala/SpritekitCrash

+0

möglich Duplikat [Sprite Kit & Abspielen von Sound führt zu app Kündigung] (http://stackoverflow.com/questions/18976813/sprite-kit-playing-sound -leads-to-app-termination) – LearnCocos2D

Antwort

12

Allright, fand ich das Problem.

Hinter den Kulissen verwendet Spritekit AVAudioSession (was Sinn macht) für [SKAction playSoundFileNamed:]

AVAudioSession nicht aktiv sein kann, während die Anwendung im Hintergrund ist, so haben wir es zu stoppen, wenn gehen in Hintergrund, und reaktivieren Sie es beim Eintritt in den Vordergrund.

Verwenden Sie dieses Stück Code in beiden applicationWillResignActive und applicationDidEnterBackground die AVAudioSession zu deaktivieren:

[[AVAudioSession sharedInstance] setActive:NO error:nil]; 

es wieder zu aktivieren, verwenden Sie diese in applicationWillEnterForeground:

[[AVAudioSession sharedInstance] setActive:YES error:nil]; 
+0

Ich habe das gleiche Problem ohne irgendwelche Geräusche. Ich halte die SKScene-Ansicht im Hintergrund an. – igraczech