在 iOS 中使用带有嵌入式 youtube iframe 的共享功能

Using share functionality with embedded youtube iframe in iOS

如标​​题所述,我在 iOS 上遇到了嵌入式 youtube iframe-player 的一些问题。但首先要介绍一下我的问题的背景。我有一组 HTML 文件,它们存储在设备上并加载到 WKWebView 中。这些文件仅包含简单的文本,有时还包含使用 iframe 语法嵌入的 youtube 视频。

<iframe width="100%" height="100%" id="playerId" type="text/html" src="https://www.youtube.com/embed/XXXXXXXX?enablejsapi=0&rel=0&playsinline=0&autoplay=0" frameborder="0">

播放、声音、进入全屏....一切正常。除了 youtube 播放器的信息部分(右上角的箭头)之外的所有内容。当我按下箭头时,屏幕打开,但选择 url 或其中一个共享选项没有任何效果,只会破坏嵌入的视频。我仍然可以关闭信息部分,但缩略图会消失,并且在我重新加载 HTML-文档之前不会播放。

现在我的猜测是 WKWebView 沙箱中的安全设置阻止我加载任何嵌入式 link。我想我记得 WebView 不允许 links 在 iframe 中使用 _blank 目标,但我不确定。无论如何都无法更改。

感谢任何提示,

维克多

好的,

我已经设法自己解决了问题(至少部分解决了)。我查看了 WKWebView 及其代表的 header,发现一条评论提到了使用 _blank 目标打开 links 时 WebViews 的行为。由于 WebView 无法打开新的 window(这就是空白强制执行的内容),它将调用其 UIDelegate 来请求新的 WKWebView 实例以打开 "new window" link(另请参见 https://developer.apple.com/reference/webkit/wkuidelegate/1536907-webview).

我现在所做的是实现委托,检查 navigationActions targetFrame 是否为 nil(这意味着它指向一个新的 Window)并改为在 Safari 中打开 link。不幸的是,这种 link 处理总是会破坏播放器,因此我还必须触发我的嵌入式 web-content 的重新加载,以便 "reset" 播放器回到其初始状态。返回App后继续播放有点遗憾,但总比完全不能播放好。

func webView(webView: WKWebView, createWebViewWithConfiguration configuration: WKWebViewConfiguration, forNavigationAction navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {

    if navigationAction.targetFrame == nil { 

        guard let requestURL = navigationAction.request.URL
            else { return nil }

        UIApplication.sharedApplication().openURL(requestURL)
        webView.reload()
    }

    return nil
}