WKWebView详解

时间:2022-04-25
本文章向大家介绍WKWebView详解,主要内容包括WKWebView、初始化WebView、查看View的信息、设置代理、加载内容、放缩网页内容、浏览、执行JavaScript、获取截图、WKWebViewConfiguration、WKPreferences、WKProcessPool、WKUserContentController、添加或移除WKUserScript、添加或移除Content Rules、WKScriptMessageHandler、WKScriptMessage、WKFrameInfo、WKSecurityOrigin、WKUserScript、WKUserScriptInjectionTime枚举、WKContentRuleList、WKContentRuleListStore、WKWebsiteDataStore、WKHTTPCookieStore、WKHTTPCookieStoreObserver、WKWebsiteDataRecord、Available Data Types、WKAudiovisualMediaTypes、WKSelectionGranularity、WKUserInterfaceDirectionPolicy、WKDataDetectorTypes、WKURLSchemeHandler、WKURLSchemeTask、WKNavigationDelegate、WKNavigation、WKNavigationActionPolicy、WKNavigationResponsePolicy、WKNavigationAction、WKNavigationType、WKNavigationResponse、WKUIDelegate、WKWindowFeatures、WKPreviewElementInfo、WKPreviewActionItem、UIPreviewActionItem、WKBackForwardList、WKBackForwardListItem、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

WKWebView主要涉及到以下类或协议,各部分可能互相依赖,文章按照apple文档的划分对每一个模块进行了详细的解释

  • WKWebView

配置和偏好

  • WKWebViewConfiguration
  • WKPreferences

进程分配

  • WKProcessPool

页面导航管理

  • WKNavigationDelegate
  • WKNavigation
  • WKNavigationAction
  • WKNavigationResponse
  • WKBackForwardList
  • WKBackForwardListItem

用户界面

  • WKUIDelegate
  • WKWindowFeatures

脚本注入

  • WKUserContentController
  • WKScriptMessage
  • WKUserScript

缓存数据和持久化

  • WKWebsiteDataStore
  • WKHTTPCookieStore
  • WKHTTPCookieStoreObserver
  • WKWebsiteDataRecord

处理WebKit无法处理的URL Scheme类型的资源

  • WKURLSchemeHandler
  • WKURLSchemeTask

页面结构

  • WKFrameInfo
  • WKSecurityOrigin

内容拦截

  • WKContentRuleList
  • WKContentRuleListStore

3D-Touch预览

  • WKPreviewElementInfo
  • WKPreviewActionItem
  • UIPreviewActionItem

WKWebView

一个WKWebView对象显示交互式的web内容,比如在应用程序内的浏览器。

您可以使用WKWebView类来在应用程序中嵌入web内容,通过创建一个WKWebView对象,将其设置为视图,并发送一个请求来加载web内容。

从iOS 8.0和OS X 10.10开始,建议使WKWebView在应用程序中展示web内容,建议不要使用UIWebView或WebView。
  • 使用 initWithFrame:configuration: 方法来创建WKWebView对象;
  • 使用 loadHTMLString:baseURL: 方法来加载本地HTML文件;
  • 使用 loadRequest: 方法来加载web内容;
  • 使用 stopLoading 方法来停止加载;
  • 使用 loading 属性来判断网页是否正在加载中;
  • 使用 WKUIDelegate 协议来跟踪网页内容的加载过程;

决定是否加载内容

[iOS 11.0+]返回WebKit是否原生地支持某一种URL Scheme

+ (BOOL)handlesURLScheme:(NSString *)urlScheme;

初始化WebView

初始化配置

@property (nonatomic, readonly, copy) WKWebViewConfiguration *configuration;

初始化

- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
  • 如果初始化失败返回nil
  • 这是一个接收自定义WKWebViewConfiguration参数的初始化方法
  • 其会对传入的WKWebViewConfiguration对象进行拷贝,因此,在初始化之后,你再对传入的对象进行修改是不会生效的
  • 使用initWithFrame: 初始化方法会使用默认的WKWebViewConfiguration进行初始化

查看View的信息

WebView对应的ScrollView

@property(nonatomic, readonly, strong) UIScrollView *scrollView;

当前页面的title

@property(nonatomic, readonly, copy) NSString *title;
  • 支持KVO

当前的URL

@property(nonatomic, readonly, copy) NSURL *URL;
  • 支持KVO

iOS 9.0+自定义User Agent

@property(nonatomic, copy) NSString *customUserAgent;
  • 如果不想自定义User Agent,设为nil即可

iOS 10.0+当前浏览页面的SecTrustRef对象

@property(nonatomic, readonly) SecTrustRef serverTrust;

iOS 9.0–10.0当前浏览页面的证书链(已废弃)

@property(nonatomic, readonly, copy) NSArray *certificateChain;
  • 其元素是SecCertificateRef

设置代理

页面浏览代理

@property(nonatomic, weak) id<WKNavigationDelegate> navigationDelegate;

界面代理

@property (nullable, nonatomic, weak) id <WKUIDelegate> UIDelegate;

加载内容

当前浏览页面加载进度的比例(估算值)

