【问题标题】:Window.open() is not working in WKWebViewWindow.open() 在 WKWebView 中不起作用
【发布时间】:2018-11-06 15:38:24
【问题描述】:

我试图在 Safari 浏览器中打开一个 URL,同时从应用程序的 iOS WKWebView 中单击它,但是当我从 javascript 调用 window.open() 时没有任何效果。

它没有达到 WKWebView 中的决定策略,

[Foundation.Export("webViewecidePolicyForNavigationActionecisionHandler:")]
public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)

我试图覆盖 WKUIDelegate 方法,但它不起作用。 :(

谁能帮帮我?

【问题讨论】:

    标签: webview xamarin.forms xamarin.ios wkwebview wkuidelegate


    【解决方案1】:
    • 由于方法 DecidePolicy 包含在 IWKNavigationDelegate 中,所以你应该实现它而不是 WKUIDelegate

    • Export里面的方法字符串不完整,应该是[Export("webView:decidePolicyForNavigationAction:decisionHandler:")]

    有两种方法可以实现委托。

    强大的代表:

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        WKWebView webview = new WKWebView(this.View.Bounds,null);
        webview.NavigationDelegate = new MyWKNavigationDelegate();
    }
    
    class MyWKNavigationDelegate : WKNavigationDelegate
    {
        public override void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
        {           
        }
    }
    

    弱代表:

    public override void ViewDidLoad()
    {
        base.ViewDidLoad();
        WKWebView webview = new WKWebView(this.View.Bounds,null);
        webview.WeakNavigationDelegate = this;
    }
    
    [Export("webView:decidePolicyForNavigationAction:decisionHandler:")]
    public  void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction,  Action<WKNavigationActionPolicy> decisionHandler)
    {
    }
    

    【讨论】:

      【解决方案2】:

      注意 - 我没有 xamarin 经验,但我知道 "window.open()" js 如何在 WKWebView 中使用本机代码工作,所以我希望这个答案能帮助您连接缺失的点。

      首先,在您配置 Web 视图的位置设置 UIDelegate ..(在您的情况下为 viewDidLoad)

      webView.uiDelegate = self
      

      其次,实现UIDelegate的这个协议方法。这个想法是动态创建一个 web 视图和一个动态视图控制器,并呈现/推送它并将这个 web 视图实例返回给 WebKit,以便它可以建立与父 web 视图的链接并加载 url(window.xml 的第一个参数)。公开电话)。

      func webView(_ webView: WKWebView, createWebViewWith configuration: WKWebViewConfiguration, for navigationAction: WKNavigationAction, windowFeatures: WKWindowFeatures) -> WKWebView? {
              let childWebView = WKWebView(frame: .zero, configuration: configuration)   // Must use the configuration provided by this method
              let webViewController = ViewController() // create an instance of a new view controller that you want to push or present with a web view
              webViewController.webView = childWebView // provide this new child web view to view controller for layout purpose 
              navigationController?.pushViewController(webViewController, animated: true)
              return childWebView
      }
      

      【讨论】:

        【解决方案3】:

        这里https://developer.apple.com/forums/thread/664267 是设置WKPreferences.javaScriptCanOpenWindowsAutomatically = true 的建议,但它不起作用。 iOS是痛苦的。在 Android 上运行的一切在 iOS 上都是有问题的。 Android WebView 使用 window.open() 没有问题。我们需要用 PDF 打开链接,并且链接是动态创建的。我们必须将带有 onclick="window.open(...)" 的“button”元素更改为带有 target=_blank 和 dynamic href=...的“a”元素。

        【讨论】:

          猜你喜欢
          • 2020-06-27
          • 2012-05-23
          • 2018-05-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多