加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

UIWebView Javascript窗口到窗口通信

发布时间:2020-12-14 17:22:16 所属栏目:百科 来源:网络整理
导读:我正在开发一个iOS应用程序,我正在尝试使用UIWebView来显示各种网站.最近我完成了将 Javascript注入UIWebView以捕获window.open,window.close和window.opener.focus实例的逻辑.简而言之,为此,我注入了JS,它覆盖了前面提到的JS函数,其中包括使用特定方案创建
我正在开发一个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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读