H5とiOSのネイティブ相互作用

、WKWebView

  WKWebViewの初期化は、コンフィギュレーションと呼ばれるパラメータがある場合、それはパラメータのWKUserContentControllerタイプであり、それはパラメータのWKWebViewConfiguration型であり、WKWebViewConfigurationはuserContentControllerと呼ばれる性質を有しています。

   WKWebViewConfiguration *設定= [[WKWebViewConfiguration ALLOC] INIT]。
    config.preferences = [[WKPreferences ALLOC] INIT]。
    config.preferences.minimumFontSize = 10 
    config.preferences.javaScriptEnabled = YES;
    config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
    config.userContentController = [[WKUserContentController ALLOC] INIT]。
    config.processPool = [[WKProcessPool ALLOC] INIT]。
    config.userContentController = [WKUserContentController 新しい新];
     // wkWebViewを作成する場合、方法はJSに呼ばれるように登録する必要があり、OCは、JSを達成するために、エンドに対応する 
    [config.userContentController addScriptMessageHandler:自己名:"@ callFunciton " ];
    
    WKWebView * wkWebView = [[WKWebView ALLOC] initWithFrame:self.view.frame設定:CONFIG]。
    self.wkWebView = wkWebView。
    wkWebView.navigationDelegate = 自己;
    wkWebView.UIDelegate = 自己;
    NSURLRequest *リクエスト= [[NSURLRequest ALLOC] initWithURL:self.url]。
    [wkWebView loadRequest:要求]。
    [self.viewのaddSubview:wkWebView]。

1.JSコールネイティブMessageHandlerの

WKUserContentControllerオブジェクトは、メソッドを持っています

- (無効)addScriptMessageHandler :( ID <WKScriptMessageHandler>)scriptMessageHandler名:(NSStringの*)名。

JSは、OCを呼び出すと、このコードは非常に重要です

// wkWebViewを作成する場合、方法はOCはJSを達成するために、エンドに対応し、jsのに呼ばれるように登録する必要があります 
[config.userContentController addScriptMessageHandler:自己名:「@ callFunciton  ];

  名前:addScriptMessageHandlerは、2つのパラメータがありますが、最初のパラメータはuserContentControllerプロキシオブジェクトで、2番目のパラメータは、送信JSのpostMessageの目的です。 
だから、MessageHandlerの機能を使用するために、WKScriptMessageHandler合意を実施する必要があります。

WKScriptMessageHandlerプロキシ方式を達成するために1。

  JSはcallFunctionメソッドを呼び出すと、これは、コールバックデリゲートメソッドになります。

- (ボイド)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage * )メッセージ{ 
     場合([message.name isEqualToString:"@ callFunction " ]){ 
         // 调用原生扫码
    }
}

ヒント:addScriptMessageHandlerが簡単にコントローラが解放することができない原因と、循環参照を引き起こします

- (ボイド)のdealloc {
    [self.wkWebView.configuration.userContentController removeScriptMessageHandlerForName:"@ callFunction " ];
}

使用中の2.JS:

