我正在UIWebView
上听取此委托方法:
- (void)webViewDidFinishLoad:(UIWebView *)aWebView
在其中,我使用
应用一些javascript[aWebView stringByEvaluatingJavaScriptFromString:myscript];
虽然委托方法适合听取iframe请求的结尾,但似乎我的js不适用于iframe。它适用于uiwebview的主文档。
有没有办法做到这一点:我如何在iOS UIWebView
对象上的iframe上注入js?
感谢您的任何建议。
答案 0 :(得分:0)
问题在于你的JS。您可以在iframe对象上运行操作就好了,在您的问题的“myscript”中,您需要在
上运行JS命令document.getElementsByTagName('iframe')[0].contentWindow
对象。或者,如果您没有在UIWebView中引用第一个iframe,请使用其他选择器来引用您尝试引用的iframe。
答案 1 :(得分:0)
除非有一些我不知道的iOS API,否则您只能通过调用stringByEvaluatingJavaScriptFromString:myscript
在顶级文档的上下文中执行Javascript。
幸运的是,自2013年以来(写出最后一个答案时),我们现在有了window.PostMessage和crypto.subtle.generateKeys,可让您在iframe中生成不可提取的密钥,并将公钥传递给iOS使用addScriptMessageHandler。每个iframe都应该接收一个唯一的ID,并可以通过window.location.hash
或postMessage
来告知它是什么。它应该将此ID以及本地调用的唯一索引/密钥以及用于编码内容的公共密钥发送到本地代码。 (本机代码还可以检查邮件上的iframeInfo
,以确保请求来自正确的域。)最后,本机代码可以在WebView上调用stringByEvaluatingJavaScriptFromString:myscript
,并传递使用postMessage
将使用公钥加密的有效负载连同iframe的ID和所有索引/密钥一起发送到iframe。 iframe将对其进行解码,然后调用相应的回调。您可以使用iframe以这种方式实现完整的类似于Cordova的桥!
请注意,顶级文档的作者已选择呈现您的iframe,因此没有动机去干扰邮件的传递。但是,必须对消息进行加密,因为它们可能会强烈地窃取信息!
PS:如果您担心量子计算机会破坏密码,那么您可能必须使用对称密钥而不是公私钥对,或者只是不将公钥与有效载荷一起发送:)