我正在开发一个iOS应用程序,我正在尝试使用UIWebView来显示各种网站.最近我完成了将
Javascript注入UIWebView以捕获window.open,window.close和window.opener.focus实例的逻辑.简而言之,为此,我注入了JS,它覆盖了前面提到的JS函数,其中包括使用特定方案创建一个iframe,我可以在应用程序的webView中捕获:shouldStartLoadWithRequest:navigationType方法.这一切现在都可以正常工作,包括window.open创建一个新的UIWebView而不是在同一个窗口中加载.
现在,问题已出现在Windows之间没有可行的JS通信解决方案.如果子窗口试图调用window.opener或window.parent,它总是返回一个空值,因此,它无法与原始Web视图进行通信.
为了了解哪些iOS浏览器能够有效地执行窗口到窗口的通信,我发现在iPhone上的9个浏览器中,只有Safari才能成功地有效地执行此通信.这让我相信UIWebView会阻止完整的JS窗口到窗口的通信.
有没有人能够让UIWebView与所有JS逻辑完全集成,即窗口到窗口的通信?或者有证据证明JS窗口到窗口的通信是不可能的?任何方向或建议表示赞赏.谢谢!
解决方法
找到可能的解决方
将JavaScriptCore.framework添加到Linked Frameworks和webViewDidFinishLoad中:
jscontext *parentCtx = [self.parentWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; jscontext *childCtx = [self.childWebView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"]; childCtx[@"window"][@"opener"] = parentCtx[@"window"];
现在当你从childWebView调用window.opener.test()时,它将在parentWebView中激活测试函数!
我不确定私有API.仅适用于iOS 7