在Safari中打开Swift 3 UIWebView(来自视频的YouTube徽标/水印超链接)

时间:2017-02-28 19:02:05

标签: ios swift youtube uiwebview

使用Swift 3和UIWebView如何强制通过网页IFrame播放的YouTube视频中显示的YouTube徽标/水印“超链接”在Safari中打开?

我正在使用UIWebView(暂时无法转换到WKWebView。)来显示在IFrame中播放YouTube视频的网页。

按照https://developers.google.com/youtube/player_parameters?csw=1#modestbranding上的“YouTube嵌入式播放器和播放器参数”说明操作。我可以使用showinfo = 0从视频顶部删除标题和分享按钮。这只会留下YouTube徽标/水印。

当您点击YouTube徽标/水印时,它会在我的应用内打开YouTube,这对用户导航体验不利。

如果用户点击了YouTube徽标/水印,我需要在Safari中打开此链接。我尝试使用下面显示的代码但没有成功。该代码适用于UIWebView中的每个其他链接,但不适用于实际视频中嵌入的YouTube徽标/水印超链接。

// ViewController.swift

导入UIKit

类ViewController:UIViewController,UIWebViewDelegate {

@IBOutlet var webView: UIWebView!
override func viewDidLoad() {
    super.viewDidLoad()
    webView.delegate = self
    if let url = URL(string: "http://www.example.com") {
        let request = URLRequest(url: url)
        webView.loadRequest(request)
    }
}


//Force all links to open in Safari.
func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if let url = request.url, navigationType == UIWebViewNavigationType.linkClicked {
        UIApplication.shared.openURL(url)
        return false
   }
    return true
}}

我能够使用WebView link click open default browser中的示例在我的应用的Android版本中实现此目的。

我花了一个星期的时间试图解决这个问题,以免浪费任何时间来解决已经回答过的问题。 任何帮助解决这个问题将不胜感激。谢谢!

2 个答案:

答案 0 :(得分:0)

我正在寻找完全相同的解决方案,我想知道是否有人可以帮助解决这个问题

我尝试使用以下代码段

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if navigationType == UIWebViewNavigationType.linkClicked {
        guard let abURL = request.url else { return true }
        let abRequest = URLRequest(url: abURL)
        print(abURL)
        print(abRequest)
        if abURL.absoluteString.range(of: "youtube") != nil {
            // Open links in Safari
            if #available(iOS 10.0, *) {
                UIApplication.shared.open(abURL, options: [:], completionHandler: nil)
            } else {
                UIApplication.shared.openURL(abURL)
            }
        } else {
            // Open links in Webview
            webView.loadRequest(abRequest)
        }
        return false
    }
    return true
}

在第5/6行,如果点击链接,我打印网址,当我点击视频内部的Youtube水印(包含在iframe中)时,我没有得到该网址的打印,所以我的猜测就是那个swift不“知道”点击链接。所有其他链接正在工作并打印网址。

我还添加了一个iframe,其中只包含指向youtube的链接

<a href="https://youtube.com">Youtube Link</a>

并且此链接有效,我可以打印网址并在safari中打开,因此问题必须是youtube嵌入容器内的链接

答案 1 :(得分:0)

尝试UIWebViewNavigationType.other来捕获由linkClicked插入的youtube.com/watch网址:

func webView(_ webView: UIWebView, shouldStartLoadWith request: URLRequest, navigationType: UIWebViewNavigationType) -> Bool {
    if let url = request.url, navigationType == UIWebViewNavigationType.other {

        // catch "youtube.com/watch" and let safari to open link

        return false
   }
    return true
}}