前言
本文转载于 :WKWebView的新特性与使
一、简介
- 相比较与UIWebView,在性能、稳定、功能方面有很大提升;
- 允许JavaScript的Nitro库加载并使用
- 支持更多的HTML5特性;
- 将UIWebViewDelegate于UIWebView重构成了14类与3个协议
二、属性介绍
- WKBackForwardList:之前访问过的 web页面的列表,可以通过后退和前进动作来访问到。
- WKBackForwardListItem: webview中后退列表里的某一个网页。
- WKFrameInfo: 包含一个网页的布局信息。
- WKNavigation: 包含一个网页的加载进度信息。
- WKNavigationAction:包含可能让网页导航变化的信息,用于判断是否做出导航变化。
- WKNavigationResponse:包含可能让网页导航变化的返回内容信息,用于判断是否做出导航变化。
- WKPreferences: 概括一个 webview 的偏好设置。
- WKProcessPool: 表示一个 web 内容加载池。
- WKUserContentController: 提供使用 JavaScript post 信息和注射 script 的方法。
- WKScriptMessage: 包含网页发出的信息。
- WKUserScript:表示可以被网页接受的用户脚本。
- WKWebViewConfiguration: 初始化 webview 的设置。
- WKWindowFeatures: 指定加载新网页时的窗口属性。
- WKNavigationDelegate: 提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法。
- WKScriptMessageHandler: 提供从网页中收消息的回调方法。
- WKUIDelegate: 提供用原生控件显示网页的方法回调。
二、使用
1、前置-导入头文件
#import <WebKit/WebKit.h>
2、初始化
// 默认初始化
- (instancetype)init;
- (instancetype)initWithFrame:(CGRect)frame NS_DESIGNATED_INITIALIZER;
// 根据对webview的相关配置,进行初始化
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
3、加载网页与HTML代码方式
<span style="font-family:SimSun;font-size:14px;">// 方式一
WKWebView *webView = [[WKWebView alloc] initWithFrame:self.view.bounds];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:webView];
//方式二
WKWebViewConfiguration * configuration = [[WKWebViewConfiguration alloc] init];
webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:configuration];
[webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://www.baidu.com"]]];
[self.view addSubview:webView];</span>
三、WKWebView代理方法
1、WKNavigationDelegate
该代理提供的方法,可以用来追踪加载过程(页面开始加载、加载完成、加载失败)、决定是否执行跳转。
<span style="font-family:SimSun;font-size:14px;">// 页面开始加载时调用
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 当内容开始返回时调用
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 页面加载完成之后调用
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 页面加载失败时调用
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;</span>
页面跳转的代理有三种,分别为(收到跳转与决定是否跳转两种)
<span style="font-family:SimSun;font-size:14px;">// 接收到服务器跳转请求之后调用
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 在收到响应后,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 在发送请求之前,决定是否跳转
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;</span>
2、WKUIDelegate
// 创建一个新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
剩下三个代理方法全都是与界面弹出提示框相关的,针对web界面的三种提示框(警告框、确认框、输入框),分别对应三总代理方法。下面只拒了警告框的例子。
/**
* web界面中有弹出警告框时调用
*
* @param webView 实现该代理的webview
* @param message 警告框中的内容
* @param frame 主窗口
* @param completionHandler 警告框消失调用
*/
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(void (^)())completionHandler;
3、WKScriptMessageHandler
这个协议中包含一个必须实现的方法,这个方法是提高App与web端交互的关键,它可以直接将接收到的JS脚本转化为OC或Swift对象。(当然,在UIWebView也可以通过“曲线救国”的方式与web进行交互,著名的Cordova框架就是这种机制)
// 从web界面中接收到一个脚本时调用
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
四、WKWebView加载JS
// 图片缩放的js代码
NSString *js = @"var count = document.images.length;for (var i = 0; i < count; i++) {var image = document.images[i];image.style.width=320;};window.alert('找到' + count + '张图');";
// 根据JS字符串初始化WKUserScript对象
WKUserScript *script = [[WKUserScript alloc] initWithSource:js injectionTime:WKUserScriptInjectionTimeAtDocumentEnd forMainFrameOnly:YES];
// 根据生成的WKUserScript对象,初始化WKWebViewConfiguration
WKWebViewConfiguration *config = [[WKWebViewConfiguration alloc] init];
[config.userContentController addUserScript:script];
_webView = [[WKWebView alloc] initWithFrame:self.view.bounds configuration:config];
[_webView loadHTMLString:@"<head></head><img src='http://www.nsu.edu.cn/v/2014v3/img/background/3.jpg' />"baseURL:nil];
[self.view addSubview:_webView];
五、关于JS的加载或WebView的其他技巧,可以看一下下面文章:
1、使用safari对webview进行调试
2、WebView加载HTML图片大小自适应与文章自动换行