如何在UIWebView-iOS加载的iframe中注入javascript

时间:2013-08-07 18:38:59

标签: javascript ios iframe uiwebview

我正在UIWebView上听取此委托方法:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView

在其中,我使用

应用一些javascript
[aWebView stringByEvaluatingJavaScriptFromString:myscript];

虽然委托方法适合听取iframe请求的结尾,但似乎我的js不适用于iframe。它适用于uiwebview的主文档。

有没有办法做到这一点:我如何在iOS UIWebView对象上的iframe上注入js?

感谢您的任何建议。

2 个答案:

答案 0 :(得分:0)

问题在于你的JS。您可以在iframe对象上运行操作就好了,在您的问题的“myscript”中,您需要在

上运行JS命令
document.getElementsByTagName('iframe')[0].contentWindow

对象。或者,如果您没有在UIWebView中引用第一个iframe,请使用其他选择器来引用您尝试引用的iframe。

答案 1 :(得分:0)

除非有一些我不知道的iOS API,否则您只能通过调用stringByEvaluatingJavaScriptFromString:myscript在顶级文档的上下文中执行Javascript。

幸运的是,自2013年以来(写出最后一个答案时),我们现在有了window.PostMessagecrypto.subtle.generateKeys,可让您在iframe中生成不可提取的密钥,并将公钥传递给iOS使用addScriptMessageHandler。每个iframe都应该接收一个唯一的ID,并可以通过window.location.hashpostMessage来告知它是什么。它应该将此ID以及本地调用的唯一索引/密钥以及用于编码内容的公共密钥发送到本地代码。 (本机代码还可以检查邮件上的iframeInfo,以确保请求来自正确的域。)最后,本机代码可以在WebView上调用stringByEvaluatingJavaScriptFromString:myscript,并传递使用postMessage将使用公钥加密的有效负载连同iframe的ID和所有索引/密钥一起发送到iframe。 iframe将对其进行解码,然后调用相应的回调。您可以使用iframe以这种方式实现完整的类似于Cordova的桥!

请注意,顶级文档的作者已选择呈现您的iframe,因此没有动机去干扰邮件的传递。但是,必须对消息进行加密,因为它们可能会强烈地窃取信息!

PS:如果您担心量子计算机会破坏密码,那么您可能必须使用对称密钥而不是公私钥对,或者只是不将公钥与有效载荷一起发送:)