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

Posted

技术标签:

【中文标题】YouTube 嵌入式播放器在 iOS 8 上因 gpus_ReturnNotPermittedKillClient 而崩溃【英文标题】:YouTube embedded player crashed with gpus_ReturnNotPermittedKillClient on iOS 8 【发布时间】:2015-06-26 20:23:29 【问题描述】:

我使用加载 YouTube iFrame 播放器的 UIWebView 制作了一个 ios 应用。 一切都很顺利,它甚至可以继续在后台播放视频,但只有一个问题。

此问题仅在本月出现,不仅在最新更新(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

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

我已经用谷歌搜索了整整一个星期来解决这个问题,但没有任何运气,有人知道如何处理它吗?

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

【问题讨论】:

【参考方案1】:

好的,我仍然没有解决这个问题的有效解决方案,但我只是想出了一个解决方法。

只要您不调用 YTPlayer.loadVideoById(或 cueVideoById、loadVideoByUrl、cueVideoByUrl、loadPlaylist、cuePlaylist),YouTube iFrame 播放器似乎就不会创建 WebGL 渲染上下文。所以我只需加载播放列表中的所有视频每当播放列表更改时加载播放列表。

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

【讨论】:

我也遇到了这个问题,但是没有找到解决办法。您如何“在播放列表更改时使用 loadPlaylist 加载我的播放列表中的所有视频”?你能在这里发布一些代码sn-ps吗? 我遇到了同样的问题,但我认为我已经修复了它..您是否尝试过清单 3:developer.apple.com/library/ios/qa/qa1668/_index.html? @RaduMatei 我按照@Jim 的清单3,在applicationDidEnterBackground 中调用removeWebView。调用 loadWithVideoId: 在 applicationDidBecomeActive 等等,根本没有删除 UIWebViews,毕竟,这就是保持它的重点。唯一要做的就是在UIWebView的子视图中找到AVPlayerLayer,并从中移除AVPlayer。 有人可以发布他们如何完成此操作的代码吗?我还是很困惑。 @ChezHung

以上是关于YouTube 嵌入式播放器在 iOS 8 上因 gpus_ReturnNotPermittedKillClient 而崩溃的主要内容,如果未能解决你的问题,请参考以下文章

测量在 iOS 中内联播放的嵌入式 YouTube 视频的音频电平

ionic 嵌入式 youtube 视频停止在 iOS 上播放

Iframe 中的 YouTube 嵌入播放器在 iOS6 中不起作用

强制 iOS iPhone youtube 嵌入播放器退出全屏

来自 YouTube 的嵌入式 360 度视频无法在 iOS 浏览器上正确播放

嵌入的 YouTube 视频无法在 iPad (iOS 7) 上播放,而 HTML5 搜索输入可见