Window.open () не работает в WKWebView - PullRequest
0 голосов
/ 28 мая 2018

Я пытаюсь открыть URL-адрес в браузере Safari, щелкая его из iOS-приложения WKWebView, но когда я вызываю window.open () из javascript, который не имеет никаких эффектов.

Это не влияет на политику принятия решений вWKWebView,

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

Я попытался переопределить метод WKUIDelegate, но он не работает.: (

Кто-нибудь может мне помочь?

Ответы [ 2 ]

0 голосов
/ 29 мая 2018

Примечание. У меня нет опыта работы с xamarin, но я знаю, как «window.open ()» js работает в WKWebView с собственным кодом, поэтому я надеюсь, что этот ответ поможет вам соединить недостающие точки.

Сначалаустановите UIDelegate, где вы настраиваете свое веб-представление .. (в вашем случае - viewDidLoad)

webView.uiDelegate = self

Во-вторых, реализуйте этот метод протокола UIDelegate.Идея состоит в том, чтобы создать веб-представление «на лету» и контроллер представления «на лету» и представить / отправить его, а затем вернуть этот экземпляр веб-представления в WebKit, чтобы он мог установить связь с родительским веб-представлением и загрузить URL-адрес (первый параметр окна.открытый звонок).

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
}
0 голосов
/ 29 мая 2018
  • Поскольку метод 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)
{
}
...