iOS与H5混合开发
2020-01-17 本文已影响0人
percivals
iOS编程中,H5混合开发一般会视同UIWebView或者WKWebview完成网页加载,针对这两者,有以下几种交互方式
1.WebViewJavascriptBridge 库(适用于UIWebView及WKWebview)
下载第三方库,并完成集成
与H5协商方法名,并定义数据交互规则
_bridge = [WebViewJavascriptBridge bridgeForWebView:self.wkWebView];
[_bridge setWebViewDelegate:self];
//"iOSBridge"为协商确定的方法名
[_bridge registerHandler:@"iOSBridge" handler:^(id data, WVJBResponseCallback responseCallback) {
}];
2.在webview代理方法中监听url,进行字段分析获取想要的数据 (适用于UIWebView及WKWebview)
WKWebview中
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation
对webView.URL.absoluteString进行解析
此方法较为简单,适用场景不广,用于可直接通过网址信息字段判断处理逻辑的地方
3.webview自带交互方法
WKWebview中,通过注册监听完成交互
//1.注册
[self.wkWebView.configuration.userContentController addScriptMessageHandler:self name:@"back"];
//2.监听处理
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
if ([message.name isEqualToString:@"back"]) {
NSDictionary * messageDict = (NSDictionary *)message.body;
}
}
//3.释放
[self.wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"back"];
UIWebview中,通过jsContext完成交互
//获取JS代码的执行环境/上下文/作用域
self.jsContext = [webView valueForKeyPath:@"documentView.webView.mainFrame.javaScriptContext"];
//! 在context注册iOSDelegate对象为self
self.jsContext[@"mesc"] = self;//注意循环引用问题
self.jsContext.exceptionHandler = ^(JSContext *context, JSValue *exceptionValue) {
context.exception = exceptionValue;
NSLog(@"异常信息:%@", exceptionValue);
};
self.jsContext[@"console"][@"log"] = ^(JSValue * msg) {
NSLog(@"H5 log : %@", msg);
};