@property(nonatomic, readonly) double estimatedProgress;
  • 这个值根据预期接收的字节总数(包括主文档和所有潜在的子资源)从0.0到1.0不等
  • 在页面加载完成后,估算的进度保持在1.0,直到新的导航开始,这时估算的进度重置为0.0
  • 支持KVO

是否页面内的所有资源都是通过安全链接加载的

@property(nonatomic, readonly) BOOL hasOnlySecureContent;
  • 支持KVO。

设置网页的内容和基础URL

- (WKNavigation *)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;
  • string是网页的内容
  • baseURL是用于解析文档内相对URL的URL
  • 返回一个新的WKNavigation对象

是否正在加载内容

@property(nonatomic, readonly, getter=isLoading) BOOL loading;
  • 支持KVO。

重新加载当前页面

- (WKNavigation *)reload;
  • 返回一个新的WKNavigation对象
  • 是不带缓存的验证(对比reloadFromOrigin)

重新加载当前页面(带缓存的验证)

- (WKNavigation *)reloadFromOrigin;
  • 如果可能的话使用cache-validating条件执行end-to-end重新验证
  • 是带缓存的验证

停止加载当前网页中的所有资源

- (void)stopLoading;

iOS 9.0+设置网页内容和base URL

- (WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
  • data是网页内容
  • MIMEType是数据类型
  • characterEncodingName是编码名称
  • baseURL是用于解析文档内相对URL的URL
  • 返回一个新的WKNavigation对象

iOS 9.0+浏览文件

- (WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL;
  • URL是文件的URL
  • readAccessURL是允许读取的URL,如果是文件夹,则文见夹下所有文件都可以被读取

放缩网页内容

是否允许放大手势来放大网页内容

@property(nonatomic) BOOL allowsMagnification;
  • 默认值是NO
  • 这里只是限制手势而已,通过magnification属性仍然可以调节网页的放大比例

影响网页内容放缩的因子

@property(nonatomic) CGFloat magnification;
  • 默认值是1.0

以指定中心点放缩页面内容

- (void)setMagnification:(CGFloat)magnification centeredAtPoint:(CGPoint)point;
  • 按指定的因子(magnification属性)缩放页面内容,并将结果集中在指定的点上,即以指定的点为中心放大

浏览

是否允许水平滑动手势来触发网页的前进和后退

@property(nonatomic) BOOL allowsBackForwardNavigationGestures;

当前WebView的前进后退记录

@property (nonatomic, readonly, strong) WKBackForwardList *backForwardList;

是否可以后退。

@property(nonatomic, readonly) BOOL canGoBack;
  • 即在前进后退记录中,当前记录之前是否还有记录

是否可以前进

@property(nonatomic, readonly) BOOL canGoForward;
  • 即在前进后退记录中,当前记录之后是否还有记录

iOS 9.0+是否允许按住链接就展示链接的预览

@property(nonatomic) BOOL allowsLinkPreview;
  • 在iOS上,这个属性只在支持3D Touch的设备上支持
  • 在iOS 10及以后的系统版本默认值是YES,之前的默认值是NO
  • 如果将该属性的值设置为YES,则iOS用户可以按下链接来预览链接,并可以检测到地址和电话号码等数据。这样的预览被用户称为peeks
  • 如果用户在链接预览上更深入地按下,预览将pop到目标网址。该动作会将应用程序切换到Safari
  • 如果您想在iOS中支持链接预览,但又想要在应用程序中保留用户,那么您可以将WKWebView类转换为SFSafariViewController
  • 如果您使用WebView作为应用内浏览器,那么进行这种更改是最佳选择
  • SFSafariViewController自动支持链接预览
  • iOS 10.0+开始支持自定义链接预览,你也可以通过这种方式来实现用户预览网页并pop后仍然留在应用内而不用切换到Safari,只是你需要做一些额外的适配工作

后退

- (WKNavigation *)goBack;
  • 即在前进后退列表中导航到上一个记录
  • 返回一个新的WKNavigation对象
  • 如果没有记录可以后退,则返回nil

前进

- (WKNavigation *)goForward;
  • 即在前进后退列表中导航到下一个记录
  • 返回一个新的WKNavigation对象
  • 如果没有记录可以前进,则返回nil

前进/后退到一个指定的记录上

- (WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;
  • item必须是WebView的WKBackForwardList中的一个记录
  • 返回一个新的WKNavigation对象
  • 如果已经在当前记录,或者没有找到,则会返回nil

加载一个请求

- (WKNavigation *)loadRequest:(NSURLRequest *)request;
  • 返回一个新的WKNavigation对象。

执行JavaScript

执行JavaScript字符串

- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *error))completionHandler;
  • completionHandler会在脚本执行完成或者失败时调用
  • id是代码执行成功的返回结果,error是执行失败的结果
  • completionHandler在主线程中执行

获取截图

获取WebView的可见区域截图

- (void)takeSnapshotWithConfiguration:(WKSnapshotConfiguration *)snapshotConfiguration completionHandler:(void (^)(UIImage *snapshotImage, NSError *error))completionHandler;

WKWebViewConfiguration

使用WKWebViewConfiguration类,你可以决定网页的渲染时机,媒体的播放方式,用户选择项目的粒度,以及很多其他的选项。

WKWebViewConfiguration只会在webview第一次初始化的时候使用,你不能用此类来改变一个已经初始化完成的webview的配置。

UserAgent中的应用名称

@property(nonatomic, copy) NSString *applicationNameForUserAgent;

WebView使用的偏好选项

@property(nonatomic, strong) WKPreferences *preferences;

进程池

@property(nonatomic, strong) WKProcessPool *processPool;
  • webview将会从该进程池中获取一个Web Content 进程
  • 在初始化web视图时,将为它从指定的池中创建一个新的Web Content 进程,或者使用该池中的现有进程

与WebView关联的WKUserContentController对象

@property(nonatomic, strong) WKUserContentController *userContentController;

与WebView关联的WKWebsiteDataStore对象

@property(nonatomic, strong) WKWebsiteDataStore *websiteDataStore;
  • 如果一个WebView关联了一个非持久化的WKWebsiteDataStore,将不会有数据被写入到文件系统
  • 该特性可以用来实现隐私浏览。

是否应该总是允许网页的缩放

@property(nonatomic) BOOL ignoresViewportScaleLimits;
  • 将此属性设置为TRUE可以使页面被缩放,无论页面的意图是什么
  • 设置为TRUE会覆盖网页中的user-scalable HTML属性
  • 默认值为FALSE。

是否抑制内容渲染呈现,直到它完全载入内存

@property(nonatomic) BOOL suppressesIncrementalRendering;
  • 默认值NO

HTML5视频是否内联播放

@property(nonatomic) BOOL allowsInlineMediaPlayback;
  • 内联播放就是指在页面内播放而非必须使用native的全屏播放控件
  • 你必须设置此属性以播放内联视频
  • 当在iPhone的HTML文档中添加视频元素时,还必须包括playsinline属性
  • 在iOS 10.0之前创建的应用程序必须使用webkit-playsinline属性
  • iPhone的默认值为false,而iPad的默认值为true

是否允许AirPlay播放媒体

@property(nonatomic) BOOL allowsAirPlayForMediaPlayback;

是否允许HTML5视屏以画中画形式播放

@property(nonatomic) BOOL allowsPictureInPictureMediaPlayback;
  • 默认YES

哪些媒体类型需要用户手势才能开始播放

@property(nonatomic) WKAudiovisualMediaTypes mediaTypesRequiringUserActionForPlayback;
  • 使用WKAudiovisualMediaTypeNone表明不需要用户手势开始播放媒体

已废弃iOS 9.0以后使用allowsAirPlayForMediaPlayback

@property(nonatomic) BOOL mediaPlaybackAllowsAirPlay;

已废弃iOS 10.0以后使用mediaTypesRequiringUserActionForPlayback

@property(nonatomic) BOOL requiresUserActionForMediaPlayback;

已废弃iOS 10.0以后使用mediaTypesRequiringUserActionForPlayback

@property(nonatomic) BOOL mediaPlaybackRequiresUserAction;

用户可以在WebView中交互式地选择内容的粒度级别

@property(nonatomic) WKSelectionGranularity selectionGranularity;
  • 默认值是 WKSelectionGranularityDynamic

用户界面元素的方向性

@property(nonatomic) WKUserInterfaceDirectionPolicy userInterfaceDirectionPolicy;
  • 默认值是WKUserInterfaceDirectionPolicyContent

设置需要检测的数据类型

  • 指定该属性将会给匹配的页面内容增加用户交互@property(nonatomic) WKDataDetectorTypes dataDetectorTypes;
  • 例如,如果将其设为WKDataDetectorTypeLink类型,浏览器将会对页面中的“Visit apple.com” 字符串中的 “apple.com”添加链接

为指定的URL Scheme添加处理器(WKURLSchemeHandler)

- (void)setURLSchemeHandler:(id<WKURLSchemeHandler>)urlSchemeHandler forURLScheme:(NSString *)urlScheme;
  • 一个URL Scheme只能有一个处理器
  • 对一个不合法的URL Scheme注册处理器,注册多次,或者注册一个已经注册过的处理器,都会触发异常
  • 你可以调用handlesURLScheme:方法来判断WebKit是否可以处理一个特定的URL Scheme
  • URL Scheme对大小写敏感
  • 一个合法的URL Scheme只能是以ASCII字母开头并且只能是由ASCII字母,数字,'+', '-' 和 '.'组成

返回URL Scheme对应的WKURLSchemeHandler

- (id<WKURLSchemeHandler>)urlSchemeHandlerForURLScheme:(NSString *)urlScheme;

WKPreferences

一个WKPreferences封装了一个webview的偏好选项,在WKWebViewConfiguration中设置

最小字体的尺寸

@property(nonatomic) CGFloat minimumFontSize;
  • 默认值是0

是否启用JavaScript

@property(nonatomic) BOOL javaScriptEnabled;
  • 默认值YES
  • 设置为NO将会禁用页面加载的或执行的JavaScript
  • 但这个配置不会影响用户的script

是否可以在没有用户操作的情况下自动打开窗口

@property (nonatomic) BOOL javaScriptCanOpenWindowsAutomatically;
  • iOS默认为NO,macOS默认为YES

WKProcessPool

一个WKProcessPool对象代表Web Content的进程池。

与WebView的进程池关联的进程池通过其configuration来配置。每个WebView都有自己的Web Content进程,最终由一个有具体实现的进程来限制;在此之后,具有相同进程池的WebView最终共享Web Content进程。

WKProcessPool对象只是一个简单的不透明token,本身没有属性或者方法。

WKUserContentController

WKUserContentController对象提供了一种向WebView发送JavaScript消息或者注入JavaScript脚本的方法

添加WKScriptMessageHandler

添加一个WKScriptMessageHandler

- (void)addScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
  • 添加一个名称为name的WKScriptMessageHandler将会导致在所有使用该WKScriptMessageHandler的WebView的所有frame中定义一个JavaScript函数window.webkit.messageHandlers.name.postMessage(messageBody)

添加或移除WKUserScript

添加一个WKUserScript

- (void)addUserScript:(WKUserScript *)userScript;

移除所有的WKUserScript

- (void)removeAllUserScripts;

移除name名字的WKScriptMessageHandler

- (void)removeScriptMessageHandlerForName:(NSString *)name;

关联的所有WKScriptMessageHandler

@property(nonatomic, readonly, copy) NSArray<WKUserScript *> *userScripts;

添加或移除Content Rules

iOS 11.0+添加一个WKContentRuleList

- (void)addContentRuleList:(WKContentRuleList *)contentRuleList;

iOS 11.0+移除一个WKContentRuleList

- (void)removeContentRuleList:(WKContentRuleList *)contentRuleList;

iOS 11.0+移除所有的WKContentRuleList

- (void)removeAllContentRuleLists;

WKScriptMessageHandler

为一个实现了WKScriptMessageHandler协议的类提供一个接收来自网页的JavaScript调用的方法

当收到来自网页的一次JavaScipt调用时响应

- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
  • userContentController是调用该方法的WKUserContentController,message是收到的JavaScript消息

WKScriptMessage

一个WKScriptMessage对象包含了一个JavaScritp消息的相关信息

消息体

@property(nonatomic, readonly, copy) id body;
  • 只能是这些类型 NSNumber, NSString, NSDate, NSArray, NSDictionary, NSNull

发送消息的frame

@property(nonatomic, readonly, copy) WKFrameInfo *frameInfo;

发送消息的WKScriptMessageHandler的名字

@property(nonatomic, readonly, copy) NSString *name;

发送消息的WKWebView

@property(nonatomic, readonly, weak) WKWebView *webView;

WKFrameInfo

一个WKFrameInfo对象包含了一个网页中的farme的相关信息。其只是一个描述瞬时状态的纯数据对象,不能用来在多次消息调用中唯一标识一个frame。

该frame是否是该网页的main frame或者子frame

@property(nonatomic, readonly, getter=isMainFrame) BOOL mainFrame;

frame对应的当前的请求

@property(nonatomic, readonly, copy) NSURLRequest *request;

frame的securityOrigin

@property(nonatomic, readonly) WKSecurityOrigin *securityOrigin;

frame对应的webView

@property(nonatomic, readonly, weak) WKWebView *webView;

WKSecurityOrigin

一个WKSecurityOrigin对象由host,protocol和port组成。任何一个与正在加载的网页拥有相同WKSecurityOrigin的URL加载是一个First Party加载。First Party网页可以访问彼此的脚本和数据库资源。其只是一个描述瞬时状态的纯数据对象,不能用来在多次消息调用中唯一标识一个SecurityOrigin。

@property(nonatomic, readonly, copy) NSString *host;

@property(nonatomic, readonly) NSInteger port;

@property(nonatomic, readonly, copy) NSString *protocol;

WKUserScript

一个WKUserScript对象代表了一个可以被注入网页中的脚本

初始化一个可以被添加到WKUserContentController的WKUserScript脚本对象

- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
  • 如果脚本不能被注入则会返回nil
  • source 脚本的代码
  • injectionTime 脚本注入的时机,必须是这个WKUserScriptInjectionTime枚举值
  • forMainFrameOnly YES 只向main frame注入脚本, NO 则会向所有的frame注入脚本

脚本的代码

@property(nonatomic, readonly, copy) NSString *source;

脚本注入的时机

@property(nonatomic, readonly) WKUserScriptInjectionTime injectionTime;
  • 必须是这个WKUserScriptInjectionTime枚举值

是否只注入到main frame

@property(nonatomic, readonly, getter=isForMainFrameOnly) BOOL forMainFrameOnly;
  • YES 只向main frame注入脚本
  • NO 则会向所有的frame注入脚本

WKUserScriptInjectionTime枚举

WKUserScriptInjectionTimeAtDocumentStart在document element创建之后,在所有其他内容加载之前

WKUserScriptInjectionTimeAtDocumentEnd在document加载完成之后,在其他子资源加载完成之前

WKContentRuleList

一个编译过的规则列表,应用到Web Content上。从WKContentExtensionStore中创建或者取得。

标识符

@property(nonatomic, readonly, copy) NSString *identifier;

WKContentRuleListStore

返回默认的Store

+ (instancetype)defaultStore;

在url路径文件路径下创建一个Store并返回

+ (instancetype)storeWithURL:(NSURL *)url;
  • 当创建时,Store的内容从该路径下的所有编译过的规则列表加载
  • 新增的变化,如编译一个新的规则列表,删除一个已经存在的规则列表,都会持久化在相同的路径

获取所有规则列表的identifier

- (void)getAvailableContentRuleListIdentifiers:(void (^)(NSArray<NSString *> *))completionHandler;

查找指定identifier的WKContentRuleList

- (void)lookUpContentRuleListForIdentifier:(NSString *)identifier completionHandler:(void (^)(WKContentRuleList *, NSError *))completionHandler;

编译一个新的规则列表并添加到Store

- (void)compileContentRuleListForIdentifier:(NSString *)identifier encodedContentRuleList:(NSString *)encodedContentRuleList completionHandler:(void (^)(WKContentRuleList *, NSError *))completionHandler;

移除指定identifier的WKContentRuleList

- (void)removeContentRuleListForIdentifier:(NSString *)identifier completionHandler:(void (^)(NSError *))completionHandler;

WKWebsiteDataStore

一个WKWebsiteDataStore对象代表了被网页使用的各种类型的数据。包括cookies,磁盘文件,内存缓存以及持久化数据如WebSQL,IndexedDB数据库,local storage。

返回默认的WKWebsiteDataStore

+ (WKWebsiteDataStore *)defaultDataStore;

返回一个新的非持久化的WKWebsiteDataStore

+ (WKWebsiteDataStore *)nonPersistentDataStore;
  • 如果一个WebView关联了一个非持久化的WKWebsiteDataStore,将不会有数据被写入到文件系统
  • 该特性可以用来实现隐私浏览

是否是非持久化的

@property(nonatomic, readonly, getter=isPersistent) BOOL persistent;

返回WKHTTPCookieStore对象

@property(nonatomic, readonly) WKHTTPCookieStore *httpCookieStore;

获取指定类型的WKWebsiteDataRecord

- (void)fetchDataRecordsOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(NSArray<WKWebsiteDataRecord *> *))completionHandler;
  • 网站数据类型定义 Available Data Types

