WebView
项目中功能多了,就会加载一些H5界面。这个时候就会用到WebView。再复杂一点就会用到原生与H5交互。举个例子,项目中经常会有一些活动界面。然而这些活动界面总是在变化。用原生代码写,维护成本较高。这个时候就可以用H5代替。这就会用到H5与原生相互调用。
关于WebView的创建,H5加载页面。我就不贴出来代码了。直接说一下 JavaScriptCore框架。这是苹果解决与H5交互专用框架。框架中有几个类需要注意:
JSContext.h(联系H5与原生的桥梁功能与CoreData中的context类似);
JSValue.h(用于获取H5中的任意对象);
JSExport.h(一个协议调用的时候会用到);
最后要知道,所有的调用方法基本上都是在- (void)webViewDidFinishLoad:(UIWebView *)webView里面完成。也就是页面加载完成时候调用。
JSContext创建:
self.context = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];//创建
self.context.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue)
{
context.exception = exceptionValue;
};检测是否创建成功
H5调用原生
使用block
H5代码:
//如需传值,在方法名后面的括号里面加上即可
原生代码:
self.context[@"myAction"] = ^(){
};
//在小括号中接收H5传过来的参数,需要保持类型一致,在大括号中实现调用原生的方法;
使用JSExport代理
//在小括号中添加需要传递的参数
原生代码:
创建代理,当前控制器遵循代理即WebExport
@protocol WebExport
JSExportAs
(myLog ,- (void)myOCLog :(NSString *)string);
指定代理(在- (void)webViewDidFinishLoad:(UIWebView *)webView方法中)
self.context[@"native"] = self;
实现代理方法
- (void)myOCLog :(NSString *)string{
NSLog(@"%@");
}
以上就是JS调用原生的基本使用。
原生调用H5
H5代码
需要改变的标签
原生代码(在你需要触发的地方添加)
JSValue *labelAction = self.context[@"labelAction"];//使用JSValue接收fangaf
[labelAction callWithArguments:@[@"你好"]];
参考文档
(https://www.jianshu.com/p/0428d0734379)
WKWebView
相对来说WKWebView交互起来就比较麻烦啦,感觉没有WebView顺手。同样关于WKWebView的创建我就不贴出代码了
H5调用原生
原生代码(在- (void)viewDidLoad 方法中)
//配置环境
self.configuration = [[WKWebViewConfiguration alloc]init];
self.userVC = [[WKUserContentController alloc]init];
//注册方法
[self.userVC addScriptMessageHandler:self name:@"sayhello"];
self.configuration.userContentController = self.userVC;
接收参数
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message {
NSLog(@"%@",message.body);
//body中就是接收的参数
}
H5代码
hello world
原生调用H5
原生代码
- (void)webView:(WKWebView *)tmpWebView didFinishNavigation:(WKNavigation *)navigation{
//say()是JS方法名,completionHandler是异步回调block
[webView evaluateJavaScript:@"say()" completionHandler:^(id _Nullable result, NSError * _Nullable error) {
NSLog(@"%@",result);
}];
}
参考文档
(https://www.jianshu.com/p/4fa8c4eb1316)