WebView混编介绍
Hybrid编程: 基于UIWebView的混合编程,它是指同时使用原生的控件和UIWebView加载HTML来展现应用界面, 既可以保证应用既有界面的流畅交互效果,又有Web界面良好的动态修改和多平台复用的优势(每个平台都有一个WebView)
例子:微信公众号的内容界面,网易新闻的内容界面、支付宝客户端的彩票界面、很多应用中的活动页
使用场景: 1、排版复杂。一般是图文混排,或有链接需要点击等(使用Native实现较为复杂) 2、界面的变化需求频繁。如淘宝的彩票界面,可能需要常常推出各种活动,采用webView可以不用向AppStore提交新版本
Tips: 界面对用户的交互需求不复杂。因为UIWebView实现的交互效果与原生效果相比还是会大打折扣
如何混编 WebView和Native
一、WebView协议方法
在 iOS7之前主要使用这种方案
// 加载一段JS代码或执行某个JS函数
- (NSString *)stringByEvaluatingJavaScriptFromString:(NSString *)script;
// 与 web 端定好协议,拦截参数 request ,根据参数来执行不同的 OC 代码,例如gap://
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
1、OC 调用 JS 的代码
辅助代码:
import "ViewController.h"
@interface ViewController ()<UIWebViewDelegate>
@property (nonatomic,strong) UIWebView * webView;
@end
@implementation ViewController
* (void)viewDidLoad {
[super viewDidLoad];
UIWebView * webView = [[UIWebView alloc] initWithFrame:[UIScreen mainScreen].bounds];
webView.delegate = self;
self.webView = webView;
NSURL * url = [[NSBundle mainBundle] URLForResource:@"test" withExtension:@"html"];
NSURLRequest * urlRequest = [NSURLRequest requestWithURL:url];
[webView loadRequest:urlRequest];
[self.view addSubview:webView];
}
在代理方法中实现 OC 执行 JS 代码:
// 实现 OC 执行 JS 代码
* (void)webViewDidFinishLoad:(UIWebView *)webView{
NSString * alertJs = @"alert('test js OC')";
[webView stringByEvaluatingJavaScriptFromString:alertJs];
}
2、JS 调用 OC 的代码
test.html代码:
在js 的函数中定好协议,截取协议中的字符串,根据字符串对应的方法执行相应的 OC 代码
- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType
{
NSString * url = request.URL.absoluteString;
NSRange range = [url rangeOfString:@“gap://“];
NSUInteger loc = range.location;
if (loc != NSNotFound) {
// 方法名
NSString * method = [url substringFromIndex:loc + range.length];
// 转成 SEL
SEL sel = NSSelectorFromString(method);
[self performSelector:sel];
}
return YES;
}
- (void)openCamera{
NSLog(@"%s",func);
}
二、JavaScriptCore框架
JavaScriptCore
iOS7,苹果推出了JavaScriptCore
JavaScriptCore是一种JavaScript引擎,主要为webKit提供脚本处理能力,JavaScriptCore是开源webkit的一部分,他提供了强大的整合能力.下面以JS调用OC方法为例,OC调用JS为例说明.
- JSContext, JSContext是代表JS的执行环境,通过-evaluateScript:方法就可以执行一JS代码
- JSValue, JSValue封装了JS与ObjC中的对应的类型,以及调用JS的API等
- JSExport, JSExport是一个协议,遵守此协议,就可以定义我们自己的协议,在协议中声明的API都会在JS中暴露出来,才能调用
http://www.jianshu.com/p/12c77d85b295
WKWebView(了解)
iOS8推出的UIWebView的升级版
UIWebView有内存泄露
WKWebView更节省内存
http://www.saitjr.com/ios/ios-wkwebview-new-features-and-use.html
三、第三方框架(了解)
如果不想自己实现相互调用,第三方的来了:https://github.com/marcuswestin/WebViewJavascriptBridge
使用第三方的博客:http://www.jianshu.com/p/ca496cb680fe 使用第三方的例子:https://github.com/indexjincieryi/NDH5ToNative