获取所有可用的数据类型

+ (NSSet<NSString *> *)allWebsiteDataTypes;
  • 网站数据类型定义 Available Data Types

从指定的dataRecords中移除指定类型的WKWebsiteDataRecord

- (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes forDataRecords:(NSArray<WKWebsiteDataRecord *> *)dataRecords completionHandler:(void (^)(void))completionHandler;

移除指定日期之后发生修改的指定类型的WKWebsiteDataRecord

- (void)removeDataOfTypes:(NSSet<NSString *> *)websiteDataTypes modifiedSince:(NSDate *)date completionHandler:(void (^)(void))completionHandler;

WKHTTPCookieStore

管理与特定的WKWebsiteDataStore关联的HTTP cookie的对象

获取所有的cookies

- (void)getAllCookies:(void (^)(NSArray<NSHTTPCookie *> *))completionHandler;

设置一个cookie

- (void)setCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler;

移除一个cookie

- (void)deleteCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler;

添加一个WKHTTPCookieStoreObserver观察者

- (void)addObserver:(id<WKHTTPCookieStoreObserver>)observer;
  • WKHTTPCookieStore不会强引用持有该observer
  • 你应当在不用observer的时候主动将其移除掉

移除一个WKHTTPCookieStoreObserver

- (void)removeObserver:(id<WKHTTPCookieStoreObserver>)observer;

WKHTTPCookieStoreObserver

当WKHTTPCookieStore的cookies发生变化时调用

- (void)cookiesDidChangeInCookieStore:(WKHTTPCookieStore *)cookieStore;

WKWebsiteDataRecord

一个WKWebsiteDataRecord对象代表了按照源URL的domain名和后缀分类的网页数据

存在于此WKWebsiteDataRecord的网站数据类型

@property(nonatomic, readonly, copy) NSSet<NSString *> *dataTypes;
  • 网站数据类型定义 Available Data Types

显示名称。通常,显示名称是来自资源的SecurityOrigin的域名加后缀。

@property(nonatomic, readonly, copy) NSString *displayName;

Available Data Types

定义WKWebsiteDataRecord中可用的数据类型的字符串常量

磁盘缓存

NSString *const WKWebsiteDataTypeDiskCache;

内存缓存

NSString *const WKWebsiteDataTypeMemoryCache;

HTML离线web应用缓存

NSString *const WKWebsiteDataTypeOfflineWebApplicationCache;

Cookies

NSString *const WKWebsiteDataTypeCookies;

HTML session storage

NSString *const WKWebsiteDataTypeSessionStorage;

HTML local storage

NSString *const WKWebsiteDataTypeLocalStorage;

WebSQL 数据库

NSString *const WKWebsiteDataTypeWebSQLDatabases;

IndexedDB 数据库

NSString *const WKWebsiteDataTypeIndexedDBDatabases;

WKAudiovisualMediaTypes

WKAudiovisualMediaTypeNone 都不需要用户的手势就能开始播放

WKAudiovisualMediaTypeAudio 包含音频的媒体类型需要用户的手势才能开始播放

WKAudiovisualMediaTypeVideo 包含视频的媒体类型需要用户的手势才能开始播放

WKAudiovisualMediaTypeAll 所有的媒体类型都需要用户的手势才能开始播放

WKSelectionGranularity

WKSelectionGranularityCharacter 选择端点可以放置在任何字符边界上

WKSelectionGranularityDynamic 选择的粒度取决于选择的不同。当选择是在单一块中时粒度可能是单个的字符,当选择不是局限于单一块,粒度可能是一个块

WKUserInterfaceDirectionPolicy

用于确定WebView中用户界面元素的方向性的策略。包括ltr(从左到右)和rtl(从右到左)两种方向。文本的书写方向就由此属性来指定。

WKUserInterfaceDirectionPolicyContent 方向性遵循CSS /HTML/ XHTML规范。这是userInterfaceDirectionPolicy的默认值。可以参见CSS direction属性或者HTML dir属性。

WKUserInterfaceDirectionPolicySystem 方向性遵循View的userInterfaceLayoutDirection属性。NSUserInterfaceLayoutDirection包括NSUserInterfaceLayoutDirectionLeftToRight和NSUserInterfaceLayoutDirectionRightToLeft两个枚举值。

WKDataDetectorTypes

WKDataDetectorTypeNone 不执行检测

WKDataDetectorTypePhoneNumber 电话号码

WKDataDetectorTypeLink 文本中的url

WKDataDetectorTypeAddress 地址

WKDataDetectorTypeCalendarEvent 在未来的日期和时间

WKDataDetectorTypeTrackingNumber 跟踪号码/查询号/运单号

WKDataDetectorTypeFlightNumber 航班号

WKDataDetectorTypeLookupSuggestion

WKDataDetectorTypeSpotlightSuggestion Spotlight的建议(已弃用)

WKDataDetectorTypeAll 上述所有检测类型。选择此值将自动包含添加到这个常量的任何新的检测类型

WKURLSchemeHandler

用来处理WebKit无法处理的URL Scheme类型的资源

开始加载特定资源时调用

- (void)webView:(WKWebView *)webView startURLSchemeTask:(id<WKURLSchemeTask>)urlSchemeTask;

停止载特定资源时调用

- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id<WKURLSchemeTask>)urlSchemeTask;
  • WebKit将在你的handler停止处理这个任务时调用这个方法
  • 在此此方法调用之后,你的handler不应该调用这个任务的任何方法,否则会触发异常

