ios - 进入后台时 Spritekit 崩溃

标签 ios crash nsmutabledictionary sprite-kit skaction

好吧,伙计们,我一直在开发一个应用程序,其中我有一个 NSMutableDictionary 和一个 SKAction 对象。 SKAction 用于播放声音。

这一切都很好,除了......应用程序在进入后台时崩溃,堆栈跟踪如下:

* 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,所以我怀疑是僵尸对象,但是在方案中启用它们对理解这次崩溃没有任何帮助。

这甚至发生在 MyScene.m 中最简约的项目设置(实际上是 2 行代码)中:

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

最佳答案

好的,我发现了问题。

在幕后,Spritekit 使用 AVAudioSession(这是有道理的)用于 [SKAction playSoundFileNamed:]

AVAudioSession 在应用程序处于后台时无法激活,因此我们必须在进入后台时停止它,并在进入前台时重新激活它。

在 applicationWillResignActive 和 applicationDidEnterBackground 中使用这段代码来禁用 AVAudioSession:

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

要再次启用它,请在 applicationWillEnterForeground 中使用它:

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

关于ios - 进入后台时 Spritekit 崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20229576/

相关文章:

ios - 如何快速检测谷歌地图的相机位置

matlab - 如何使用 CUDA 功能阻止 Matlab 在(错误的)mex 文件执行时崩溃

android-layout - Android应用程序在setOnItemSelectedListener上崩溃

ios - 如何将 (BOOL *) 插入 NSMutableDictionary

iphone - 用字典数据填充 UITableView

ios - 来自照片 UITableView 的 json 不显示

ios - Fabric/Crashlytics 不兼容的 swift 版本

ios - 如何使 UIBarButtonItem 添加一个新的 NSDate 对象到 NSDictionary

ios - 如何在 Swift 中使用 Codable 协议(protocol)进行解码时进行区分?

java - 尝试进行其他 Activity 时,我简单的 “counter app”崩溃了……为什么?