1)UIWebView是iOS2就有了的,占用内存也比较多,内存峰值也挺夸张的
2)UIWebView继承自UIView 是用来加载网页的类,可以简单理解成就是一个view
1)相比UIWebView的话,支持更多的HTML5的特性
2)滚动刷新率在60fps以及内置手势
3)添加了加载进度属性:estimatedProgress
4)和Safari想听的JavaScript引擎
在发送请求之前决定是否跳转 --> 第一次进入页面 --> 页面开始加载时调用 --> 收到服务器跳转请求之后执行 --> 收到服务器跳转请求之后再执行 --> 收到响应后决定是否跳转 --> 内容开始返回时调用 --> 页面加载完成之后调用
之后进入页面 --> 在发送请求之前决定是否跳转 --> 收到服务器跳转请求之后执行 --> 收到服务器跳转请求之后再执行 --> 收到响应后决定是否跳转 --> 内容开始返回时调用 --> 页面加载完成之后调用
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
WKUserContentController *userController = [[WKUserContentController alloc] init];
config.preferences.javaScriptEnabled = YES;
config.userContentController = userController;
[userController addScriptMessageHandler:self name:@"callbackNative"];
WKWebView *web = [[WKWebView alloc] initWithFrame:CGRectMake(0, TOPBAR_H,SCREEN_W,SCREEN_H - TOPBAR_H) configuration:config];
self.webView = web;
web.UIDelegate = self;
web.navigationDelegate = self;
[web loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:self.urlStr]]];
[self.view addSubview:web];
#pragma mark - 处理与js交互回调
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message
{
//message中包含了js中所有的信息
//有两个重要的属性,一个是name,进行区分判断具体响应某个方法
//body中就是js传过来的参数
if ([message.name isEqualToString:@"callbackNative"]) {
NSLog(@"----%@\n----%@\n-----%@",message,message.body,message.frameInfo);
id obj = [NSJSONSerialization JSONObjectWithData:[message.body dataUsingEncoding:NSUTF8StringEncoding] options:NSJSONReadingAllowFragments error:nil];
NSDictionary *dict = obj;
}
}
[_webView.scrollViewaddObserver:selfforKeyPath:@"contentSize"options:NSKeyValueObservingOptionNewcontext:nil];
- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void*)context {
if ([keyPathisEqualToString:@"contentSize"]) {
dispatch_async(dispatch_get_global_queue(0,0), ^{
//document.documentElement.scrollHeight
//document.body.offsetHeight
[_webViewevaluateJavaScript:@"document.documentElement.offsetHeight"completionHandler:^(id_Nullable result,NSError * _Nullable error) {
CGRect frame =_webView.frame;
frame.size.height = [resultdoubleValue] + 50;
_webView.frame = frame;
_scrollViewHeight =220 + _webView.height;
_scrollView.contentSize =CGSizeMake(kScreenWidth,_scrollViewHeight);
}];
});
}
}
- (void)dealloc
{
[_webView.scrollViewremoveObserver:selfforKeyPath:@"contentSize"];
}