WKURLSchemeTask

用来加载资源的任务

加载的请求

@property(nonatomic, readonly, copy) NSURLRequest *request;

设置当前任务的response

- (void)didReceiveResponse:(NSURLResponse *)response;
  • 每个任务必须至少调用一次这个方法
  • 如果你尝试在任务完成后发送一个新的response对象,会触发异常
  • 如果在任务已经停止加载后调用,将会触发异常

为任务添加接收的数据

- (void)didReceiveData:(NSData *)data;
  • 在任务接受到最终的response对象后,你应当开始发送数据
  • 每次调用这个方法,新的数据都会append到之前的数据后
  • 如果你尝试在发送response之前或者任务已经结束之后发送数据,将会触发异常
  • 如果在任务已经停止加载后调用,将会触发异常

将任务标记为成功完成

- (void)didFinish;
  • 如果你尝试在发送response之前或者任务已经结束之后调用该方法,将会触发异常
  • 如果在任务已经停止加载后调用,将会触发异常

把任务标记为失败

- (void)didFailWithError:(NSError *)error;
  • 如果在任务已经被标记为结束或失败后再调用这个方法会触发异常
  • 如果在任务已经停止加载后调用,将会触发异常
正常情况的调用顺序应该是:
didReceiveResponse(至少1次)
didReceiveResponse
didReceiveResponse
...
didReceiveData(至少0次)
didReceiveData
didReceiveData
...
didFinish/didFailWithError(务必调用)

