YouTube嵌入式播放器在iOS 8上与gpus_ReturnNotPermittedKillClient崩溃

Che*_*ung 26 youtube iphone objective-c youtube-api ios

我用UIWebView创建了一个iOS应用程序,它加载了YouTube iFrame播放器.一切顺利,它甚至可以在背景上播放视频,只有一个问题.

此问题仅在本月发生,并且不仅发生在最新更新(iOS 8.3)上,而且发生在iOS 8.1上,因此我认为这与最近对YouTube iFrame API的一些修改有关.

在iOS 8(设备上只有iOS 8,而不是8之前的任何iOS,甚至不是模拟器上),当我将应用程序置于后台时(例如,转到主屏幕,锁定设备),视频正常播放,但是一旦视频完成并且应用程序尝试在应用程序的播放列表中加载下一个视频,应用程序崩溃(实际上似乎iOS强制终止它.)

WebThread上有一个EXC_BAD_ACCESS

libGPUSupportMercury.dylib gpus_ReturnNotPermittedKillClient

崩溃日志中的相关调用堆栈如下:

Thread 6 name:  WebThread
Thread 6 Crashed:
0   libGPUSupportMercury.dylib      0x000000018b829f90 gpus_ReturnNotPermittedKillClient + 12
1   libGPUSupportMercury.dylib      0x000000018b82af3c gpusSubmitDataBuffers + 168
2   WebCore                         0x0000000191620820 WebCore::GraphicsContext3D::reshape(int, int) + 528
3   WebCore                         0x0000000191e93ce0 WebCore::WebGLRenderingContext::initializeNewContext() + 1136
4   WebCore                         0x0000000191e93594 WebCore::WebGLRenderingContext::WebGLRenderingContext(WebCore::HTMLCanvasElement*, WTF::PassRefPtr<WebCore::GraphicsContext3D>, WebCore::GraphicsContext3D::Attributes) + 600
5   WebCore                         0x0000000191e92c54 WebCore::WebGLRenderingContext::create(WebCore::HTMLCanvasElement*, WebCore::WebGLContextAttributes*) + 1144
6   WebCore                         0x000000019132f6ec WebCore::HTMLCanvasElement::getContext(WTF::String const&, WebCore::CanvasContextAttributes*) + 312
Run Code Online (Sandbox Code Playgroud)

简单地说,当我打电话给YTPlayer.loadVideoById(...)时,YouTube API加载视频并尝试创建一个新的WebGL渲染上下文,iOS不允许(不允许在后台模式下使用GL渲染相关指令, )所以它终止了应用程序.

我一直在谷歌上搜索并整整一个星期来处理这个但没有任何运气,有没有人知道如何处理它?

非常感谢您的任何建议和任何帮助!

Che*_*ung 2

好吧,我仍然没有解决这个问题的方法,但我只是找到了解决方法。

看起来 YouTube iFrame 播放器只要不调用 YTPlayer.loadVideoById (或cueVideoById、loadVideoByUrl、cueVideoByUrl、loadPlaylist、cuePlaylist)就不会创建WebGL渲染上下文。因此,每当播放列表已更改。

通过此解决方案,我的应用程序不再崩溃。这很好,但我仍然想知道是否有人对此有真正的解决方案,请让我知道,非常感谢!

  • @RaduMatei 我按照@Jim 的清单3,在applicationDidEnterBackground 中调用removeWebView。在 applicationDidBecomeActive 中调用 loadWithVideoId: (2认同)
  • 有人可以发布他们如何完成此操作的代码吗?我还是很困惑。@ChezHung (2认同)