- (void)initWKWebView
{
//创建并配置WKWebView的相关参数
//1.WKWebViewConfiguration:是WKWebView初始化时的配置类,里面存放着初始化WK的一系列属性;
//2.WKUserContentController:为JS提供了一个发送消息的通道并且可以向页面注入JS的类,WKUserContentController对象可以添加多个scriptMessageHandler;
//3.addScriptMessageHandler:name:有两个参数,第一个参数是userContentController的代理对象,第二个参数是JS里发送postMessage的对象。添加一个脚本消息的处理器,同时需要在JS中添加,window.webkit.messageHandlers..postMessage()才能起作用。
//以下都属于初始化基本设置
WKWebViewConfiguration*configuration = [[WKWebViewConfigurationalloc]init];
WKUserContentController*userContentController = [[WKUserContentControlleralloc]init];
//getUserid 和js 约定的对象名
[userContentControlleraddScriptMessageHandler:selfname:@"getUserid"];
configuration.userContentController= userContentController;
WKPreferences*preferences = [WKPreferencesnew];
preferences.javaScriptCanOpenWindowsAutomatically=YES;
preferences.minimumFontSize=40.0;
configuration.preferences= preferences;
//在交互的时候出现问题,xcode会报错 一定要注意 在创建了wkwebView的时候 configuration:configuration
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
//设置访问的URL
NSURL*url = [NSURLURLWithString:@"http://2thewin.com/Home/Comment/index.html?matchid=1"];
//根据URL创建请求
NSURLRequest*request = [NSURLRequestrequestWithURL:url];
// WKWebView加载请求
[self.webViewloadRequest:request];
self.webView.UIDelegate=self;
self.webView.backgroundColor= [UIColorgreenColor];
[self.viewaddSubview:self.webView];
}
加载本地的html
//loadFileURL方法通常用于加载服务器的HTML页面或者JS,而loadHTMLString通常用于加载本地HTML或者JS
//这里要特别注意的是 当你加载本地的html资源的时候,如果不是单一的html文件,包含css,js等多个资源,可以将他们放在一个文件夹,然后拖进xcode的时候选择,Create folder referreferences,生成蓝色的资源包的那个
//如果是单一的文件的话不需要inDirectory这个参数 文件的的话参数跟的是文件夹的名字
NSString *htmlPath = [[NSBundle mainBundle]pathForResource:@"index" ofType:@"html" inDirectory:@"assets"];
NSString *appHtml = [NSString stringWithContentsOfFile:htmlPath encoding:NSUTF8StringEncoding error:nil];
NSURL *baseUrl = [NSURL fileURLWithPath:htmlPath];
[webView loadHTMLString:appHtml baseURL:baseUrl];
[self.webView loadHTMLString:fileURL baseURL:baseURL];
JS调用Native
- 首先OC和安卓有出入 OC需要在JS加入以下代码
//getUserid就是和JS约定的对象名
//postMessage JS执行传给OC的消息(json格式)
window.webkit.messageHandlers.getUserid.postMessage({"UserId":"99"});
-
当JS调用本地的时候会触发OC的协议方法
//JS 调用 OC 时 webview 会调用此方法
//@param userContentController webview中配置的userContentController 信息
@param message JS执行传递的消息
//@param userContentController webview中配置的userContentController 信息 ,在初始化的时候配置
//@param message JS执行传递的消息(json)
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
NSLog(@"body:%@",message.body);
NSLog(@"body:%@",message.name);
[self method];
}
OC向JS传值
- (void)method{
//这里一定要注意向JS传递数据的格式,json或者字符串,要注意格式,有时候xcode会报EOF的错,就是格式错
NSString *str= @"25";
NSString *JSResult = [NSString stringWithFormat:@"getUseridResult('%@')",str];
//OC调用JS
[self.webView evaluateJavaScript:JSResult completionHandler:^(id _Nullable result, NSError * _Nullable error) {
//如果没错的话 result 为0 error 为null
NSLog(@"%@", result,error);
}];
}