2012-12-18 53 views
4

我正在尝试使用UIWebView来显示各种网站的iOS应用程序。最近我完成了将Javascript注入到UIWebView的逻辑,以捕获window.open,window.closewindow.opener.focus的实例。简而言之,我注入的JS覆盖了前面提到的JS函数,其中包括使用特定的方案创建iframe,我可以在应用程序的webView:shouldStartLoadWithRequest:navigationType方法中使用它。目前这一切都正常,包括window.open创建新的UIWebView,而不是在同一个窗口中加载。UIWebView Javascript窗口到窗口通信

现在,问题出现在没有可行的解决方案之间的JS通信窗口。如果子窗口试图呼叫window.openerwindow.parent,它总是返回一个空值,因此它不能传回原始网络视图。

为了了解iOS浏览器能够有效地执行窗口间通信,我发现在iPhone上的9个浏览器中,只有Safari能够成功地有效地执行此通信。这导致我相信,有一些与UIWebView,防止完整的JS窗口到窗口通信成为可能。

有没有人获得UIWebView与所有JS逻辑,即窗口到窗口通信完全集成的任何成功?或者有证据证明JS窗口间的通信是不可能的?任何方向或建议表示赞赏。谢谢!

+0

同样的问题。运气好的话? – drogon

+0

不幸的是,不幸的是。我所能做的只是简单的JS注入来覆盖窗口方法(如上所述)。在我的情况下,核心问题源自加载到UIWebview的网站中的Facebook身份验证,用户在验证后会被卡住,因为没有窗口到窗口的通信。最后,我不得不改变加载到WebView的网站中的逻辑(我恰好有能力控制它),直接使用FB重定向,而不是使用具有弹出窗口的普通身份验证流程。 –

回答

1

找到可能的解决方案。

添加JavaScriptCore.framework以链接的框架并在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只

+0

为什么你说这只适用于IOS 7?我试图在IOS 9中实现这一点!任何想法? – Daniel

+0

iOS 7是当时最新的一款:) – IvovDry

0

斯威夫特版本

import JavaScriptCore 

    let jsContextA = webA.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext") 
    let jsContextB = webB.valueForKeyPath("documentView.webView.mainFrame.javaScriptContext")   

    //Original objc code : jsContextB[@"window"][@"opener"] = jsContextA[@"window"]; 
    jsContextB!.setObject("opener", forKeyedSubscript: "window") 
    jsContextB!.setObject(jsContextA!.objectForKeyedSubscript("window"), forKeyedSubscript: "opener")