但是在任务被停止后,应该立即停止上面的任何调用

WKNavigationDelegate

通过实现WKNavigationDelegate协议的方法可以自定义WebView接受、加载和完成浏览请求过程的一些行为。

当WebView开始接收网页内容时触发

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

当WevView的内容开始加载时触发

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

主机地址重定向时触发

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

当WebView需要响应网页的登录请求时触发

- (void)webView:(WKWebView *)webView didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge completionHandler:(void (^)(NSURLSessionAuthChallengeDisposition disposition, NSURLCredential *credential))completionHandler;
  • 稍后再详细研究

页面发生错误时触发

- (void)webView:(WKWebView *)webView didFailNavigation:(WKNavigation *)navigation withError:(NSError *)error;

当页面加载内容过程中发生错误时触发

- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation withError:(NSError *)error;

当前页面加载完成后触发

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

当WebContent进程中止时触发

- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView;

决定是否允许或者取消一次页面加载请求

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
  • WKNavigationAction描述了触发本次请求的行为
  • decisionHandler block在app已经决定允许或取消页面请求时调用
  • 这个block携带一个参数,是WKNavigationActionPolicy枚举类型
  • WKNavigationActionPolicy枚举包括WKNavigationActionPolicyCancel取消和WKNavigationActionPolicyAllow允许两个枚举值
  • 你可以立即调用该block或者保存block并在以后的时间异步调用它

