2012-12-18 87 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")