UIWebView与WKWebView使用示例

本篇文章主要讲UIWebView的一些原理及内部组件的功能介绍,还有WKWebView的协议、特性及使用等!

如果大家发现任何错误,请直接在下方的评论框中添加评论,感谢大家的支持!

UIWebView
UIWebView是苹果继承于UIView封装的一个加载web内容的类,它可以加载任何远端的web数据展示在你的页面上,你可以像浏览器一样前进后退刷新等操作。不过苹果在iOS8以后推出了WKWebView来加载Web。

下面再详细介绍下WKWebView:
UIWebView属于UIKit,封装了WebKit.framework的WebView.
WebView组合管理了WebCore.framework的Page,并提供了各种Clients.
Page管理了Main Frame,Main Frame管理了sub Frame(FrameTree) 关于详细的UIWebView介绍转自这里

WebView继承自WAKView,WAKView类似于NSView,可以做较少的改动使得Mac和iOS共用一套。由UIWebDocumentView对WebView进行操作并接收回调事件,当数据发生变化的时候,就会通知UIWebTiledView重新绘制。

组件功能介绍
UIWebTiledView和WAKWindow这两个类主要负责页面的绘制,包括布局绘图排版,交互等,WAKWindow还会做一些用户操作事件的分派。

UIWebBrowserView主要负责:

form的自动填充
fixed元素的位置调整
JavaScript的手势识别
键盘弹出时的视图滚动处理,防止遮挡
提供接口让UIWebView获取信息
为显示PDF时添加页号标签

通过反编译可以获得UIWebViewInternal的具体成员变量

 
@interface UIWebViewInternal : NSObject  { 
    UIScrollView *scroller; 
    UIWebBrowserView *browserView; 
    UICheckeredPatternView *checkeredPatternView; 
    id <UIWebViewDelegate> delegate; 
    unsigned int scalesPageToFit; 
    unsigned int isLoading; 
    unsigned int hasOverriddenOrientationChangeEventHandling; 
    unsigned int drawsCheckeredPattern; 
    unsigned int webSelectionEnabled; 
    unsigned int drawInWebThread; 
    unsigned int inRotation; 
    NSURLRequest *request; 
    int clickedAlertButtonIndex; 
    UIWebViewWebViewDelegate *webViewDelegate; 
    UIWebPDFViewHandler *pdfHandler; 
}
@end
 
由此可以看出UIWebViewInternal是接收WebView的事件的载体通过自身把WebView的事件传递给UIWebView.

WKWebView
通过上面的了解,苹果终于在8.0之后开放了WKWebView应用于iOS和OSX中,它取代了UIWebView和WebView,在两个平台上支持同一套API。它脱离于UIWebView的设计,将原本的设计拆分成14个类,和3个代理协议,虽然是这样但是了解之后其实用法比较简单,依照职责单一的原则,每个协议做的事情根据功能分类。

WKWebView对比UIWebView

WKWebView的内存远远没有UIWebView的开销大,而且没有缓存
拥有高达60FPS滚动刷新率及内置手势
支持了更多的HTML5特性
高效的app和web信息交换通道
允许JavaScript的Nitro库加载并使用,UIWebView中限制了
WKWebView目前缺少关于页码相关的API
提供加载网页进度的属性
WKWebView的协议
WKScriptMessageHandler协议
可以把JavaScript对象通过该API自动转换成Objective-C或Swift 对象,Name可以通过addScriptMessageHandler: name:来设置:

 
window.webkit.messageHandlers.{NAME}.postMessage()
 
作为唯一响应JavaScript的协议方法,目的是为了与其它的进行分离,在该协议中响应之前注入的MessageHandlers.可以根据WKScriptMessage知道Js的名称和参数,来区分不同的响应事件:

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message{
}
 
WKNavigationDelegate协议

提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法,相当于UIWebView中webViewDidFinishLoad和webViewDidStartLoad方法,除了有开始加载、加载成功、加载失败的API外,还具有额外的三个代理方法:
 
// 第一个是服务器redirect时调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
 
// 第二个API是根据客户端受到的服务器响应头以及response相关信息来决定是否可以跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
 
// 第三个API是根据WebView对于即将跳转的HTTP请求头信息和相关信息来决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
 
WKUIDelegate协议

提供用原生控件显示网页的方法回调,例如Alert提示可以自定义用原生的控件来实现:

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler {
    UIAlertController *alert = [UIAlertController alertControllerWithTitle:nil message:message preferredStyle:UIAlertControllerStyleAlert];
    [alert addAction:[UIAlertAction actionWithTitle:@"确定" style:UIAlertActionStyleDefault handler:^(UIAlertAction * _Nonnull action) {
        completionHandler();
    }]];
    [self presentViewController:alert animated:YES completion:NULL];
}
 
Demo下载
结合以上这些,最近封装一个基础的WebView控件CHWebView,目前并没有做成一个通用控件,反而是封装带有UIWebView和WKWebView的基类,以后有时间的话把WebView这一层分离。 Demo的下载链接可以点这里

标哥的技术博客

