UIWebView Javascript窗口到窗口通信

我正在尝试使用UIWebView来显示各种网站的iOS应用程序。 最近我完成了将Javascript注入到UIWebView逻辑来捕获window.openwindow.closewindow.opener.focus实例。 简而言之,我注入的JS覆盖了前面提到的JS函数,其中包括创build一个具有特定scheme的iframe ,可以在应用程序的webView:shouldStartLoadWithRequest:navigationType捕获webView:shouldStartLoadWithRequest:navigationType方法。 这一切都工作正常,包括window.open创build一个新的UIWebView而不是在同一个窗口加载。

现在,问题出现在没有可行的解决scheme的Windows之间的JS通信。 如果子窗口试图调用window.openerwindow.parent ,它总是返回一个空值,因此它不能传回原始的Web视图。

为了了解iOS浏览器能够有效地进行窗口间通信,我发现在iPhone上的9个浏览器中,只有Safari能够成功地有效地执行这个通信。 这使我相信有一些与UIWebView ,阻止完整的JS窗口到窗口通信是可能的。

有没有人有得到使UIWebView完全与所有的JS逻辑,即窗口到窗口通信整合? 或者有证据certificateJS窗口间的通信是不可能的? 任何方向或build议表示赞赏。 谢谢!

find可能的解决方

将JavaScriptCore.framework添加到链接框架和webViewDidFinishLoad中:

 JSContext *parentCtx = [self.parentWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; JSContext *childCtx = [self.childWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; childCtx[@"window"][@"opener"] = parentCtx[@"window"]; 

现在当你从childWebView调用window.opener.test()时,它会在parentWebView中触发testing函数!

我不确定私人API。 仅适用于iOS 7

Swift版本

  import JavaScriptCore let jsContextA = webA.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") let jsContextB = webB.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") //Original objc code : jsContextB[@"window"][@"opener"] = jsContextA[@"window"]; jsContextB!.setObject("opener", forKeyedSubscript: "window") jsContextB!.setObject(jsContextA!.objectForKeyedSubscript("window"), forKeyedSubscript: "opener")