内容简介:1、导入WebKit.framework2、声明WKWebView
1、导入WebKit.framework
2、声明WKWebView
@interface ViewController () @property (nonatomic, strong) WKWebView * webView; @end
JS调用OC原生方法
1、前端在js文件中实现
这里要注意messageHandlers后面跟着的deviceInfo要与原生的定义的一致。
//有参数
window.webkit.messageHandlers.deviceInfo.postMessage({
"body": "buttonActionMessage"
});
//无参数
window.webkit.messageHandlers.deviceInfo.postMessage("");
2、iOS 实现WKScriptMessageHandler协议
@interface ViewController ()<WKScriptMessageHandler> @property (nonatomic, strong) WKWebView * webView; @end
3、iOS 初始化WKWebView
这里注意[userController addScriptMessageHandler:self name:@”deviceInfo”];
这个方法里的deviceInfo要与前端定义的一致。
- (void)viewDidLoad {
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
WKWebViewConfiguration *configuration = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userController = [[WKUserContentController alloc] init];
configuration.userContentController = userController;
self.webView = [[WKWebView alloc] initWithFrame:self.view.frame configuration:configuration];
[userController addScriptMessageHandler:self name:@"deviceInfo"];
NSURLRequest *request = [NSURLRequest requestWithURL:[NSURL URLWithString:kURL]];
[self.webView loadRequest:request];
[self.view addSubview:self.webView];
}
4、iOS 实现WKScriptMessageHandler协议方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
if ([message.name isEqualToString:@"deviceInfo"]) {
NSString *deviceInfoStr = message.body;
NSLog(@"deviceInfo:%@", deviceInfoStr);
UIAlertController *alert = [UIAlertController alertControllerWithTitle:@"提示" message:@"JS调用的OC回调方法" preferredStyle:UIAlertControllerStyleAlert];
UIAlertAction *action = [UIAlertAction actionWithTitle:@"ok" style:UIAlertActionStyleCancel handler:nil];
[alert addAction:action];
[self presentViewController:alert animated:YES completion:nil];
}
}
message.body就是前端传来的参数
OC调用JS方法
1、实现WKNavigationDelegate协议
@interface ViewController ()<WKScriptMessageHandler,WKNavigationDelegate> @property (nonatomic, strong) WKWebView * webView; @end
2、实现WKNavigationDelegate协议的- webView: didFinishNavigation:方法
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
}
3、OC调用JS方法
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation {
[webView evaluateJavaScript:@"deviceInfo('8.3')" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"ok");
}];
}
其中deviceInfo(‘8.3’)为前端给出的JS方法名8.3是需要传给前端的参数
4、注意事项
以下错误的解决方法
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
一定要在网页加载完成后调用,否则报错
JS方法一定要放在最外层
图片出处不详,请作者看到与我联系,侵删
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 直观讲解-RPC调用和HTTP调用的区别
- 调用链系列一:解读UAVStack中的调用链技术
- 调用链系列二:解读UAVStack中的调用链技术
- 调用链系列三:解读UAVStack中的调用链技术
- dubbo源码解析(二十七)远程调用——injvm本地调用
- 微服务间的调用和应用内调用有什么区别
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
The Seasoned Schemer
Daniel P. Friedman、Matthias Felleisen / The MIT Press / 1995-12-21 / USD 38.00
drawings by Duane Bibbyforeword and afterword by Guy L. Steele Jr.The notion that "thinking about computing is one of the most exciting things the human mind can do" sets both The Little Schemer (form......一起来看看 《The Seasoned Schemer》 这本书的介绍吧!