2017-10-07 11 views
1

私のiOSアプリケーションでは、私たちのすべてのJavaScriptを再利用できるように私たちのWebアプリケーションで2つのタブ/ウィンドウの親子関係をシミュレートする2つのWKWebViewコントロールがあります。問題は、これらの間に汎用通信チャネルがないことです。WKWebViewソースからのjavascripts関数へのアクセス

Webアーキテクチャ
- 最初/マスターウィンドウは、第二/子ウィンドウで開くリンクを社内のjavascript機能をロードします。
- 2番目または3番目のウィンドウには、サードパーティのWebコンテンツが読み込まれます。
- サードパーティのコンテンツは、javacriptフォームソースウィンドウ(window.opener/window.parent APIブリッジを使用)を使用してGoogleシステムと通信します。

-

は今、 ネイティブアプリで、これは私が既存のJavaScriptを再利用し、ウェブarchtectureをシミュレートするためにやっているものです。

window.open("http://localhost/child.html", "myWindow", "width=200,height=100"); 

B - 第一WKWebViewでWebページからjsの呼び出しの下に。

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { 
    // Here, window.open js calls are handled by loading the request in another/new web view 
    UIStoryboard *mainStoryboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil]; 
    WebViewController *webViewController = [mainStoryboard instantiateViewControllerWithIdentifier:@"WebViewController"]; 
    webViewController.loadURLString = navigationAction.request.URL.absoluteString; 

    // Show controller without interfering the current flow of API call, thus dispatch after a fraction of second 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self.navigationController pushViewController:webViewController animated:YES]; 
    }); 
    return nil; 
} 

C - WKUIDelegateインターセプトこの呼び出しは、(a)および2 WKWebViewにを開きます。 Web /コンピュータブラウザでは、Webアプリケーションの子ウィンドウは、window.openerwindow.parent

を使用して、ソースjs関数にアクセスできますWKWebViewで同じ機能を実現するにはどうすればよいですか?つまり、2番目のWKWebViewのjs関数は、親/ソースWKWebViewからjs関数を呼び出すことができますか?

答えて

1

webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:から返信しないでください。WKWebViewのインスタンスです。

残念ながら、私はこれを現在確認する方法がありません。しかし、私が覚えているところでは、WKWebViewConfigurationの引数をwebView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:代理メソッドから無視しないで、この引数をinitWithFrame:configuration:パラメータの1つとして渡して、もう1つのWKWebViewインスタンスを作成することも覚えています。

また、アップルのマニュアルによれば、正しいWebビューインスタンスを返す場合は、自分でリクエストを読み込む必要はありません。 WebKitはこれをあなたのために処理する必要があります。

全体的に、あなたのコードは、のようになります。

- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures { 
    WKWebView *childWebView = [[WKWebView alloc] initWithFrame:CGFrameZero configuration:configuration]; 
    WebViewController *webViewController = [[WebViewController alloc] initWithWebView: childWebView]; 

    // looks like this is no longer required, but I can't check it now :(
    // [childWebView loadRequest:navigationAction.request]; 

    // Show controller without interfering the current flow of API call, thus dispatch after a fraction of second 
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.1 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ 
     [self.navigationController pushViewController:webViewController animated:YES]; 
    }); 
    return childWebView; 
} 
+0

これは有望な答えのようです。興奮した。今日はそれを撃つだろう。 – Ashok

0

あなたのタスクを達成するためのより簡単な方法は、1つのWKWebViewを持ち、HTMLを使用してヘッダーと詳細を分離することです。最も簡単な解決策は、ヘッダーとすべての詳細を含む1つのHTML文書を持つことですが、動的に詳細を追加する必要がある場合は、DOMを使用することもできます。ヘッダーとディテールの両方にJavascriptを再利用することは、この方法で最も簡単になります。

+0

我々は我々のアプリでこの機能のためのWebアプリケーションのアーキテクチャを再利用できるように、実際には、2つの別々のWKWebViewsでデータを開くことは前提条件です。また、ユーザーの観点から見ると、Webアプリとネイティブアプリで同じ経験を提供します。 – Ashok

関連する問題