iOS8
之后,苹果推出了WebKit
这个框架,用来替换原有的UIWebView
,这边简单的介绍一下WKWebView
的使用方法
一、WKWebView新特性
- 在性能、稳定性、功能方面有很大提升(最直观的体现就是加载网页是占用的内存);
- 允许JavaScript的Nitro库加载并使用(UIWebView中限制);
- 支持了更多的HTML5特性;
- 高达60fps的滚动刷新率以及内置手势;
- 将UIWebViewDelegate与UIWebView重构成了14类与3个协议查看苹果官方文档;
二、WebKit框架概览
![](https://img.haomeiwen.com/i3537781/44e4997af95e5040.png)
如上图所示,WebKit框架中最核心的类应该属于WKWebView了,这个类专门用来渲染网页视图,其他类和协议都将基于它和服务于它。
- WKWebView:网页的渲染与展示,通过WKWebViewConfiguration可以进行自定义配置。
- WKPreference:这个类用来进行相关webview 设置。
- WKProcessPool:这个类用来配置进程池,与网页视图的资源共享有关。
- WKUserContentController:这个类主要用来做native与JS的交互管理,提供使用JS post 信息和注射 script 的方法。
- WKUserScript:表示可以被网页接受的用户JS,用于进行JS注入。。
- WKScriptMessageHandler:这个类专门用来处理JS调用native的方法,提供从网页中收消息的回调方法。
- WKNavigationDelegate: 提供了追踪主窗口网页加载过程和判断主窗口和子窗口是否进行页面加载新页面的相关方法。
- WKNavigationAction:网页某个活动的示例化对象,包含可能让网页导航变化的信息,用于判断是否做出导航变化。
- WKFrameInfo: 包含一个网页的布局信息。
- WKNavigationResponse:包含可能让网页导航变化的返回内容信息,用于判断是否做出导航变化。
- WKUIDelegate: 提供用原生控件显示网页的方法回调,用于交互处理JavaScript中的一些弹出框。
- WKBackForwardList:之前访问过的 web页面的列表,可以通过后退和前进动作来访问到。
- WKBackForwardListItem: webview中后退列表里的某一个网页。
- WKNavigation: 包含一个网页的加载进度信息。
- WKScriptMessage: 包含网页发出的信息。
- WKWebViewConfiguration: 初始化 webview 的设置。
- WKWindowFeatures: 指定加载新网页时的窗口属性。
三、WKWebView的属性
/** webView的自定义配置 */
@property (nonatomic,readonly, copy) WKWebViewConfiguration *configuration;
/** 导航代理 */
@property (nullable, nonatomic, weak)id <WKNavigationDelegate> navigationDelegate;
/** 用户交互代理 */
@property (nullable, nonatomic, weak)id <WKUIDelegate> UIDelegate;
/** 访问过网页历史列表 */
@property (nonatomic,readonly, strong) WKBackForwardList *backForwardList;
/** 自定义初始化 */
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
/** 加载请求API */
- (nullable WKNavigation *)loadRequest:(NSURLRequest *)request;
/** 加载本地URL文件 */
- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL;
/** 加载本地html字符串 */
- (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
/** NSData数据加载webView视图 */
- (nullable WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
/** 返回上一个网页节点 */
- (nullable WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;
/** 网页的标题,支持KVO */
@property (nullable, nonatomic,readonly, copy) NSString *title;
/** 网页的URL地址,支持KVO */
@property (nullable, nonatomic,readonly, copy) NSURL *URL;
/** 网页是否正在加载,支持KVO */
@property (nonatomic,readonly, getter=isLoading) BOOL loading;
/** 加载的进度 范围为[0, 1] */
@property (nonatomic,readonly)double estimatedProgress;
/** 网页链接是否安全(标识页面中的所有资源是否通过安全加密连接来加载),支持KVO */
@property (nonatomic,readonly) BOOL hasOnlySecureContent;
/** 证书服务 */
@property (nonatomic,readonly, nullable) SecTrustRef serverTrust;
/** 是否可以返回,支持KVO */
@property (nonatomic,readonly) BOOL canGoBack;
/** 是否可以前进,支持KVO */
@property (nonatomic,readonly) BOOL canGoForward;
/** 返回到上一个网页,如果不能返回,则什么也不干 */
- (nullable WKNavigation *)goBack;
/** 前进到下一个网页,如果不能返回,则什么也不干 */
- (nullable WKNavigation *)goForward;
/** 重新加载 */
- (nullable WKNavigation *)reload;
/** 比较网络数据是否有变化,没有变化则使用缓存,否则从新请求 */
- (nullable WKNavigation *)reloadFromOrigin;
/** 停止加载 */
- (void)stopLoading;
/** 执行JavaScript */
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void(^ _Nullable)(_Nullableid, NSError * _Nullable error))completionHandler;
/** 是否允许左右滑动,返回-前进操作 默认是NO */
@property (nonatomic) BOOL allowsBackForwardNavigationGestures;
/** 自定义useragent,如果没有则为nil */
@property (nullable, nonatomic, copy) NSString *customUserAgent;
/** 在iOS上默认为NO,标识不允许链接预览 */
@property (nonatomic) BOOL allowsLinkPreview;
/** 滚动视图 */
@property (nonatomic,readonly, strong) UIScrollView *scrollView;
/** 是否支持放大手势,默认为NO */
@property (nonatomic) BOOL allowsMagnification;
/** 放大因子,默认为1 */
@property (nonatomic) CGFloat magnification;
/** 据设置的缩放因子来缩放页面,并居中显示结果在指定的点 */
- (void)setMagnification:(CGFloat)magnification centeredAtPoint:(CGPoint)point;
/** 证书列表,支持KVO */
@property (nonatomic,readonly, copy) NSArray *certificateChain;
四、方法使用介绍
(一)初始化
/** 默认初始化 */
- (instancetype)init;
- (instancetype)initWithFrame:(CGRect)frame;
/** 根据对webview的相关配置,进行初始化 */
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
(二)WKWebView代理方法
1、WKNavigationDelegate
- 该代理提供的方法,可以用来追踪加载过程(页面开始加载、加载完成、加载失败)、决定是否执行跳转。
/** 页面开始加载时调用 */
- (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;
/** 页面进程被终止时调用(web总体内存占用过大,页面即将白屏时) */
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView;
- 页面跳转的代理有三种,分别为(收到跳转与决定是否跳转两种)
/** 接收到服务器跳转请求之后调用 */
- (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;
/** web验证证书时调用(https加载要调用) */
- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void(^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential * _Nullable credential))completionHandler;
2、WKUIDelegate
- 以下三个代理都是与界面弹出提示框相关,分别针对web界面的三种提示框(警告框、确认框、输入框)的代理,如果不实现网页的alert函数无效
/**
* web界面中有弹框时调用
* @param webView 实现该代理的webview
* @param message alert框中的内容
* @param frame 主窗口
* @param completionHandler alert框消失时调用
* @param prompt alert框中的内容
* @param defaultText 输入框中默认要输入文本的提示
*/
/** 警告框 【对应JS的Alert方法】 */
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
/** 选择框 【对应JS的confirm方法】 */
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL))completionHandler;
/** 输入框 【对应JS的prompt方法】 */
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * _Nullable))completionHandler;
- 以下代理是和窗口相关
/** 创建新的webview时调用(打开新窗口) */
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
/** 成功关闭webview时调用 */
- (void)webViewDidClose:(WKWebView *)webView;
- 下面这些方法是交互JavaScript的方法
/** JavaScript调用confirm方法后回调的方法 confirm是js中的确定框,需要在block中把用户选择的情况传递进去 */
-(void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void(^)(BOOL))completionHandler;
/** JavaScript调用prompt方法后回调的方法 prompt是js中的输入框 需要在block中把用户输入的信息传入 */
-(void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void(^)(NSString * _Nullable))completionHandler;
/** 确认是否显示预览(默认预览元素调用) */
- (BOOL)webView:(WKWebView *)webView shouldPreviewElement:(WKPreviewElementInfo *)elementInfo;
/** 执行预览操作时调用(返回一个视图控制器将导致视图控制器被显示为一个预览。返回nil将WebKit的默认预览的行为。) */
- (nullable UIViewController *)webView:(WKWebView *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray> *)previewActions;
/** 当用户在预览中执行弹出操作时调用(允许应用程序向它创建的视图控制器弹出) */
- (void)webView:(WKWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController;
/** 显示一个文件上传面板。(completionhandler完成处理程序调用后打开面板已被撤销。通过选择的网址,如果用户选择确定,否则为零。如果不实现此方法,Web视图将表现为如果用户选择了取消按钮。) */
- (void)webView:(WKWebView *)webView runOpenPanelWithParameters:(WKOpenPanelParameters *)parameters initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void(^)(NSArray * _Nullable URLs))completionHandler;
3、WKScriptMessageHandler
- 这个协议中包含一个必须实现的方法,这个方法是提高App与web端交互的关键,它可以直接将接收到的JS脚本转化为OC或Swift对象。(当然,在UIWebView也可以通过“曲线救国”的方式与web进行交互,著名的Cordova框架就是这种机制)
/** 从web界面中接收到一个脚本时调用 */
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
参考:
独木舟的木的简书 - WKWebView
侭情显現的简书 - WKWebView的小使用
玄冰优的个人图书馆 - iOS开发 WKWebView学习使用
_Ace的博客 - WKWebView使用
袁梦龙的博客 - WKWebView 的使用和踩过的坑
网友评论