使用 iOS WKWebView 弹出窗口时从弹出窗口调用开启函数 window

calling opener function from popup while using iOS WKWebView popup window

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

在 WebView 的 javascript 和 popup window 中有一个 window.open 函数,如下所示调用 opener(parent) 的函数

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

function doIt(){
}


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

在 UIWebView 中,我使用了 JSContext,以便弹出 window 可以调用 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 上下文中 link 两个 webview? 我应该怎么做才能在不更改遗留 javascript 代码的情况下调用 opener 的功能?

提前致谢。

大错特错!

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

所以方法和解决方案与完全相同。

如果在 WKUIDelegate 中创建 webview 时 return 适当的 webview,则无需为 window.opener 通信设置 JSContext。