Window.open() не работает в WKWebView
Я пытаюсь открыть URL-адрес в браузере Safari, щелкая его из iOS-приложения WKWebView, но когда я вызываю window.open() из javascript, который не имеет никакого эффекта.
Это не соответствует политике принятия решений в WKWebView,
[Foundation.Export("webViewecidePolicyForNavigationActionecisionHandler:")]
public void DecidePolicy(WKWebView webView, WKNavigationAction navigationAction, Action<WKNavigationActionPolicy> decisionHandler)
Я попытался переопределить метод WKUIDelegate, но он не работает.:(
Кто-нибудь может мне помочь?
3 ответа
Примечание. У меня нет опыта работы с 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
}
С методом
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)
{
}
Здесь https://developer.apple.com/forums/thread/664267 совет установить
WKPreferences.javaScriptCanOpenWindowsAutomatically = true
Но это не работает. iOS — это боль. Все, что работает на Android, проблематично на iOS. Android WebView не имеет проблем с window.open(). Нам нужно было открыть ссылку с PDF, и ссылка создается динамически. Нам пришлось заменить элемент «кнопка» с onclick="window.open(...)" на элемент "a" с target=_blank и динамическим href=...