如何在 UIWebView 加载的 iframe 中注入 javascript - iOS
Posted
技术标签:
【中文标题】如何在 UIWebView 加载的 iframe 中注入 javascript - iOS【英文标题】:How to Inject javascript in an iframe loaded by UIWebView - iOS 【发布时间】:2013-08-07 18:38:58 【问题描述】:我正在UIWebView
上收听这个委托方法:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
在其上,我使用
应用了一些 javascript[aWebView stringByEvaluatingJavaScriptFromString:myscript];
虽然委托方法适合监听 iframe 请求的结束,但我的 js 似乎不适用于 iframe。它适用于uiwebview的主文档。
有没有办法做到这一点:如何在 ios UIWebView
对象的 iframe 上注入 js?
感谢您的建议。
【问题讨论】:
【参考方案1】:问题出在您的 JS 中。你可以在你的 iframe 对象上运行操作就好了,在你的问题的“myscript”中,你需要在
上运行你的 JS 命令document.getElementsByTagName('iframe')[0].contentWindow
对象。或者,如果您没有引用 UIWebView 中的第一个 iframe,请使用另一个选择器来引用您尝试引用的 iframe。
【讨论】:
由于跨域安全限制而无法访问的 iframe 怎么样?【参考方案2】:除非有一些我不知道的iOS API,否则你只能通过调用stringByEvaluatingJavaScriptFromString:myscript
在顶层文档的上下文中执行Javascript。
幸运的是,自 2013 年以来(写最后一个答案时),我们现在有了 window.PostMessage 和 crypto.subtle.generateKeys,它们允许您在 iframe 中生成不可提取的密钥,并使用 addScriptMessageHandler 将公钥传递给 iOS .每个 iframe 都应该收到一个唯一的 id,并通过window.location.hash
或postMessage
告知它是什么。它应该将此 id 连同本机调用的唯一索引/键和用于编码内容的公钥一起发送到本机代码。 (本机代码还可以检查消息上的iframeInfo
,以确保请求来自正确的域。)最后,本机代码可以在WebView 上调用stringByEvaluatingJavaScriptFromString:myscript
,并传递有效负载使用公钥加密,连同 iframe 的 id 和所有的索引/密钥,使用postMessage
到 iframe。 iframe 将对其进行解码,并调用适当的回调。您可以使用 iframe 以这种方式实现一个完整的类似 Cordova 的桥接器!
请注意,***文档的作者已选择呈现您的 iframe,因此没有动机干扰消息的传递。但是,必须对消息进行加密,因为他们可能有很强的窃取信息的动机!
PS:如果您担心量子计算机会破坏密码学,那么您可能必须使用对称密钥而不是公钥-私钥对,或者只是不将公钥与有效负载一起发送 :)
【讨论】:
以上是关于如何在 UIWebView 加载的 iframe 中注入 javascript - iOS的主要内容,如果未能解决你的问题,请参考以下文章
iOS - UIWebView 加载 HTML 字符串包含 iframe 不起作用
必须在 UIWebview 的 iframe 中使用 Google Maps Embed API
如何将iframe视频缩放到更小的尺寸以适应iOS中的UIWebView框架?
uiwebview 如何获得访问令牌以喜欢 facebookpage(通过 iFrame)?
UIWebView -stringByEvaluatingJavaScriptFromString:在 iFrame 内容中填充文本框?