iOS wkwebview JSとOCは、データを転送するために相互に呼び出します

はじめに:
WKWebViewは、インタラクティブなWebコンテンツを表示するビューであり、iOS8.0およびmacOS10.10以降のシステムをサポートします。UIWebViewを置き換えるコンポーネントを提供します。WKWebViewは、UIWebViewの読み込み遅い、メモリ使用量が多い、最適化が難しいという問題を解決します。WKWebViewは、アプリ内でWebページを読み込むのに最適な選択肢言えます。

 

目次

1.JSとOCの相互作用

 2.OCはJSに値を渡します


1.JSとOCの相互作用

JSを注入するメソッドを追加します

// jsToOcNoPramsという名前のjsメソッドを登録して、受信側のJSメソッドを処理するオブジェクトを設定します
[wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@ "JSToOcNoPrams"];

 [wkUController addScriptMessageHandler:weakScriptMessageDelegate name:@ "JSToOcWithPrams"];

JSサイドコード例

<!--        JS语法-->
    <script type = "text/javascript">
        
    function JSToOcFunction1()
    {
       window.webkit.messageHandlers.JSToOcNoPrams.postMessage({});
    }
    
    function JSToOcFunction2()
    {
        window.webkit.messageHandlers.JSToOcWithPrams.postMessage({"params":"我是参数"});
    }

レイジーロードはwebViewを生成します

- (WKWebView *)webView {
    if (_webView == nil) {
        _userContentController = [[WKUserContentController alloc] init];
        
        _config = [[WKWebViewConfiguration alloc]init];
        _config.userContentController = _userContentController;
        _config.allowsInlineMediaPlayback = YES;
        
        WKPreferences *preferences = [WKPreferences new];
        preferences.javaScriptCanOpenWindowsAutomatically = YES;
        preferences.minimumFontSize = 12.0;
	 _config.preferences = preferences;

			 //这个类主要用来做native与JavaScript的交互管理
		 WKUserContentController * wkUController = [[WKUserContentController alloc] init];
			 //注册一个name为jsToOcNoPrams的js方法 设置处理接收JS方法的对象
		 [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"jsToOcNoPrams"];
		 [wkUController addScriptMessageHandler:weakScriptMessageDelegate  name:@"jsToOcWithPrams"];

		 _config.userContentController = wkUController;

		 _webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:_config];
		 _webView.UIDelegate = self;
		 _webView.navigationDelegate = self;
		//_webView.opaque = NO;
		 _webView.backgroundColor = [UIColor whiteColor];
		_webView.allowsBackForwardNavigationGestures = YES;/// 是否允许手势左滑返回上一级, 类似导航控制的左滑返回
		// 设置没有弹性
		_webView.scrollView.bounces = NO;

    }
    return _webView;
}

プロキシメソッドはJSデータを取得します

#pragma mark - WKScriptMessageHandler
//实现js注入方法的协议方法
- (void)userContentController:(WKUserContentController *)userContentController
      didReceiveScriptMessage:(WKScriptMessage *)message {

    NSLog(@"JS方法名:%@", message.name);
    NSLog(@"JS参数:%@", message.body);
    //找到对应js端的方法名,获取messge.body
    if ([message.name isEqualToString:@"JSToOcNoPrams"]) {

    // 根据传过来的值处理逻辑、跳转页面等等
    HikRealplayViewController *vc = [[HikRealplayViewController alloc]init];
	vc.title = message.body[@"title"];
	[self.navigationController pushViewController:vc animated:YES];
    
       
    }
}

 2.OCはJSに値を渡します

#pragma mark - WKNavigationDelegate

// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
    NSLog(@"加载结束");

	NSString *jsStr = [NSString stringWithFormat:@"ocSetDeviceCode('%@')",[ZJPNetWork getUUID]];

	[self.webView evaluateJavaScript:jsStr completionHandler:^(id _Nullable result, NSError * _Nullable error) {
		NSLog(@"%@--%@",result,error);
	}];
}

@ "ocSetDeviceCode( '%@')"、[ZJPNetWork getUUID]]、  ocSetDeviceCodeはメソッド名、( '%@')はパラメーターを示します

2. JS側は、渡された値コードの実装例を取得します

    function ocSetDeviceCode(value){            //ここでjsは値を受け取ります      }

おすすめ

転載: blog.csdn.net/zjpjay/article/details/103310279