4

我正在开发一个 iOS 应用程序,我试图用它UIWebView来显示各种网站。最近我完成了将 Javascript 注入UIWebView到捕获window.openwindow.closewindow.opener.focus. 简而言之,为此,我注入了覆盖上述 JS 函数的 JS,其中包括iframe使用我可以在应用程序方法中捕获的特定方案创建一个webView:shouldStartLoadWithRequest:navigationType。现在一切正常,包括window.open创建一个新的UIWebView而不是在同一个窗口中加载。

但是现在,问题出现了,窗口之间的 JS 通信没有可行的解决方案。如果子窗口尝试调用window.openeror window.parent,它总是返回一个空值,因此,它无法与原始 Web 视图进行通信。

为了了解哪些 iOS 浏览器能够有效地执行窗口到窗口的通信,我发现在我的 iPhone 上的 9 个浏览器中,只有 Safari 能够成功地有效地执行这种通信。这让我相信有些东西UIWebView阻止了完整的 JS 窗口到窗口的通信。

有没有人成功让 UIWebView 与所有 JS 逻辑完全集成,即窗口到窗口的通信?或者有证据证明 JS 窗口到窗口的通信是不可能的?任何方向或建议表示赞赏。谢谢!

4

2 回答 2

1

找到了可能的解决方案。

将 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 中触发测试函数!

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

于 2013-12-18T16:23:05.653 回答
0

斯威夫特版本

    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")
于 2016-06-01T18:53:15.653 回答