WKWebView主要涉及到以下类或协议,各部分可能互相依赖,文章按照apple文档的划分对每一个模块进行了详细的解释
配置和偏好
进程分配
页面导航管理
用户界面
脚本注入
缓存数据和持久化
处理WebKit无法处理的URL Scheme类型的资源
页面结构
内容拦截
3D-Touch预览
一个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;
@property (nonatomic, readonly, copy) WKWebViewConfiguration *configuration;
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration;
@property(nonatomic, readonly, strong) UIScrollView *scrollView;
@property(nonatomic, readonly, copy) NSString *title;
@property(nonatomic, readonly, copy) NSURL *URL;
@property(nonatomic, copy) NSString *customUserAgent;
@property(nonatomic, readonly) SecTrustRef serverTrust;
@property(nonatomic, readonly, copy) NSArray *certificateChain;
@property(nonatomic, weak) id<WKNavigationDelegate> navigationDelegate;
@property (nullable, nonatomic, weak) id <WKUIDelegate> UIDelegate;
@property(nonatomic, readonly) double estimatedProgress;
@property(nonatomic, readonly) BOOL hasOnlySecureContent;
- (WKNavigation *)loadHTMLString:(NSString *)string baseURL:(NSURL *)baseURL;
@property(nonatomic, readonly, getter=isLoading) BOOL loading;
- (WKNavigation *)reload;
- (WKNavigation *)reloadFromOrigin;
- (void)stopLoading;
- (WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL;
- (WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL;
@property(nonatomic) BOOL allowsMagnification;
@property(nonatomic) CGFloat magnification;
- (void)setMagnification:(CGFloat)magnification centeredAtPoint:(CGPoint)point;
@property(nonatomic) BOOL allowsBackForwardNavigationGestures;
@property (nonatomic, readonly, strong) WKBackForwardList *backForwardList;
@property(nonatomic, readonly) BOOL canGoBack;
@property(nonatomic, readonly) BOOL canGoForward;
@property(nonatomic) BOOL allowsLinkPreview;
WKWebView
类转换为SFSafariViewController
类SFSafariViewController
自动支持链接预览- (WKNavigation *)goBack;
- (WKNavigation *)goForward;
- (WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;
WKBackForwardList
中的一个记录WKNavigation
对象- (WKNavigation *)loadRequest:(NSURLRequest *)request;
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^)(id, NSError *error))completionHandler;
- (void)takeSnapshotWithConfiguration:(WKSnapshotConfiguration *)snapshotConfiguration completionHandler:(void (^)(UIImage *snapshotImage, NSError *error))completionHandler;
使用WKWebViewConfiguration类,你可以决定网页的渲染时机,媒体的播放方式,用户选择项目的粒度,以及很多其他的选项。
WKWebViewConfiguration只会在webview第一次初始化的时候使用,你不能用此类来改变一个已经初始化完成的webview的配置。
@property(nonatomic, copy) NSString *applicationNameForUserAgent;
@property(nonatomic, strong) WKPreferences *preferences;
@property(nonatomic, strong) WKProcessPool *processPool;
WKUserContentController
对象@property(nonatomic, strong) WKUserContentController *userContentController;
@property(nonatomic, strong) WKWebsiteDataStore *websiteDataStore;
@property(nonatomic) BOOL ignoresViewportScaleLimits;
@property(nonatomic) BOOL suppressesIncrementalRendering;
@property(nonatomic) BOOL allowsInlineMediaPlayback;
@property(nonatomic) BOOL allowsAirPlayForMediaPlayback;
@property(nonatomic) BOOL allowsPictureInPictureMediaPlayback;
@property(nonatomic) WKAudiovisualMediaTypes mediaTypesRequiringUserActionForPlayback;
@property(nonatomic) BOOL mediaPlaybackAllowsAirPlay;
@property(nonatomic) BOOL requiresUserActionForMediaPlayback;
@property(nonatomic) BOOL mediaPlaybackRequiresUserAction;
@property(nonatomic) WKSelectionGranularity selectionGranularity;
@property(nonatomic) WKUserInterfaceDirectionPolicy userInterfaceDirectionPolicy;
- (void)setURLSchemeHandler:(id<WKURLSchemeHandler>)urlSchemeHandler forURLScheme:(NSString *)urlScheme;
handlesURLScheme:
方法来判断WebKit是否可以处理一个特定的URL Scheme- (id<WKURLSchemeHandler>)urlSchemeHandlerForURLScheme:(NSString *)urlScheme;
一个WKPreferences封装了一个webview的偏好选项,在WKWebViewConfiguration中设置
@property(nonatomic) CGFloat minimumFontSize;
@property(nonatomic) BOOL javaScriptEnabled;
@property (nonatomic) BOOL javaScriptCanOpenWindowsAutomatically;
一个WKProcessPool对象代表Web Content的进程池。
与WebView的进程池关联的进程池通过其configuration来配置。每个WebView都有自己的Web Content进程,最终由一个有具体实现的进程来限制;在此之后,具有相同进程池的WebView最终共享Web Content进程。
WKProcessPool对象只是一个简单的不透明token,本身没有属性或者方法。
WKUserContentController对象提供了一种向WebView发送JavaScript消息或者注入JavaScript脚本的方法
- (void)addScriptMessageHandler:(id<WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
- (void)addUserScript:(WKUserScript *)userScript;
- (void)removeAllUserScripts;
- (void)removeScriptMessageHandlerForName:(NSString *)name;
@property(nonatomic, readonly, copy) NSArray<WKUserScript *> *userScripts;
- (void)addContentRuleList:(WKContentRuleList *)contentRuleList;
- (void)removeContentRuleList:(WKContentRuleList *)contentRuleList;
- (void)removeAllContentRuleLists;
为一个实现了WKScriptMessageHandler协议的类提供一个接收来自网页的JavaScript调用的方法
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
一个WKScriptMessage对象包含了一个JavaScritp消息的相关信息
@property(nonatomic, readonly, copy) id body;
NSNumber
, NSString
, NSDate
, NSArray
, NSDictionary
, NSNull
@property(nonatomic, readonly, copy) WKFrameInfo *frameInfo;
@property(nonatomic, readonly, copy) NSString *name;
@property(nonatomic, readonly, weak) WKWebView *webView;
一个WKFrameInfo对象包含了一个网页中的farme的相关信息。其只是一个描述瞬时状态的纯数据对象,不能用来在多次消息调用中唯一标识一个frame。
@property(nonatomic, readonly, getter=isMainFrame) BOOL mainFrame;
@property(nonatomic, readonly, copy) NSURLRequest *request;
@property(nonatomic, readonly) WKSecurityOrigin *securityOrigin;
@property(nonatomic, readonly, weak) WKWebView *webView;
一个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对象代表了一个可以被注入网页中的脚本
- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
@property(nonatomic, readonly, copy) NSString *source;
@property(nonatomic, readonly) WKUserScriptInjectionTime injectionTime;
@property(nonatomic, readonly, getter=isForMainFrameOnly) BOOL forMainFrameOnly;
WKUserScriptInjectionTimeAtDocumentStart
在document element创建之后,在所有其他内容加载之前
WKUserScriptInjectionTimeAtDocumentEnd
在document加载完成之后,在其他子资源加载完成之前
一个编译过的规则列表,应用到Web Content上。从WKContentExtensionStore中创建或者取得。
@property(nonatomic, readonly, copy) NSString *identifier;
+ (instancetype)defaultStore;
+ (instancetype)storeWithURL:(NSURL *)url;
- (void)getAvailableContentRuleListIdentifiers:(void (^)(NSArray<NSString *> *))completionHandler;
- (void)lookUpContentRuleListForIdentifier:(NSString *)identifier completionHandler:(void (^)(WKContentRuleList *, NSError *))completionHandler;
- (void)compileContentRuleListForIdentifier:(NSString *)identifier encodedContentRuleList:(NSString *)encodedContentRuleList completionHandler:(void (^)(WKContentRuleList *, NSError *))completionHandler;
- (void)removeContentRuleListForIdentifier:(NSString *)identifier completionHandler:(void (^)(NSError *))completionHandler;
一个WKWebsiteDataStore对象代表了被网页使用的各种类型的数据。包括cookies,磁盘文件,内存缓存以及持久化数据如WebSQL,IndexedDB数据库,local storage。
+ (WKWebsiteDataStore *)defaultDataStore;
+ (WKWebsiteDataStore \*)nonPersistentDataStore;
@property(nonatomic, readonly, getter=isPersistent) BOOL persistent;
@property(nonatomic, readonly) WKHTTPCookieStore *httpCookieStore;
- (void)fetchDataRecordsOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(NSArray<WKWebsiteDataRecord *> *))completionHandler;
Available Data Types
+ (NSSet<NSString *> *)allWebsiteDataTypes;
Available Data Types
- (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes forDataRecords:(NSArray<WKWebsiteDataRecord *> *)dataRecords completionHandler:(void (^)(void))completionHandler;
- (void)removeDataOfTypes:(NSSet<NSString *> *)websiteDataTypes modifiedSince:(NSDate *)date completionHandler:(void (^)(void))completionHandler;
管理与特定的WKWebsiteDataStore关联的HTTP cookie的对象
- (void)getAllCookies:(void (^)(NSArray<NSHTTPCookie *> *))completionHandler;
- (void)setCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler;
- (void)deleteCookie:(NSHTTPCookie *)cookie completionHandler:(void (^)(void))completionHandler;
- (void)addObserver:(id<WKHTTPCookieStoreObserver>)observer;
- (void)removeObserver:(id<WKHTTPCookieStoreObserver>)observer;
- (void)cookiesDidChangeInCookieStore:(WKHTTPCookieStore *)cookieStore;
一个WKWebsiteDataRecord对象代表了按照源URL的domain名和后缀分类的网页数据
@property(nonatomic, readonly, copy) NSSet<NSString *> *dataTypes;
Available Data Types
@property(nonatomic, readonly, copy) NSString *displayName;
定义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;
WKAudiovisualMediaTypeNone
都不需要用户的手势就能开始播放
WKAudiovisualMediaTypeAudio
包含音频的媒体类型需要用户的手势才能开始播放
WKAudiovisualMediaTypeVideo
包含视频的媒体类型需要用户的手势才能开始播放
WKAudiovisualMediaTypeAll
所有的媒体类型都需要用户的手势才能开始播放
WKSelectionGranularityCharacter
选择端点可以放置在任何字符边界上
WKSelectionGranularityDynamic
选择的粒度取决于选择的不同。当选择是在单一块中时粒度可能是单个的字符,当选择不是局限于单一块,粒度可能是一个块
用于确定WebView中用户界面元素的方向性的策略。包括ltr(从左到右)和rtl(从右到左)两种方向。文本的书写方向就由此属性来指定。
WKUserInterfaceDirectionPolicyContent
方向性遵循CSS /HTML/ XHTML规范。这是userInterfaceDirectionPolicy的默认值。可以参见CSS direction属性或者HTML dir属性。
WKUserInterfaceDirectionPolicySystem
方向性遵循View的userInterfaceLayoutDirection属性。NSUserInterfaceLayoutDirection包括NSUserInterfaceLayoutDirectionLeftToRight和NSUserInterfaceLayoutDirectionRightToLeft两个枚举值。
WKDataDetectorTypeNone
不执行检测
WKDataDetectorTypePhoneNumber
电话号码
WKDataDetectorTypeLink
文本中的url
WKDataDetectorTypeAddress
地址
WKDataDetectorTypeCalendarEvent
在未来的日期和时间
WKDataDetectorTypeTrackingNumber
跟踪号码/查询号/运单号
WKDataDetectorTypeFlightNumber
航班号
WKDataDetectorTypeLookupSuggestion
WKDataDetectorTypeSpotlightSuggestion
Spotlight的建议(已弃用)
WKDataDetectorTypeAll
上述所有检测类型。选择此值将自动包含添加到这个常量的任何新的检测类型
用来处理WebKit无法处理的URL Scheme类型的资源
- (void)webView:(WKWebView *)webView startURLSchemeTask:(id<WKURLSchemeTask>)urlSchemeTask;
- (void)webView:(WKWebView *)webView stopURLSchemeTask:(id<WKURLSchemeTask>)urlSchemeTask;
用来加载资源的任务
@property(nonatomic, readonly, copy) NSURLRequest *request;
- (void)didReceiveResponse:(NSURLResponse *)response;
- (void)didReceiveData:(NSData *)data;
- (void)didFinish;
- (void)didFailWithError:(NSError *)error;
正常情况的调用顺序应该是:
didReceiveResponse(至少1次)
didReceiveResponse
didReceiveResponse
...
didReceiveData(至少0次)
didReceiveData
didReceiveData
...
didFinish/didFailWithError(务必调用)
但是在任务被停止后,应该立即停止上面的任何调用
通过实现WKNavigationDelegate协议的方法可以自定义WebView接受、加载和完成浏览请求过程的一些行为。
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
- (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;
- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
WKNavigation对象包含了跟踪页面加载过程的信息
WebView的load方法会返回一个WKNavigation对象,并会将其传递给WKNavigationDelegate的方法,从开始到结束唯一地标识一个网页加载过程。它没有自己的方法或属性。
WKNavigationActionPolicyCancel
取消请求
WKNavigationActionPolicyAllow
允许继续
WKNavigationResponsePolicyCancel
取消加载
WKNavigationResponsePolicyAllow
允许继续
WKNavigationAction对象包含了可能导致一次加载的操作的信息,用于制定策略决策。
@property(nonatomic, readonly, copy) NSURLRequest *request;
@property(nonatomic, readonly, copy) WKFrameInfo *sourceFrame;
@property(nonatomic, readonly, copy) WKFrameInfo *targetFrame;
@property(nonatomic, readonly) WKNavigationType navigationType;
WKNavigationTypeLinkActivated
带有href属性的链接被用户激活
WKNavigationTypeFormSubmitted
一个表单提交
WKNavigationTypeBackForward
向前向后的导航请求
WKNavigationTypeReload
网页重新加载
WKNavigationTypeFormResubmitted
重新提交表单(例如后退、前进或重新加载)
WKNavigationTypeOther
由于其他原因
WKNavigationResponse对象包含用于制定策略决策的浏览响应信息
@property(nonatomic, readonly) BOOL canShowMIMEType;
@property(nonatomic, readonly, getter=isForMainFrame) BOOL forMainFrame;
@property(nonatomic, readonly, copy) NSURLResponse *response;
提供为网页展示native用户界面的方法。WebView用户界面通过实现这个协议来控制新窗口的打开,增强用户单击元素时显示的默认菜单项的表现,并执行其他用户界面相关的任务。这些方法可以通过处理JavaScript或其他插件内容来调用。默认每个WebView一个窗口,如果需要实现一个非常规用户界面,需要依靠WKUIDelegate来实现。
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString *result))completionHandler;
- (void)webViewDidClose:(WKWebView *)webView;
- (BOOL)webView:(WKWebView *)webView shouldPreviewElement:(WKPreviewElementInfo *)elementInfo;
- (UIViewController *)webView:(WKWebView *)webView previewingViewControllerForElement:(WKPreviewElementInfo *)elementInfo defaultActions:(NSArray<id<WKPreviewActionItem>> *)previewActions;
- (void)webView:(WKWebView *)webView commitPreviewingViewController:(UIViewController *)previewingViewController;
WKWindowFeatures对象指定了请求一个新WebView时的窗口的可选属性
@property(nonatomic, readonly) NSNumber *allowsResizing;
@property(nonatomic, readonly) NSNumber *height;
@property(nonatomic, readonly) NSNumber *width;
@property(nonatomic, readonly) NSNumber *x;
@property(nonatomic, readonly) NSNumber *y;
@property(nonatomic, readonly) NSNumber *menuBarVisibility;
@property(nonatomic, readonly) NSNumber *statusBarVisibility;
@property(nonatomic, readonly) NSNumber *toolbarsVisibility;
WKPreviewElementInfo对象包含了预览网页的信息
@property(nonatomic, readonly) NSURL *linkURL;
WKPreviewActionItem协议提供预览操作的一些属性的访问方法。继承自UIPreviewActionItem。
@property(nonatomic, copy, readonly) NSString *identifier;
快速选择操作:例如3D Touch桌面图标触发,会弹出一个或多个快速选择的表单。触发后也可以滑动选择,松开选中。
一组方法定义了您可以应用于快速选择操作和快速选择操作组的样式,并定义了一个只读访问器,用于用户可见的快速选择操作的标题。
UIPreviewActionItem被 UIPreviewAction 和 UIPreviewActionGroup 类采用,请不要应用到自定义的类上。
@property(nonatomic, copy, readonly) NSString *title;
一个WKBackForwardList对象维护了用户访问过的网页记录,用来前进后退到最近加载过的网页。WKBackForwardList对象仅仅维护的是列表数据,并不会执行任何实际的网页加载的操作,不会产生任何客户请求。如果你需要产生一次页面加载,请使用loadRequest: 这些方法。
@property(nonatomic, readonly, strong) WKBackForwardListItem *backItem;
@property(nonatomic, readonly, strong) WKBackForwardListItem *currentItem;
@property(nonatomic, readonly, strong) WKBackForwardListItem *forwardItem;
- (WKBackForwardListItem *)itemAtIndex:(NSInteger)index;
@property(nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *backList;
@property(nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *forwardList;
WKBackForwardListItem对象代表了前进后退记录中的一个网页,包含了网页的一些信息(URL,标题和创建网页时的URL),前进后退记录由WKBackForwardList维护。
@property(readonly, copy) NSURL *URL;
@property(readonly, copy) NSURL *initialURL;
@property(readonly, copy) NSString *title;
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。