WKWebView
JS调用OC方法(常使用)
使用WKScriptMessageHandler协议
创建WKWebView的代码:
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
// 设置偏好设置
config.preferences = [[WKPreferences alloc] init];
// 默认为0
config.preferences.minimumFontSize = 10;
// 默认认为YES
config.preferences.javaScriptEnabled = YES;
// 在iOS上默认为NO,表示不能自动通过窗口打开
config.preferences.javaScriptCanOpenWindowsAutomatically = NO;
config.processPool = [[WKProcessPool alloc] init];
// 通过JS与webview内容交互
config.userContentController = [[WKUserContentController alloc] init];
// 注入JS对象名称AppModel,当JS通过AppModel来调用时,
// 我们可以在WKScriptMessageHandler代理中接收到
[config.userContentController addScriptMessageHandler:self name:@"JSMethod"]; //
_webView = [[WKWebView alloc] initWithFrame:CGRectZero configuration:config];
_webView.UIDelegate = self;
_webView.navigationDelegate = self;
[_webView addObserver:self forKeyPath:@"estimatedProgress" options:NSKeyValueObservingOptionNew context:nil];
其中
[config.userContentController addScriptMessageHandler:self name:@"JSMethod"];
设置代理,注入JS方法,方法名是“JSMethod”,这个方法名要和网页中的JS方法名保持统一。
H5代码:
window.webkit.messageHandlers.JSMethod.postMessage()
实现代理方法:
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"body:%@",message.body);
NSLog(@"name:%@",message.name);
if ([message.name isEqualToString:@"showMessage"]) {
NSLog(@"调用成功...");
}
}
在代理方法中通过message的name属性获取js方法名确定是哪个js方法从而调用哪个OC方法。
(个人习惯在WKWebView的基类控制器中注入一个方法名,然后通过message的body属性确认调用的方法以及传递过来的参数,这样就不用在iOS端每个页面每个js方法都要注入一个新的JS方法)。
OC调用JS
代码:
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation{
NSString * jsStr [NSStringstringWithFormat:@"payResult('%@')",@"true"];
[self.webView evaluateJavaScript:js StrcompletionHandler:^(id_Nullable result, NSError * _Nullable error) {
NSLog(@"==%@----%@",result, error);
}];
}
使用evaluateJavaScript方法,可以传参也可不传参。
UIWebView
JS调用OC方法
代码:
//创建JSContext对象
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//注册printHelloWorld方法
context[@"printHelloWorld"] = ^() {
NSLog(@"Hello World !");
};
context[@"printAandB"] = ^(NSString *A ,NSString *B) {
NSLog(@"%@,%@",A,B);
};
引入JavaScriptCore框架,使用JSContext对象。
其中的printHelloWorld、printAandB是网页中的JS方法名,NSString *A、NSString *B是通过printAandB方法传递给OC的参数。
OC调用JS
在UIWebView加载完成后调用
JSContext *context = [self.webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//OC调用JS方法
[context evaluateScript:@"test1()"];
调用方法传参数:
[context evaluateScript:@"test1(\"我是参数a\",\"我是参数b\")"];
本地html代码
这是一个示例html文件
OC与JS交互
本篇文章到这里就结束了,愿大家加班不多工资多,男同胞都有女朋友,女同胞都有男朋友。