WKWebView的简单介绍和使用

2018-08-03  本文已影响0人  遠遊旳遊子

iOS8之后,苹果推出了WebKit这个框架,用来替换原有的UIWebView,这边简单的介绍一下WKWebView的使用方法

一、WKWebView新特性

二、WebKit框架概览

WebKit框架概览.png

如上图所示,WebKit框架中最核心的类应该属于WKWebView了,这个类专门用来渲染网页视图,其他类和协议都将基于它和服务于它。

三、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界面中有弹框时调用
 *  @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调用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

/** 从web界面中接收到一个脚本时调用 */
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;

参考:
独木舟的木的简书 - WKWebView
侭情显現的简书 - WKWebView的小使用
玄冰优的个人图书馆 - iOS开发 WKWebView学习使用
_Ace的博客 - WKWebView使用
袁梦龙的博客 - WKWebView 的使用和踩过的坑

上一篇 下一篇

猜你喜欢

热点阅读