2

我正在听这个委托方法UIWebView

- (void)webViewDidFinishLoad:(UIWebView *)aWebView

在其上,我使用了一些 javascript

[aWebView stringByEvaluatingJavaScriptFromString:myscript];

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

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

感谢您的任何建议。

4

2 回答 2

0

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

document.getElementsByTagName('iframe')[0].contentWindow

目的。或者,如果您没有引用 UIWebView 中的第一个 iframe,请使用另一个选择器来引用您尝试引用的 iframe。

于 2013-10-24T23:12:11.613 回答
0

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

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

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

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

于 2019-10-17T03:54:18.100 回答