2013-11-26 61 views
9

好人,我一直在开发一个应用程序,其中我有一个带有SKAction对象的NSMutableDictionary。 SKAction用于播放声音。Spritekit在进入后台时崩溃

这一切都运作良好,除了......在进入的背景下堆栈跟踪应用程序崩溃:

* 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 

既然说EXC_BAD_ACCESS,我怀疑僵尸的对象,但使他们在方案没对于理解这场崩溃没有帮助。

这甚至发生在最简约的项目设置(字面2行代码)在MyScene.m:

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

这怎么可能?

你可以从我的github上下载这个项目:https://github.com/SabatinoMasala/SpritekitCrash

+0

可能重复(http://stackoverflow.com/questions/18976813/sprite-kit-playing-sound -leads-to-app-termination) – LearnCocos2D

回答

12

还好吧,我发现这个问题。

在幕后,Spritekit使用AVAudioSession(这是有道理的)为[SKAction playSoundFileNamed:],而应用程序是在后台

AVAudioSession不能活动,所以我们必须要在何时停止其背景,并在进入前景时重新激活它。

使用此片的两个applicationWillResignActive和applicationDidEnterBackground代码禁用AVAudioSession:

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

要重新启用它,在applicationWillEnterForeground使用:

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

我有同样的问题没有任何声音。我在背景上暂停SKScene视图。 – igraczech

1

这是不够的,而SETACTIVE: NO通常以错误结束(实际上没有停用),这仍然导致崩溃。

完整的解决方案我已经在这里描述:Sprite Kit & playing sound leads to app termination

的[雪碧套件及播放声音会导致应用程序终止]
相关问题