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