4

私はUIWebView、さまざまな Web サイトを表示するために使用しようとしている iOS アプリに取り組んでいます。最近、Javascript を に挿入して、、およびUIWebViewのインスタンスをキャッチするロジックを完成させました。つまり、これを行うために、前述の JS 関数をオーバーライドする JS を挿入します。これには、アプリのメソッドでキャッチできる特定のスキームを使用した の作成が含まれます。これは、同じウィンドウにロードするのではなく、新しいウィンドウを作成することを含め、今のところすべて正常に機能しています。window.openwindow.closewindow.opener.focusiframewebView:shouldStartLoadWithRequest:navigationTypewindow.openUIWebView

ただし、ウィンドウ間の JS 通信に実行可能なソリューションがないという問題が発生しています。window.opener子ウィンドウがまたはを呼び出そうとするとwindow.parent、常に null 値が返されるため、元の Web ビューと通信できません。

ウィンドウ間の通信を効果的に実行できる iOS ブラウザーを確認するために、私の iPhone にある 9 つのブラウザーのうち、この通信を効果的に実行できるのは Safari だけであることがわかりました。UIWebViewこれは、完全な JS のウィンドウからウィンドウへの通信が可能になるのを妨げる何かがあると私に信じさせます。

UIWebView をすべての JS ロジック、つまりウィンドウ間の通信と完全に統合することに成功した人はいますか? または、JS のウィンドウからウィンドウへの通信が不可能であるという証拠がありますか? 指示やアドバイスをいただければ幸いです。ありがとう!

4

2 に答える 2

1

可能な解決策が見つかりました。

リンクされたフレームワークと webViewDidFinishLoad に JavaScriptCore.framework を追加します。

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 のみで動作

于 2013-12-18T16:23:05.653 に答える
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")
于 2016-06-01T18:53:15.653 に答える