5

在尝试在 iOS 8 键盘扩展中使用 SpriteKit 时,我遇到了许多崩溃,这些崩溃仅在使用物理设备且未连接到调试器时发生。

如果调试器连接到设备,或者如果在 SIM 中运行,一切都很好。

当没有附加调试器时,我相信扩展的生命周期会略有不同,并且有时键盘扩展会在后台运行,从而导致 OpenGL 崩溃。

苹果技术说明中描述了我们遇到的崩溃。它在 gpus_ReturnNotPermittedKillClient 函数中,Apple 声明它的发生是因为您无法在后台运行 OpenGL,并建议使用 App Delegate 回调来暂停您的 OpenGL 活动。

由于这是一个键盘扩展,因此没有应用程序委托。相反,我们尝试注册应用程序委托生命周期通知:不走运 - 它们不会触发。所以我们尝试使用视图控制器生命周期回调,它仍然不能解决问题。

当这个崩溃发生时,我们是活跃的键盘,并且只是围绕 SpriteKit/SKView 和 UIImage 操作做很多事情,没有明显的理由为什么我们会被后台处理,但是这个崩溃发生了。如果我们确实获得了背景知识,似乎确实会发生同样的崩溃。

最终,我试图弄清楚如何知道我们正在后台运行,并且我们需要暂停 OpenGL。

这是完整的堆栈:

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Subtype: KERN_INVALID_ADDRESS at 0x0000000000000001
Triggered by Thread:  0

Thread 0 name:  Dispatch queue: com.apple.spritekit.renderQueue
Thread 0 Crashed:
0   libGPUSupportMercury.dylib      0x000000018e89a18c gpus_ReturnNotPermittedKillClient + 12
1   libGPUSupportMercury.dylib      0x000000018e89b124 gpusSubmitDataBuffers + 160
2   GLEngine                        0x0000000189a10260 gliPresentViewES_Exec + 192
3   GLEngine                        0x0000000189a10164 gliPresentViewES + 80
4   OpenGLES                        0x0000000189a1fc7c -[EAGLContext presentRenderbuffer:] + 68
5   SpriteKit                       0x000000018a51c4a4 -[SKView _renderContent] + 1028
6   libdispatch.dylib               0x0000000196c8d368 _dispatch_client_callout + 12
7   libdispatch.dylib               0x0000000196c966e4 _dispatch_barrier_sync_f_invoke + 72
8   SpriteKit                       0x000000018a51c060 -[SKView renderContent] + 88
9   SpriteKit                       0x000000018a519034 __29-[SKView setUpRenderCallback]_block_invoke + 60
10  SpriteKit                       0x000000018a545fd4 -[SKDisplayLink _callbackForNextFrame:] + 268
11  QuartzCore                      0x000000018a04d27c CA::Display::DisplayLinkItem::dispatch() + 28
12  QuartzCore                      0x000000018a04d114 CA::Display::DisplayLink::dispatch_items(unsigned long long, unsigned long long, unsigned long long) + 320
13  IOKit                           0x00000001870458cc IODispatchCalloutFromCFMessage + 372
14  CoreFoundation                  0x0000000185e995e0 __CFMachPortPerform + 176
15  CoreFoundation                  0x0000000185eae1fc __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 52
16  CoreFoundation                  0x0000000185eae15c __CFRunLoopDoSource1 + 432
17  CoreFoundation                  0x0000000185eac0dc __CFRunLoopRun + 1636
18  CoreFoundation                  0x0000000185dd90a0 CFRunLoopRunSpecific + 392
19  GraphicsServices                0x000000018ef7b5a0 GSEventRunModal + 164
20  UIKit                           0x000000018a70e3bc UIApplicationMain + 1484
21  libxpc.dylib                    0x0000000196e9c268 _xpc_objc_main + 764
22  libxpc.dylib                    0x0000000196e9df50 xpc_main + 196
23  Foundation                      0x0000000186eafc7c -[NSXPCListener resume] + 180
24  PlugInKit                       0x0000000190e8a90c -[PKService run] + 596
25  PlugInKit                       0x0000000190e8a544 +[PKService main] + 60
26  PlugInKit                       0x0000000190e8a934 +[PKService _defaultRun:arguments:] + 20
27  libextension.dylib              0x0000000195eacd88 NSExtensionMain + 64
28  libdyld.dylib                   0x0000000196cb6a04 start + 0
4

0 回答 0