在已经收到response时决定是否允许或者取消页面的加载

- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
  • WKNavigationResponse描述了response的信息
  • decisionHandler block在app已经决定允许或取消页面加载时调用
  • 这个block携带一个参数,是WKNavigationResponsePolicy枚举类型
  • WKNavigationResponsePolicy枚举类型包括WKNavigationResponsePolicyCancel取消和WKNavigationResponsePolicyAllow允许两个枚举值
  • 你可以立即调用该block或者保存block并在以后的时间异步调用它。

WKNavigation

WKNavigation对象包含了跟踪页面加载过程的信息

WebView的load方法会返回一个WKNavigation对象,并会将其传递给WKNavigationDelegate的方法,从开始到结束唯一地标识一个网页加载过程。它没有自己的方法或属性。

WKNavigationActionPolicy

WKNavigationActionPolicyCancel 取消请求

WKNavigationActionPolicyAllow 允许继续

WKNavigationResponsePolicy

WKNavigationResponsePolicyCancel 取消加载

WKNavigationResponsePolicyAllow 允许继续

WKNavigationAction

WKNavigationAction对象包含了可能导致一次加载的操作的信息,用于制定策略决策。

加载的请求信息

@property(nonatomic, readonly, copy) NSURLRequest *request;

产生这次请求的frame信息