window.webkit.messageHandlers。<名前> .postMessage(<するmessagebody> // ここで、<name>は、上記方法は、第2のパラメータ`NAME`です。
// 2番目のパラメータが記入する場合たとえば、私たちは、APIを呼び出す@「callFunctionを」、そしてJSがあります: 
window.webkit.messageHandlers.callFunction.postMessage(<するmessagebody> // <するmessagebody>キーと値のペアがあり、キー体は、パラメータの値が複数のタイプ、ボディタイプを持つことができます:可タイプはのNSNumber、NSStringの、NSDate、NSArrayの、NSDictionaryの、そしてnsnullをしている
、NULLまたは他のパラメータすることができ、何も書かないためにすることができない、またはプロキシ方式を取ることはありませんするmessagebody

2.ネイティブコールJS

[self.webView evaluateJavaScript:@ "ショー()" completionHandler:^(ID _Nullable応答、NSError * _Nullableエラー){                 
  // TODO }]。

3.WKNavigationDelegate

  一部のパラメータは、ネイティブのH5との相互作用もまた、このように単純な接続を通過することができます

- (ボイド)のWebView:(WKWebView *)のWebView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler :( ボイド(^ )(WKNavigationActionPolicy))decisionHandler {     
  NSStringの
* URL = navigationAction.request.URL.absoluteString。 もし(![URL isEqualToString:self.strURL]){
    // 页面跳转 } decisionHandler(WKNavigationActionPolicyAllow)。 }

二、WebViewJavaScriptBridge

WebViewJavaScriptBridge OCとJSの相互作用でWKWebView&のUIWebViewのため。
その基本的な原理は、ブリッジに登録されたOC方法、JSをコールするように、JSブリッジの登録方法を、OCをコールするようにします。

1.初期化

1.インポートヘッダファイル #import <WebViewJavascriptBridge.h>

WebViewJavaScriptBridgeとWebViewの間の2の関係

_jsBridge = [WebViewJavascriptBridge bridgeForWebView:_webView]。

HTMLファイル3.これらの2つのJS関数をコピーして貼り付けます

関数setupWebViewJavascriptBridge(コールバック){
  場合(window.WebViewJavascriptBridge){ 
    リターンコールバック(WebViewJavascriptBridge)。
  }   
場合(window.WVJBCallbacks){
    戻りwindow.WVJBCallbacks.push(コールバック)。
  }   window.WVJBCallbacks
= [コールバック]; // グローバルプロパティWVJBCallbacksアレイを作成し、コールバックは、アレイ内に挿入されます。   document.createElement WVJBIframe = VAR(' IFRAME '); // iframe要素を作成
  WVJBIframe.style.display = ' なしの' ; //は表示されません
  WVJBIframe.src = ' wvjbscheme:// BRIDGE_LOADED__ __を' ; //は、iframeのsrcを設定しますプロパティ   document.documentElement.appendChild(WVJBIframe); // 現在のファイルのナビゲーションにはiframeを追加します。   setTimeout(関数(){
    document.documentElement.removeChild(WVJBIframe)
  }、0 } // この主に登録されているOC JSメソッドが呼び出されます。 setupWebViewJavascriptBridge(関数(ブリッジ){ });

2.注入するOC、JS方法

ブリッジは、OC法に注入しました

/ * ScanClickはOCブロックの別名であります
*ブロック自体、JSは、いくつかの方法をscanClickするために呼び出すとき、コードのブロック
* OC JSの呼び出しによって、この目的のために起因するデータ、データが最後JSからのデータ転送があるので、
*データが終了した後、端部に移行JS端子台responseCallback OC
* / 
[_jsBridge registerHandler:@ " scanClick "ハンドラ:^(識別データ、WVJBResponseCallback responseCallback){
  NSLog("@ dataFrom JSた:%@ " [、データ" @ データ" ])。
  responseCallback(@ " スキャン結果:www.baidu.com " );
}]。

JSは、ブリッジ機能に注入しました

/ *
* EstJavaScriptFunction:エイリアスOC側コールのためのブリッジJS関数に注入されます。
*データ:データコールバック関数、JS関数は、OCによって呼び出され、そのデータは、OC端からのデータ転送であるからです。
* ResponseCallback:JS終了された後に呼び出さOCを呼び出して、データは、端末OCに送信します
* / 
// これは主にOCが呼び出されます登録するJS方法です。
    setupWebViewJavascriptBridge(関数(ブリッジ){
         // JS OCは、メソッドの宣言を呼び出す必要がある。 
        bridge.registerHanlder(' testJavaScriptFunction ' 、関数(データ、responseCallback){
             // データがデータOCを介して転送される。
             // responseCallback JSコールが完了した後OCに渡されたデータ 
            のアラート(JSのOCと呼ばれます。);
            responseCallback({データ:" JSデータ"から:" JS " })。
        })
    });

3.コールOC、JS方法

JSを呼び出しOC

// シンプルなコールJSFunction、JSは、戻り値がのJSFunctionを必要としない、パラメータを渡すことはありません。
[_jsBridge callHandler:"@ changeBGColor " ];
 //はJSFunctionを呼び出し、パラメータのJSを渡すが、JSFuncitonの戻り値を必要としません。
[_jsBridge callHandler:"@ changeBGColor "データ:@ " オレンジ色にHTMLの背景色!!!! " ];
 // JSFunctionを呼び出し、またJSFunctionの戻り値を必要とする、パラメータのJSを渡します。
[_jsBridge callHandler:@ " changeBGColor "データ:@ " パスパラメータJSに" responseCallback:^(ID responseData){
  NSLog(@ " JS戻り値:%の@ " 、responseData)。
}]。

JSコールOC

// JSは単にOCブロック呼び出し 
WebViewJavascriptBridge.callHandler(' scanClickを' ;)
 // JS OCのブロックを呼び出し、JSパラメータ渡し 
WebViewJavascriptBridge.callHandler(' scanClick '" JSパラメータを" );
 // JS OCを呼び出しますブロック、JS通過パラメータ、戻り値およびOCを受け入れます。
WebViewJavascriptBridge.callHandler(' scanClick '、{データ:" これは、JSスキャンデータがOCに送信される" }、関数(dataFromOC){
  アラート(" OCのと呼ばれるJS走査方式!" );
  document.getElementById(" のreturnValue ").VALUE = dataFromOC。
});

4. OCリリースブロック

OC、消失時の電流コントローラが、そうでなければ、状況は、コントローラが発生することが解放できない、ブリッジから除去OCブロック橋、中に注入することを忘れません。

[_jsBridge removeHandler:"@ scanClick " ];

例5

1.JS - > OCとの対話

OCでは、修飾navigationBar WebViewJavascriptBridgeの色は、ブロックによって登録します

[_jsBridge registerHandler:@ " colorClick "ハンドラ:^(識別データ、WVJBResponseCallback responseCallback){
  self.navigationController.navigationBar.barTintColor = [UIColor colorWithRed:arc4random_uniform(256)/ 255.0緑:arc4random_uniform(256)/ 255.0青:arc4random_uniform(256)/ 255.0アルファ:1.0 ]。
  responseCallback("@ 色の変更が完了しています!" );
}]。

ブロックのOCを呼び出すためのJSには、いくつかの方法。

WebViewJavascriptBridge.callHandler(' colorClick ' 、関数(dataFromOC){
  アラート(" JSが登録OCのcolorClickメソッドを呼び出します" );
  document.getElementById(" のreturnValue ").VALUE = dataFromOC。
})

OC - > JSの相互作用

カラーJSFunctionを注入するブリッジは、HTMLのボディを修正しました。

// ここで宣言されたメソッドは、OC JSを呼び出すためのイニシアチブをとる必要があります。
setupWebViewJavascriptBridge(関数(ブリッジ){
  bridge.registerHandler(' changeBGColor ' 、関数(データ、responseCallback){
    // 警告( 'AAAAAA'); 
    document.body.style.backgroundColor = " オレンジ" 
    document.getElementById(" のreturnValue ").VALUE = データ。
   });
}); 

そして、ブリッジによってOCの終わりを呼び出します  changeBGColor

[_jsBridge callHandler:"@ changeBGColor "データ:@ " HTMLの背景色がオレンジ色に!!!! " ];

 

おすすめ

転載: www.cnblogs.com/liuluoxing/p/11769596.html