1.WKWebView的创建代码 遵循3个协议
WKWebViewConfiguration * testConfig = [[WKWebViewConfiguration alloc] init];
// 为WKWebViewConfiguration设置偏好设置
WKPreferences*testPreferences = [[WKPreferences alloc]init];
testConfig.preferences= testPreferences;
// 允许native和js交互
testPreferences.javaScriptEnabled=YES;
WKUserContentController * testUserContentController = [[WKUserContentController alloc] init];
// 注册H5页面调用的方法写了下面两个例子,按照自己需求 // 需要遵循WKScriptMessageHandler协议
[testUserContentController addScriptMessageHandler:self name:@"popToMainViewController"];
[testUserContentController addScriptMessageHandler:self name:@"hideBar"];
testConfig.userContentController= testUserContentController;
WKWebView * testWebView = [[WKWebView alloc] initWithFrame:CGRectMake(0, 0, [UIScreen mainScreen].bounds.size.width, [UIScreen mainScreen].bounds.size.height) configuration:testConfig];
NSString * path = @"http://www.baidu.com";
NSURLRequest * request = [NSURLRequest requestWithURL:[NSURL URLWithString:path]];
[testWebView loadRequest:request];
2.实现代理方法 // 注意:::::::需要调用JS方法的时候必须在(void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation这个方法里面写,要不然网页没加载完,调啥方法都是找不到
#pragma mark---WKnavigationDelegate
- (void)webView:(WKWebView*)webView didStartProvisionalNavigation:(WKNavigation*)navigation {
NSLog(@"webViewDidStartLoad");
}
- (void)webView:(WKWebView*)webView didFinishNavigation:(WKNavigation*)navigation {
NSLog(@"webViewDidFinishLoad");
// 调用js方法
// NSString *jsFun = [NSString stringWithFormat:@"pageFin('%@')",@"1234567"];
// [self.webView evaluateJavaScript:jsFun completionHandler:^(id _Nullable result, NSError * _Nullable error){
// NSLog(@"evaluateJavaScript:\n result = %@ error = %@",result, error);
// }];
}
#pragma mark---WKScriptMessageHandler代理方法
// 接受js发送的消息 注意:::::::js调用iOS注册的方法时,必须传值,随便传点什么都可以,不传值这个方法不会被调用,暂时没搞清楚是啥问题
-(void)userContentController:(WKUserContentController*)userContentController didReceiveScriptMessage:(WKScriptMessage*)message
{
NSLog(@"%@,%@",message.name,message.body);
NSString*name = message.name;
if ([name isEqualToString:@"popToMainViewController"]) {
// js 调用popToMainViewController这个方法的时候,你在这里处理
}elseif([nameisEqualToString:@"hideBar"]){
// js 调用hideBar这个方法的时候,你在这里处理
}else{
}
}
附上h5调用iOS方法的代码 调用的是popToMainViewController方法
window.webkit.messageHandlers.popToMainViewController.postMessage('1234');