WebView和WKWebView全面总结

一、WKWebView简介

在WWDC2014中,苹果推出了最新的iOS8系统,其中也伴随着很多控件的更新与升级。其中全新的WebKit库让人很是兴奋。本文也将讲解到WebKit中更新的WKWebView控件的新特性与使用方法,它很好的解决了UIWebView存在的内存、加载速度等诸多问题。

首先我们来看一下WKWebView的新特性

1.在性能、稳定性、功能方面有很大提升(最直观的提升就是加载网页是占用的内存很少,测试加载不同网页其内存性能提升3倍到4倍,而且没有缓存);

2.允许JavaScript的Nitro库加载并使用(UIWebView中限制);

3.支持了更多的HTML5特性;

4.高达60fps的滚动刷新率以及内置手势;

5.将UIWebViewDelegate与UIWebView重构成了14类与3个协议(查看苹果官方文档);

二、WebView和WKWebView比较

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

1.webView常用初始化方式:

- (void)loadRequest:(NSURLRequest*)request;

最常用的一种方式,也是最简单的一种方式。通过一个网页URL来进行加载,这个URL可以是远程的也可以是本地的。

- (void)loadHTMLString:(NSString*)string baseURL:(NSURL*)baseURL;

这个方法需要将html文件读取为字符串,其中baseURL是我们自己设置的一个路径,用于寻找html文件中引用的图片等素材。

- (void)loadData:(NSData*)data MIMEType:(NSString*)MIMEType textEncodingName:(NSString*)textEncodingName baseURL:(NSURL*)baseURL;

这种加载方式用的比较少,但是比较灵活,其中参数含义如下:

data是文件数据,MIMEType是文件类型,textEncodingName是编码类型,一般是utf-8或者utf-16,baseURL是素材资源路径。


2.一些常用的属性和方法

@property(nonatomic,assign)id delegate;  //设置webView的代理

@property(nonatomic,readonly,retain)UIScrollView*scrollView; //内置的scrollView

@property(nonatomic,readonly,retain)NSURLRequest*request; //URL请求

- (void)reload; //重新加载数据

- (void)stopLoading; //停止加载数据

- (void)goBack; //返回上一级

- (void)goForward; //跳转下一级

@property(nonatomic,readonly,getter=canGoBack)BOOL canGoBack; //获取能否返回上一级

@property(nonatomic,readonly,getter=canGoForward)BOOL canGoForward; //获取能否跳转下一级

@property(nonatomic,readonly,getter=isLoading)BOOL loading; //获取是否正在加载数据

- (NSString*)stringByEvaluatingJavaScriptFromString:(NSString*)script; //通过javaScript操作web数据

@property(nonatomic)BOOL scalesPageToFit; //设置是否缩放到适合屏幕大小

@property(nonatomic)BOOL allowsInlineMediaPlaybackNS_AVAILABLE_IOS(4_0);

设置是否使用内联播放器播放视频

@property(nonatomic)BOOL mediaPlaybackRequiresUserActionNS_AVAILABLE_IOS(4_0);

设置视频是否自动播放

@property(nonatomic)BOOL mediaPlaybackAllowsAirPlayNS_AVAILABLE_IOS(5_0);

设置音频播放是否支持ari play功能

@property(nonatomic)BOOL suppressesIncrementalRenderingNS_AVAILABLE_IOS(6_0);

设置是否将数据加载如内存后渲染界面

@property(nonatomic)BOOL keyboardDisplayRequiresUserActionNS_AVAILABLE_IOS(6_0);

设置用户交互模式

3.webView协议中的方法

- (BOOL)webView:(UIWebView*)webView shouldStartLoadWithRequest:(NSURLRequest*)request navigationType:(UIWebViewNavigationType)navigationType;

准备加载内容时调用的方法,通过返回值来进行是否加载的设置

- (void)webViewDidStartLoad:(UIWebView*)webView;

开始加载时调用的方法

- (void)webViewDidFinishLoad:(UIWebView*)webView;

结束加载时调用的方法

- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error;

加载失败时调用的方法

4.和JS的一些交互

主要有两方面:js执行OC代码、oc调取写好的js代码

js执行OC代码:js是不能执行oc代码的,但是可以变相的执行,js可以将要执行的操作封装到网络请求里面,然后oc拦截这个请求,获取url里面的字符串解析即可,这里用到代理协议的一个方法:

- (BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)request navigationType:(UIWebViewNavigationType)navigationType;

oc调取写好的js代码:这里用到UIwebview的一个方法。示例代码一个是网页定位,一个是获取网页title:


(二)、WKWebView

1.初始化

a.首先要引入WebKit库

b.初始化方法分为以下两种

- (instancetype)initWithFrame:(CGRect)frame; // 默认初始化

- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration*)configurationNS_DESIGNATED_INITIALIZER; // 根据对webview的相关配置,进行初始化


2.WKWebView属性

WKBackForwardList:之前访问过的web页面的列表,可以通过后退和前进动作来访问到。

WKBackForwardListItem: webview中后退列表里的某一个网页。

WKFrameInfo:包含一个网页的布局信息。

WKNavigation:包含一个网页的加载进度信息。

WKNavigationAction:包含可能让网页导航变化的信息,用于判断是否做出导航变化。

WKNavigationResponse:包含可能让网页导航变化的返回内容信息,用于判断是否做出导航变化。

WKPreferences:概括一个webview的偏好设置。

WKProcessPool:表示一个web内容加载池。

WKUserContentController:提供使用JavaScript post信息和注射script的方法。

WKScriptMessage:包含网页发出的信息。

WKUserScript:表示可以被网页接受的用户脚本。

WKWebViewConfiguration:初始化webview的设置。

WKWindowFeatures:指定加载新网页时的窗口属性。

WKNavigationDelegate:提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法。

WKScriptMessageHandler:提供从网页中收消息的回调方法。

WKUIDelegate:提供用原生控件显示网页的方法回调。

3.WKWebView的代理方法

WKNavigationDelegate

该代理提供的方法,可以用来追踪加载过程(页面开始加载、加载完成、加载失败)、决定是否执行跳转

// 页面开始加载时调用

- (void)webView:(WKWebView*)webViewdidStartProvisionalNavigation:(WKNavigation*)navigation;

// 当内容开始返回时调用

- (void)webView:(WKWebView*)webViewdidCommitNavigation:(WKNavigation*)navigation;

// 页面加载完成之后调用

- (void)webView:(WKWebView*)webViewdidFinishNavigation:(WKNavigation*)navigation;

// 页面加载失败时调用

- (void)webView:(WKWebView*)webViewdidFailProvisionalNavigation:(WKNavigation*)navigation;

// 接收到服务器跳转请求之后调用

- (void)webView:(WKWebView*)webViewdidReceiveServerRedirectForProvisionalNavigation:(WKNavigation*)navigation;

// 在收到响应后,决定是否跳转

- (void)webView:(WKWebView*)webViewdecidePolicyForNavigationResponse:(WKNavigationResponse*)navigationResponsedecisionHandler:(void(^)(WKNavigationResponsePolicy))decisionHandler;

// 在发送请求之前,决定是否跳转

- (void)webView:(WKWebView*)webViewdecidePolicyForNavigationAction:(WKNavigationAction*)navigationActiondecisionHandler:(void(^)(WKNavigationActionPolicy))decisionHandler;

WKUIDelegate

- (WKWebView*)webView:(WKWebView*)webView createWebViewWithConfiguration:(WKWebViewConfiguration*)configuration forNavigationAction:(WKNavigationAction*)navigationAction windowFeatures:(WKWindowFeatures*)windowFeatures; 

//此代理方法用于创建一个新的WebView

WKScriptMessageHandler

这个协议中包含一个必须实现的方法,这个方法是提高App与web端交互的关键,它可以直接将接收到的JS脚本转化为OC或Swift对象。

- (void)userContentController:(WKUserContentController*)userContentControllerdidReceiveScriptMessage:(WKScriptMessage*)message;

总结:

苹果向我们提供WKWebView,拥有UIWebView的所有功能,目的就是为了替代之前UIWebView,相比与UIWebView,WKWebView不仅在加载web网页时性能有巨大提升,而且也提供了更多的方法与JS进行交互。但是WKWebView要在ios8.0之后才能使用,因此,如果我们使用Swift来开发应用,兼容版本从8.0开始时,可以直接使用WKWebView。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,948评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,371评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,490评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,521评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,627评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,842评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,997评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,741评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,203评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,534评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,673评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,339评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,955评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,770评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,000评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,394评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,562评论 2 349

推荐阅读更多精彩内容

  • 一、WebView WebView就是一个内嵌浏览器控件,在iOS中主要有两种WebView:UIWebView和...
    iOS祎阅读 1,080评论 0 2
  • 前言 关于UIWebView的介绍,相信看过上文的小伙伴们,已经大概清楚了吧,如果有问题,欢迎提问。 本文是本系列...
    CoderLF阅读 8,953评论 2 12
  • http://www.cnblogs.com/mddblog/p/5281748.html 一、整体介绍 UIWe...
    F麦子阅读 1,227评论 0 2
  • 前言 给大家介绍另外一种基于 iOS 8 新推出的 WKWebView 组件,构建出自己的混合开发框架。 WKWe...
    iwolfox阅读 1,116评论 1 3
  • 1. 利用 WKWebView 进行交互(系统 API) 2. 利用 UIWebView 进行交互(系统 API)...
    ElvisSun阅读 986评论 0 1