@property(nonatomic, readonly, copy) WKFrameInfo *sourceFrame;

请求的目标frame,如果时一个新的窗口请求则是nil

@property(nonatomic, readonly, copy) WKFrameInfo *targetFrame;

触发本次浏览请求的操作类型。见WKNavigationType枚举

@property(nonatomic, readonly) WKNavigationType navigationType;

WKNavigationType

WKNavigationTypeLinkActivated 带有href属性的链接被用户激活

WKNavigationTypeFormSubmitted 一个表单提交

WKNavigationTypeBackForward 向前向后的导航请求

WKNavigationTypeReload 网页重新加载

WKNavigationTypeFormResubmitted 重新提交表单(例如后退、前进或重新加载)

WKNavigationTypeOther由于其他原因

WKNavigationResponse

WKNavigationResponse对象包含用于制定策略决策的浏览响应信息

指示WebKit是否可以原生地支持显示这种MIME类型

@property(nonatomic, readonly) BOOL canShowMIMEType;

指示本次加载的frame是否是main frame

@property(nonatomic, readonly, getter=isForMainFrame) BOOL forMainFrame;

frame的response信息

@property(nonatomic, readonly, copy) NSURLResponse *response;
  • 如果允许了一个带有无法显示的MIME类型响应,会导致浏览加载失败

WKUIDelegate

提供为网页展示native用户界面的方法。WebView用户界面通过实现这个协议来控制新窗口的打开,增强用户单击元素时显示的默认菜单项的表现,并执行其他用户界面相关的任务。这些方法可以通过处理JavaScript或其他插件内容来调用。默认每个WebView一个窗口,如果需要实现一个非常规用户界面,需要依靠WKUIDelegate来实现。

创建一个新的WebView

- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
  • configuration是创建新WebView的配置
  • navigationAction是触发本次调用的操作
  • windowFeatures是本次请求的窗口属性
  • 创建的新WebView一定要使用指定的configuration
  • WebKit将会在返回的WebView中加载请求

显示一个JavScript 警告界面

- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
  • message是要显示的内容
  • frame的JavaScript进程发起这次调用
  • 在警告界面被解除之后调用completionHandler来回调给页面
  • 为了安全,实现这个方法的时候需要注意到警告的内容是有一个特定的网站指定的,这里有一个简单的准则就是用frame.request.URL.host属性来标识这个警告。
  • 警告应该只有一个确定按钮

显示一个JavScript 确认界面

- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
  • message是要显示的内容
  • frame的JavaScript进程发起这次调用
  • 在确认界面被解除之后调用completionHandler来回调给页面,点击确定传YES,取消传NO
  • 为了安全,实现这个方法的时候需要注意到确认的内容是有一个特定的网站指定的,这里有一个简单的准则就是用frame.request.URL.host属性来标识这个确认界面
  • 确认界面应该只有两个按钮,典型的就是确认和取消

显示一个JavaScript输入界面

- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *result))completionHandler;
  • message是要显示的内容
  • defaultText是在输入框中展示的默认文本
  • frame的JavaScript进程发起这次调用
  • 在输入界面被解除之后调用completionHandler来回调给页面,点击确定传输入框的文本,取消传nil
  • 为了安全,实现这个方法的时候需要注意到确认的内容是有一个特定的网站指定的,这里有一个简单的准则就是用frame.request.URL.host属性来标识这个确认界面
  • 确认界面应该只有两个按钮(典型的就是确认和取消)和一个输入框

通知app网页的DOM窗口已经关闭

- (void)webViewDidClose:(WKWebView *)webView;
  • app应该从控件关系中移除这个WebView并重新安排界面的显示
  • 例如关闭一个浏览器tab或者窗口

