【问题标题】:Links opening in new window or tab is not loaded in native iOS在本机 iOS 中未加载在新窗口或选项卡中打开的链接
【发布时间】:2018-04-18 14:43:17
【问题描述】:

我的应用程序中有一个 WKWebView,点击它时 WKWebView 中有一些按钮,没有加载新页面。从表面上看,他们正试图打开一个 about_blank 页面。在浏览器中,链接在新页面中打开并加载 URL。

【问题讨论】:

    标签: ios swift wkwebview


    【解决方案1】:

    执行此操作的方法是实现WKUIDelegate 并覆盖此方法

    func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView?
    

    如果您使用传递的配置返回一个新的WKWebView,请求将被加载到一个新的webview。由于target=_blank 尝试在浏览器中打开一个新窗口,因此此方法在 iOS 中进行了补偿。您可以使用这个新的WKWebView 启动一个新的UIViewController,其中请求target=_blank 页面。

    这是一个简单的例子,我用新的 webView 替换主 WKWebView,并在同一个视图控制器中加载请求,

    extension ViewController: WKNavigationDelegate, WKUIDelegate {
    
        public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
            let newWebView = WKWebView(frame: self.webView.frame,
                             configuration: configuration)
            view.addSubview(newWebView)
            return newWebView
        }
    }
    

    这在某种程度上就像浏览器中的标签一样。但是,请记住,通过上述更改,前进和后退不起作用,因为您已经创建了一个新的 web 视图。如果你希望一切正常,我建议你用这个 webview 加载一个新的 viewcontroller 或者创建一个新的 view 来加载和显示它,你可以切换到其他主 webview。

    【讨论】:

    【解决方案2】:

    我采用了这种方法,即使这种方法在设备 safari 浏览器中打开 URL,无论如何这些链接都指向外部链接,这种方法有帮助

    func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void) {
    if navigationAction.targetFrame == nil {
        if let url = navigationAction.request.url {
            let app = UIApplication.shared
            if app.canOpenURL(url) {
                app.open(url, options: [:], completionHandler: nil)
            }
        }
    }
    decisionHandler(.allow)
    }
    

    【讨论】:

      【解决方案3】:

      快速解决方案

      public func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
              
              if navigationAction.targetFrame == nil {
                  self.webView.load(navigationAction.request)
                  }
              return nil
          }
      

      你需要委托 WKUIDelegate

      【讨论】:

        猜你喜欢
        • 2013-03-11
        • 2010-09-12
        • 2013-03-22
        • 2012-01-22
        • 2019-08-23
        • 2014-02-02
        相关资源
        最近更新 更多