使用iOS WKWebView弹出窗口时从弹出窗口调用打开功能

问题描述

我最近将基于iOS WebView的应用程序的UIWebView更改为WKWebView

WebView的javascript中有一个window.open函数,并且弹出窗口调用了opener(parent)的函数,如下所示:

// In parent window's javascript
window.open('popup' .....)

function doIt(){
}


// In popup window's javascript
window.opener.doIt()

在UIWebView中,我使用jscontext,以便弹出窗口可以调用opener的javascript函数

// Legacy code for communication between 2 UIWebView windows
// Not works when using WKWebView
jscontext *parentCtx = [parentWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
jscontext *childCtx = [popupWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
childCtx[@"window"][@"opener"] = parentCtx[@"window"];

但是,似乎jscontext在使用WKWebView时不可用。在这种情况下,如何在javascript上下文中链接两个Webview? 在不更改旧版javascript代码的情况下,我该怎么做才能调用opener函数

谢谢。

解决方法

真是个错误!

func webView(_ webView: WKWebView,createWebViewWith configuration: WKWebViewConfiguration,for navigationAction: WKNavigationAction,windowFeatures: WKWindowFeatures) -> WKWebView?中实例化弹出式Webview时,我创建了一个Webview,添加为subView并返回nil 。这就是window.opener在javascript中为空的原因。

因此,方法和解决方案与this post完全相同。

如果在WKUIDelegate创建Webview期间返回适当的WebView,则无需为window.opener通信设置JSContext。