webView.getSettings().setAppCachePath(getCacheDir().getAbsolutePath())
webView.getSettings().setAppCacheEnabled(true)
if (Constant.DEBUG) {
webView.getSettings().setCacheMode(WebSettings.LOAD_NO_CACHE)
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
webView.getSettings().setMixedContentMode(WebSettings.MIXED_CONTENT_ALWAYS_ALLOW)
}
//参数1 定义Android 与js交互的接口, 参数2 与js交互的一个常量,可以是任意一个常量字符串,
但是h5网页调用的时候需要增加这个参数二:handler
public class JSInterface{
@JavascriptInterface//这个标注必须加上 表示js要调用的方法,可以自动识别
public void getShareInfo(String strings) {
//todo android dosomething
}
}
那么 js端该如何调用这个方法呢\
android 和ios的调用方法不一样 因此 h5里面需要区别andorid和ios机型来分别调用移动端方法
如android:
//handler 是与android 约定的常量(最好做成全局通用的常量)
//getShareInfo 是与android 定义的调用方法
以上常量、方法、参数类型 必须一致才能成功调用
WebView提供两个事件回调类给应用层,分别为WebViewClient,WebChromeClient开发者可以继承
这两个类,接手相应事件处理。WebViewClient 主要提供网页加载各个阶段的通知,比如网页开始
加载onPageStarted,网页结束加载onPageFinished等;WebChromeClient主要提供网页加载过程
中提供的数据内容,比如返回网页的title,favicon等。
有需要监听加载网页进度
//需要webBar的可以自定义增加一个webBar
最后,就是大家都知道的webView.loadUrl(url)//url需要加载的网页
那么,如何在android调用js的方法呢
//getMsg() 为js里面暴露的方法
在销毁的时候:
protected void onDestroy() {\
super.onDestroy()\
if (webView != null) {\
webView.loadUrl("about:blank")\
webView.destory()\
}\
}
一、h5 调用 OC,给OC传值
1、在WKWebview初始化的时候,先注册JS方法
//这个类主要用来做native与JavaScript的交互管理
WKUserContentController * wkUController = [[WKUserContentController alloc] init]
//注册一个name为jsToOcNoPrams的js方法,设置处理接收JS方法的代理
[wkUController addScriptMessageHandler:self name:@"jsToOcNoPrams"]
[wkUController addScriptMessageHandler:self name:@"jsToOcWithPrams"]
config.userContentController = wkUController
2、拦截js方法,接收参数
注意:遵守WKScriptMessageHandler协议,代理是由WKUserContentControl设置
//通过接收JS传出消息的name进行捕捉的回调方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
NSLog(@"name:%@\\\\n body:%@\\\\n frameInfo:%@\\\\n",message.name,message.body,message.frameInfo)
//用message.body获得JS传出的参数体
NSDictionary * parameter = message.body
//JS调用OC
if([message.name isEqualToString:@"jsToOcNoPrams"]){
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"js调用到了oc" message:@"不带参数" preferredStyle:UIAlertControllerStyleAlert]
[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}])]
[self presentViewController:alertController animated:YES completion:nil]
}else if([message.name isEqualToString:@"jsToOcWithPrams"]){
UIAlertController *alertController = [UIAlertController alertControllerWithTitle:@"js调用到了oc" message:parameter[@"params"] preferredStyle:UIAlertControllerStyleAlert]
[alertController addAction:([UIAlertAction actionWithTitle:@"OK" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
}])]
[self presentViewController:alertController animated:YES completion:nil]
}
}
3、在webview释放注销之前移除js方法
//移除注册的js方法
[[_webView configuration].userContentController removeScriptMessageHandlerForName:@"jsToOcNoPrams"]
二、oc调用H5,给H5传值
1、//OC调用JS changeColor()是JS方法名,completionHandler是异步回调block
NSString *jsString = [NSString stringWithFormat:@"changeColor('%@')", @"Js参数"]
[_webView evaluateJavaScript:jsString completionHandler:^(id _Nullable data, NSError * _Nullable error) {
NSLog(@"改变HTML的背景色")
}]
//改变字体大小 调用原生JS方法
NSString *jsFont = [NSString stringWithFormat:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '%d%%'", arc4random()%99 + 100]
[_webView evaluateJavaScript:jsFont completionHandler:nil]
2、// 页面加载完成之后调用
- (void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation{
[SVProgressHUDdismiss]
NSString* jsStr = [NSStringstringWithFormat:@"payResult('%@')",@"true"]
[self.webView evaluateJavaScript:jsStrcompletionHandler:^(id_Nullable result,NSError* _Nullable error) {
NSLog(@"==%@----%@",result, error)
}]
}