gpus_ReturnNotPermittedKillClient由于缺少生命周期事件而暂停OpenGL,因此在键盘扩展中使用SpriteKit崩溃

g_p*_*ass 5 keyboard opengl-es ios skview ios-app-extension

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

如果调试器连接到设备,或者如果在SIM卡中运行,一切都很可爱.

当没有连接调试器时,我相信扩展的生命周期略有不同,有时候键盘扩展会背景化,导致OpenGL崩溃.

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

由于这是键盘扩展,因此没有应用程序委托.相反,我们尝试注册app委托生命周期通知:没有运气 - 他们不会开火.所以我们尝试使用viewcontroller生命周期回调,它仍然无法解决问题.

当这次崩溃发生时,我们是活跃的键盘,并且只是围绕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
Run Code Online (Sandbox Code Playgroud)