总结
WKWebView相较于UIWebView在整体上有较大的提升,满足OS上面使用同一套控件的功能,同时对整个内存的开销以及滚动刷新率和JS交互做了优化的处理。依据职责单一的原则,拆分成了三个协议去实现WebView的响应,解耦了JS交互和加载进度的响应处理。WKWebView没有做缓存处理,所以对网页需要缓存的加载性能要求没那么高的还是可以考虑UIWebView.

时间: 2024-09-26 16:30:15

UIWebView与WKWebView使用示例的相关文章

WEB工程师和设计师必学的10个IOS 8新鲜改变

  @罗罗磊磊 :喜大普奔,喜极而泣,随着iPhone 6和iPhone 6 plus的上市,ios 8终于在上周推送更新了.新的设备,新的分辨率.接下来这篇文章介绍下 iOS 8有哪些变化,全都是为工程师和设计师量身打造写的呦. 概述 简介 iOS 8 上的 Safari 的更新 iPhone 6 和 iPhone 6 Plus 新 Api 支持 Safari 新功能和支持 iOS 8 原生优化 Safari 插件 新的设计 视频增强 iOS 8上的JS Bug 和问题 已经习惯了苹果官方的高

IOS WebView控件详解

概述 WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和WKWebView,UIWebView是iOS2之后开始使用,WKWebView是在iOS8开始使用,WKWebView将逐步取代笨重的UIWebView. 相比UIWebView,WKWebView做了如下优化: WKWebView更多的支持HTML5的特性 WKWebView更快,占用内存可能只有UIWebView的1/3 ~ 1/4 WKWebView高达60fps的滚动刷新率和丰富的内置手

WKWebView与Js实战(OC版)

前言 上一篇专门讲解了WKWebView相关的所有类.代理的所有API.那么本篇讲些什么呢?当然是实战了! 本篇文章教大家如何使用WKWebView去实现常用的一些API操作.当然,也会有如何与JS交互的实战. 如果还没有阅读过WKWebView精讲(OC版),请先阅读,不然有可能看不懂下面所讲的内容. 效果图 通过本篇文章,至少可以学习到: OC如何给JS注入对象及JS如何给IOS发送数据 JS调用alert.confirm.prompt时,不采用JS原生提示,而是使用iOS原生来实现 如何监

WKWebView API精讲(OC)

前言 鉴于LL同志对笔者说:"能不能写个OC版本的WKWebView的使用教程?",还积极打赏了30RMB,笔者又怎么好意思拒绝呢,于是才有了下文. 所有看到本篇文章的同志们,应该要感谢LL同志,更要向LL同志学习,积极打赏! WKWebView 看看WKWebView的头文件声明: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37

iOS中UIWebView网页加载组件的基础及使用技巧实例_IOS

基本用法示例 - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view. UIWebView * webView = [[UIWebView alloc]initWithFrame:CGRectMake(0, 20, ScreenWidth, ScreenHeight-20)]; // 自动队页面进行缩放以适应屏幕 webView.scalesPageToFit = Y

WKWebView的新特性与使用

[iOS]27.WKWebView的新特性与使用 在WWDC2014中,苹果推出了最新的iOS8系统,其中也伴随着很多控件的更新与升级.其中全新的WebKit库让人很是兴奋.本文也将讲解到WebKit中更新的WKWebView控件的新特性与使用方法,它很好的解决了UIWebView存在的内存.加载速度等诸多问题. 环境信息: Mac OS X 10.10.1 Xcode 6.1.1 iOS 8.1 正文: 一.WKWebView新特性 在性能.稳定性.功能方面有很大提升(最直观的体现就是加载网页

iOS WKWebView 混合应用开发时代来临 - 嵌入式 JS 的调试成为催化剂

iOS WKWebView 混合应用开发时代来临 - 嵌入式 JS 的调试成为催化剂 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 早在五年前,在哈尔滨大街小巷的饭馆儿里,经常听到店老板抱怨服

WKWebView新特性及JS交互

声明 本博文原始地址在: http://mp.weixin.qq.com/s?__biz=MzIzMzA4NjA5Mw==&mid=400327803&idx=1&sn=2a09fa94dd605a9f03bbc16f998e5717#rd 本博客不会在此处更新文章,请关注微信公众号,更新的内容只会是在原文更新. 引言 一直听说WKWebView比UIWebView强大许多,可是一直没有使用到,今天花了点时间看写了个例子,对其API的使用有所了解,为了日后能少走弯路,也为了让大家更

iOS UIWebView实现禁止用户复制剪切功能_IOS

前言 在APP的混合模式开发,Android开发中有WebView作为混合模式开发的桥梁,当然在IOS中也同样有一个 UIWebView 组件来作为混合模式开发的桥梁,用过UIWebView组件的开发者都知道,当UIWebView加载显示HTML页面时,组件本身提供了一些系统默认的交互行为,这篇文章给大家分享的是iOS UIWebView实现禁止用户复制剪切功能,下面来一起看看. 示例代码 // 控制器实现此方法 - (BOOL)canPerformAction:(SEL)action with