【问题标题】:How to Inject javascript in an iframe loaded by UIWebView - iOS如何在 UIWebView 加载的 iframe 中注入 javascript - iOS
【发布时间】:2013-08-07 18:38:58
【问题描述】:

我正在UIWebView 上收听这个委托方法:

- (void)webViewDidFinishLoad:(UIWebView *)aWebView

在其上,我使用

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

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

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

感谢您的建议。

【问题讨论】:

    标签: javascript ios iframe uiwebview


    【解决方案1】:

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

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

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

    【讨论】:

    • 由于跨域安全限制而无法访问的 iframe 怎么样?
    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多