iOS 10.0+决定是否要预览指定的WKPreviewElementInfo

- (BOOL)webView:(WKWebView *)webView shouldPreviewElement:(WKPreviewElementInfo *)elementInfo;
  • 返回NO会禁止本次预览
  • 这个方法只会在元素有默认的预览时调用

iOS 10.0+当用户发出了预览操作(比如3D Touch按压)时调用

- (UIViewController *)webView:(WKWebView *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray<id<WKPreviewActionItem>> *)previewActions;
  • elementInfo是相关的预览信息
  • previewActions是元素使用的默认的操作选项(预览时上拉可见),比如打开链接,添加到阅读列表,拷贝链接,共享。返回nil则使用默认的预览表现
  • 如果返回一个视图控制器则预览会显示这个视图控制器,并且在用户触发pop操作(继续按压)时触发webView:commitPreviewingViewController: 的调用
  • 如果要使用默认预览操作,应用程序必须在返回的视图控制器的previewActionItems实现中运行这些操作

iOS 10.0+预览时用户触发pop操作(继续按压)时调用

- (void)webView:(WKWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController;
  • previewingViewController就是即将展示的预览页面
  • 你需要将这个预览界面在界面中继续展示,以保持预览的连贯性
  • 如果你在这里什么也不做,用户的pop操作将什么也不会改变

WKWindowFeatures

WKWindowFeatures对象指定了请求一个新WebView时的窗口的可选属性

窗口是否可以调整尺寸(Boolean)

@property(nonatomic, readonly) NSNumber *allowsResizing;
  • nil表示未被指定该属性

窗口的高度(CGFloat)

@property(nonatomic, readonly) NSNumber *height;
  • nil表示未指定该属性

窗口的宽度(CGFloat)

@property(nonatomic, readonly) NSNumber *width;
  • nil表示未指定该属性

窗口的x坐标(CGFloat)

@property(nonatomic, readonly) NSNumber *x;
  • nil表示未指定该属性

窗口的y坐标(CGFloat)

@property(nonatomic, readonly) NSNumber *y;
  • nil表示未指定该属性

菜单栏是否应该可见(Boolean)

@property(nonatomic, readonly) NSNumber *menuBarVisibility;
  • nil表示未指定该属性

状态栏是否应该可见(Boolean)

@property(nonatomic, readonly) NSNumber *statusBarVisibility;
  • nil表示未指定该属性

工具栏是否应该可见(Boolean)

@property(nonatomic, readonly) NSNumber *toolbarsVisibility;
  • nil表示未指定该属性

WKPreviewElementInfo

WKPreviewElementInfo对象包含了预览网页的信息

预览网页的链接

@property(nonatomic, readonly) NSURL *linkURL;

WKPreviewActionItem

WKPreviewActionItem协议提供预览操作的一些属性的访问方法。继承自UIPreviewActionItem。

预览操作的标志符

@property(nonatomic, copy, readonly) NSString *identifier;

UIPreviewActionItem

快速选择操作:例如3D Touch桌面图标触发,会弹出一个或多个快速选择的表单。触发后也可以滑动选择,松开选中。

一组方法定义了您可以应用于快速选择操作和快速选择操作组的样式,并定义了一个只读访问器,用于用户可见的快速选择操作的标题。

UIPreviewActionItem被 UIPreviewAction 和 UIPreviewActionGroup 类采用,请不要应用到自定义的类上。

快速选择操作的标题。系统将标题作为一个快速选择表单中的选项,当用户在上面滑动时可以看到。

@property(nonatomic, copy, readonly) NSString *title;

WKBackForwardList

一个WKBackForwardList对象维护了用户访问过的网页记录,用来前进后退到最近加载过的网页。WKBackForwardList对象仅仅维护的是列表数据,并不会执行任何实际的网页加载的操作,不会产生任何客户请求。如果你需要产生一次页面加载,请使用loadRequest: 这些方法。

上一个记录

@property(nonatomic, readonly, strong) WKBackForwardListItem *backItem;
  • 如果没有,则为nil

当前记录

@property(nonatomic, readonly, strong) WKBackForwardListItem *currentItem;

下一个记录

@property(nonatomic, readonly, strong) WKBackForwardListItem *forwardItem;
  • 如果没有,则为nil

相对于当前记录的位置的记录

- (WKBackForwardListItem *)itemAtIndex:(NSInteger)index;
  • 当前位置的index为0,-1就是上一个记录,1就是下一个记录,依此类推
  • 如果index超出范围,则返回nil

当前记录之前的记录列表

@property(nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *backList;
  • 顺序就是访问顺序

当前记录之后的记录列表

@property(nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *forwardList;
  • 顺序就是访问顺序

WKBackForwardListItem

WKBackForwardListItem对象代表了前进后退记录中的一个网页,包含了网页的一些信息(URL,标题和创建网页时的URL),前进后退记录由WKBackForwardList维护。

网页的URL

@property(readonly, copy) NSURL *URL;

创建记录时初始化传入的URL

@property(readonly, copy) NSURL *initialURL;

网页的标题

@property(readonly, copy) NSString *title;