WKWebView提供了遠(yuǎn)比UIWebView多的類,可以實(shí)現(xiàn)更加豐富的功能,它有自己的框架WebKit,框架內(nèi)包含了所有相關(guān)的類。本文就將所有的類按照Apple文檔的劃分進(jìn)行講解。
后續(xù)在實(shí)際使用中有新的理解會繼續(xù)補(bǔ)充
- WebKit結(jié)構(gòu)認(rèn)識
- web視圖認(rèn)識
- web視圖的配置
- 數(shù)據(jù)管理
- 導(dǎo)航相關(guān)
- 下載
- 網(wǎng)頁內(nèi)容的處理
- 網(wǎng)頁搜索
- 上下文菜單
- 快照配置
1、WebKit結(jié)構(gòu)認(rèn)識
使用WebKit框架將樣式豐富的web內(nèi)容集成到應(yīng)用程序的原生內(nèi)容中。WebKit為web界面提供了完整的瀏覽體驗(yàn)。
通過WebKit框架可以完成一系列事情:
- 使用HTML、CSS和JavaScript顯示豐富的web內(nèi)容;
- 處理頁面內(nèi)容的更多的加載過程;
- 顯示多個(gè)MIME類型和復(fù)合框架元素;
- 在內(nèi)容頁面之間導(dǎo)航;
- 管理最近訪問頁面的前后列表。
也就是說,我們在自定義視圖層次結(jié)構(gòu)中呈現(xiàn)一個(gè)WKWebView對象并加載網(wǎng)頁內(nèi)容。使用相應(yīng)的對象來管理cookie、執(zhí)行腳本、控制導(dǎo)航、生成快照和執(zhí)行基于文本的搜索。

2、 web視圖認(rèn)識
通過WKWebView類來顯示web視圖內(nèi)容,通過WKUIDelegate協(xié)議在web頁面顯示本地用戶界面元素
2.1 WKWebView
2.1.1 簡單使用過程
1、請使用WKWebViewConfiguration對象以編程方式創(chuàng)建web視圖,
2、在你的web視圖出現(xiàn)在屏幕上之前,使用URLRequest結(jié)構(gòu)從web服務(wù)器加載內(nèi)容,或者直接從本地文件或HTML字符串加載內(nèi)容。
3、符合WKNavigationDelegate協(xié)議可以實(shí)現(xiàn)編程導(dǎo)航
2.1.2 創(chuàng)建web視圖
API:
// 通過configuration來創(chuàng)建視圖
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
//通過coder對象來創(chuàng)建視圖
- (nullable instancetype)initWithCoder:(NSCoder *)coder NS_DESIGNATED_INITIALIZER;
//通過webview獲取其配置對象
@property (nonatomic, readonly, copy) WKWebViewConfiguration *configuration;
2.1.3 鏈接是否可以加載
API:
+ (BOOL)handlesURLScheme:(NSString *)urlScheme;
說明:
- 返回一個(gè)布爾值,檢查WKWebViews是否默認(rèn)處理給定的URL方案。
2.1.4 顯示本地用戶界面
API:
@property (nullable, nonatomic, weak) id <WKUIDelegate> UIDelegate;
說明:
- web視圖用戶界面代理,用來集成自定義用戶界面元素的對象,如上下文菜單或面板,到web視圖交互。
2.1.5 管理網(wǎng)頁導(dǎo)航
API:
@property (nullable, nonatomic, weak) id <WKNavigationDelegate> navigationDelegate;
說明:
- 用來管理web視圖的導(dǎo)航行為的對象。
- 用于接受或拒絕導(dǎo)航更改的方法,以及用于跟蹤導(dǎo)航請求的進(jìn)度的方法。
2.1.6 加載網(wǎng)頁
API:
//加載指定URL請求對象引用的web內(nèi)容,并導(dǎo)航到該內(nèi)容。
- (nullable WKNavigation *)loadRequest:(NSURLRequest *)request;
//加載指定數(shù)據(jù)對象的內(nèi)容并導(dǎo)航到該對象。
- (nullable WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL
//加載指定HTML字符串的內(nèi)容并導(dǎo)航到它。
- (nullable WKNavigation *)loadHTMLString:(NSString *)string baseURL:(nullable NSURL *)baseURL;
//從URL請求對象指定的文件中加載web內(nèi)容,并導(dǎo)航到該內(nèi)容。
- (WKNavigation *)loadFileRequest:(NSURLRequest *)request allowingReadAccessToURL:(NSURL *)readAccessURL
//從指定的文件加載web內(nèi)容并導(dǎo)航到它。
- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL
//從您提供的數(shù)據(jù)中加載web內(nèi)容,就像數(shù)據(jù)是對請求的響應(yīng)一樣。
- (WKNavigation *)loadSimulatedRequest:(NSURLRequest *)request response:(NSURLResponse *)response responseData:(NSData *)data
//從您提供的HTML中加載web內(nèi)容,就好像HTML是對請求的響應(yīng)一樣。
- (WKNavigation *)loadSimulatedRequest:(NSURLRequest *)request responseHTMLString:(NSString *)string
//一個(gè)布爾值,指示視圖當(dāng)前是否正在加載內(nèi)容。
@property (nonatomic, readonly, getter=isLoading) BOOL loading;
//估計(jì)當(dāng)前導(dǎo)航已經(jīng)加載了多少部分。
@property (nonatomic, readonly) double estimatedProgress;
2.1.7 管理加載進(jìn)程
API:
//重新加載當(dāng)前網(wǎng)頁
- (nullable WKNavigation *)reload;
//重新加載當(dāng)前網(wǎng)頁
// @param sender The object that sent this message.
- (IBAction)reload:(nullable id)sender;
//重新加載當(dāng)前網(wǎng)頁,如果可能的話,使用緩存驗(yàn)證條件對內(nèi)容進(jìn)行端到端重新驗(yàn)證。
// @result A new navigation representing the reload.
- (nullable WKNavigation *)reloadFromOrigin;
//重新加載當(dāng)前網(wǎng)頁,如果可能的話,使用緩存驗(yàn)證條件對內(nèi)容進(jìn)行端到端重新驗(yàn)證。
- (IBAction)reloadFromOrigin:(nullable id)sender;
//停止加載當(dāng)前頁面上的所有資源。
- (void)stopLoading;
//停止加載當(dāng)前頁面上的所有資源。
- (IBAction)stopLoading:(nullable id)sender;
2.1.8 管理網(wǎng)頁的下載相關(guān)
API:
//開始在請求中的URL處下載資源。
- (void)startDownloadUsingRequest:(NSURLRequest *)request completionHandler:(void(^)(WKDownload *))completionHandler
//恢復(fù)失敗或取消的下載。
- (void)resumeDownloadFromResumeData:(NSData *)resumeData completionHandler:(void(^)(WKDownload *))completionHandler
2.1.9 查看視圖的信息
API:
與web視圖關(guān)聯(lián)的滾動(dòng)視圖。
@property (nonatomic, readonly, strong) UIScrollView *scrollView;
//頁面標(biāo)題
// @discussion @link WKWebView @/link is key-value observing (KVO) compliant
for this property.
@property (nullable, nonatomic, readonly, copy) NSString *title;
//URL
@property (nullable, nonatomic, readonly, copy) NSURL *URL;
//The media type for the contents of the web view.
@property (nonatomic, nullable, copy) NSString *mediaType
//自定義用戶代理字符串。
@property (nullable, nonatomic, copy) NSString *customUserAgent
//用于評估當(dāng)前網(wǎng)頁的信任程度的信任管理對象。
@property (nonatomic, readonly, nullable) SecTrustRef serverTrust
//一個(gè)布爾值,指示web視圖是否通過安全加密的連接加載頁面上的所有資源。
@property (nonatomic, readonly) BOOL hasOnlySecureContent;
//系統(tǒng)從網(wǎng)頁中第一個(gè)有效的元標(biāo)簽獲得的主題顏色。
@property (nonatomic, readonly, nullable) UIColor *themeColor
//web視圖在活動(dòng)頁面后面顯示的顏色,當(dāng)用戶滾動(dòng)到頁面邊界以外時(shí)可見。
@property (nonatomic, null_resettable, copy) UIColor *underPageBackgroundColor
2.1.10 縮放內(nèi)容
API:
//縮放因子,web視圖根據(jù)其邊界縮放內(nèi)容。
@property (nonatomic) CGFloat pageZoom
//一個(gè)布爾值,指示是否放大手勢會改變網(wǎng)頁視圖的放大。
@property (nonatomic) BOOL allowsMagnification;
//頁面內(nèi)容當(dāng)前縮放的因子。
@property (nonatomic) CGFloat magnification;
//縮放頁面內(nèi)容并將結(jié)果居中于指定的點(diǎn)。
- (void)setMagnification:(CGFloat)magnification centeredAtPoint:(CGPoint)point;
2.1.11 網(wǎng)頁與媒體的互動(dòng)
API:
//暫停web視圖中所有媒體的播放。
- (void)pauseAllMediaPlaybackWithCompletionHandler:(void (^_Nullable)(void))completionHandler
//獲取web視圖中媒體的播放狀態(tài)。
- (void)requestMediaPlaybackStateWithCompletionHandler:(void (^)(WKMediaPlaybackState))completionHandler
//改變網(wǎng)頁是否暫停播放頁面中的所有媒體。
- (void)setAllMediaPlaybackSuspended:(BOOL)suspended completionHandler:(void (^_Nullable)(void))completionHandler
//關(guān)閉web視圖顯示的所有媒體,包括圖中圖視頻和全屏視頻。
- (void)closeAllMediaPresentationsWithCompletionHandler:(void (^_Nullable)(void))completionHandler
2.1.12 管理麥克風(fēng)和攝像頭
API:
//枚舉屬性,指示網(wǎng)頁是否正在使用攝像機(jī)捕捉圖像或視頻。
@property (nonatomic, readonly) WKMediaCaptureState cameraCaptureState
//枚舉屬性,指示網(wǎng)頁是否使用麥克風(fēng)捕捉音頻。
@property (nonatomic, readonly) WKMediaCaptureState microphoneCaptureState
//設(shè)置網(wǎng)頁是否使用相機(jī)捕捉圖像或視頻。
- (void)setCameraCaptureState:(WKMediaCaptureState)state completionHandler:(void (^_Nullable)(void))completionHandler
//設(shè)置網(wǎng)頁是否使用麥克風(fēng)捕捉音頻。
- (void)setMicrophoneCaptureState:(WKMediaCaptureState)state completionHandler:(void (^_Nullable)(void))completionHandler
//一種枚舉,描述媒體設(shè)備(如照相機(jī)或麥克風(fēng))當(dāng)前是否捕獲音頻或視頻。
typedef NS_ENUM(NSInteger, WKMediaCaptureState) {
WKMediaCaptureStateNone,
WKMediaCaptureStateActive,
WKMediaCaptureStateMuted,
}
2.1.13 搜索當(dāng)前頁面的內(nèi)容
API:
//在web視圖的內(nèi)容中搜索指定的字符串。
- (void)findString:(NSString *)string withConfiguration:(nullable WKFindConfiguration *)configuration completionHandler:(void (^)(WKFindResult *result))completionHandler
說明:
- WKFindConfiguration是搜索web視圖內(nèi)容時(shí)使用的配置參數(shù)。
- WKFindResult包含搜索web視圖內(nèi)容的結(jié)果的對象。
2.1.14 網(wǎng)頁之間的導(dǎo)航
API:
//一個(gè)布爾值,指示水平滑動(dòng)手勢是否會觸發(fā)前后頁面導(dǎo)航。
//默認(rèn)為NO
@property (nonatomic) BOOL allowsBackForwardNavigationGestures;
//一個(gè)對象,用來管理以前加載的網(wǎng)頁列表,web視圖使用它來進(jìn)行向前和向后導(dǎo)航。
@property (nonatomic, readonly, strong) WKBackForwardList *backForwardList;
//后退一個(gè)網(wǎng)頁
// @result A new navigation to the requested item, or nil if there is no back
item in the back-forward list.
- (nullable WKNavigation *)goBack;
//后退一個(gè)網(wǎng)頁
- (IBAction)goBack:(nullable id)sender;
//向前一個(gè)網(wǎng)頁
- (nullable WKNavigation *)goForward;
//向前一個(gè)網(wǎng)頁
- (IBAction)goForward:(nullable id)sender;
//導(dǎo)航到歷史網(wǎng)頁列表中的某一個(gè)網(wǎng)頁
- (nullable WKNavigation *)goToBackForwardListItem:(WKBackForwardListItem *)item;
//一個(gè)布爾值,指示前向列表中是否存在有效的后向項(xiàng)。
@property (nonatomic, readonly) BOOL canGoBack;
//一個(gè)布爾值,指示前向列表中是否存在有效的前向項(xiàng)。
@property (nonatomic, readonly) BOOL canGoForward;
//一個(gè)布爾值,它決定按下鏈接是否顯示鏈接目的地的預(yù)覽。
@property (nonatomic) BOOL allowsLinkPreview
//一個(gè)對象,用來捕獲web視圖中當(dāng)前的交互狀態(tài),以便以后可以將該狀態(tài)恢復(fù)到另一個(gè)web視圖中。//WKWebView的交互狀態(tài)(前向列表,當(dāng)前加載的頁面,滾動(dòng)位置,表單數(shù)據(jù)…
//可以在另一個(gè)WKWebView中檢索和設(shè)置恢復(fù)狀態(tài)。
@property (nonatomic, nullable, copy) id interactionState
2.1.15 執(zhí)行JavaScript
API:
//執(zhí)行JavaScript腳本
- (void)evaluateJavaScript:(NSString *)javaScriptString completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler;
//在指定的框架和內(nèi)容世界中計(jì)算指定的JavaScript腳本。
- (void)evaluateJavaScript:(NSString *)javaScriptString inFrame:(nullable WKFrameInfo *)frame inContentWorld:(WKContentWorld *)contentWorld completionHandler:(void (^ _Nullable)(_Nullable id, NSError * _Nullable error))completionHandler
//將指定的字符串作為異步JavaScript函數(shù)執(zhí)行。
- (void)callAsyncJavaScript:(NSString *)functionBody arguments:(nullable NSDictionary<NSString *, id> *)arguments inFrame:(nullable WKFrameInfo *)frame inContentWorld:(WKContentWorld *)contentWorld completionHandler:(void (^ _Nullable)(_Nullable_result id, NSError * _Nullable error))completionHandler
2.1.16 獲取Web View的內(nèi)容
API:
//從web視圖的內(nèi)容異步生成一個(gè)平臺原生圖像。
- (void)takeSnapshotWithConfiguration:(nullable WKSnapshotConfiguration *)snapshotConfiguration completionHandler:(void (^)(UIImage * _Nullable snapshotImage, NSError * _Nullable error))completionHandler
//從web視圖的內(nèi)容異步生成PDF數(shù)據(jù)。
- (void)createPDFWithConfiguration:(nullable WKPDFConfiguration *)pdfConfiguration completionHandler:(void (^)(NSData * _Nullable pdfDocumentData, NSError * _Nullable error))completionHandler
//異步創(chuàng)建web視圖內(nèi)容的web存檔。
- (void)createWebArchiveDataWithCompletionHandler:(void (^)(NSData *, NSError *))completionHandler
//返回打印web視圖內(nèi)容時(shí)使用的打印操作對象。
- (NSPrintOperation *)printOperationWithPrintInfo:(NSPrintInfo *)printInfo
說明:
- WKSnapshotConfiguration是當(dāng)從web視圖的內(nèi)容生成圖像時(shí)使用的配置數(shù)據(jù)。
- WKPDFConfiguration是當(dāng)生成web視圖內(nèi)容的PDF表示時(shí)使用的配置數(shù)據(jù)。
2.2 WKUIDelegate
WKUIDelegate提供了網(wǎng)頁呈現(xiàn)本地用戶界面元素的方法,Web視圖用戶界面委托實(shí)現(xiàn)該協(xié)議來控制新窗口的打開,增加用戶單擊元素時(shí)顯示的默認(rèn)菜單項(xiàng)的行為,并執(zhí)行其他與用戶界面相關(guān)的任務(wù)。默認(rèn)的web視圖實(shí)現(xiàn)假設(shè)每個(gè)web視圖有一個(gè)窗口,所以非常規(guī)的用戶界面可能實(shí)現(xiàn)一個(gè)用戶界面委托。
常見的就是進(jìn)行彈框處理或者新開辟一個(gè)WKWebView。
2.2.1 創(chuàng)建和關(guān)閉Web視圖
//Creates a new web view.
- (nullable WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
//通知你的應(yīng)用程序DOM窗口成功關(guān)閉。
- (void)webViewDidClose:(WKWebView *)webView
2.2.2 顯示UI面板
//顯示JavaScript彈框面板。
- webView:runJavaScriptAlertPanelWithMessage:initiatedByFrame:completionHandler:
//顯示JavaScript的confirm彈框面板。
- webView:runJavaScriptConfirmPanelWithMessage:initiatedByFrame:completionHandler:
//顯示JavaScript的input彈框面板。
webView:runJavaScriptTextInputPanelWithPrompt:defaultText:initiatedByFrame:completionHandler:
2.2.3 顯示上傳面板
//顯示文件上傳面板。
- webView:runOpenPanelWithParameters:initiatedByFrame:completionHandler:
//web內(nèi)容中的文件上傳控件的配置細(xì)節(jié)。
WKOpenPanelParameters
2.2.4 顯示上下文菜單
//告訴委托上下文菜單交互開始了。
- webView:contextMenuConfigurationForElement:completionHandler:
//為委托提供動(dòng)畫對象,web視圖使用它來顯示上下文菜單。
- webView:contextMenuForElement:willCommitWithAnimator:
//告訴委托web視圖將要顯示指定元素的上下文菜單。
- webView:contextMenuWillPresentForElement:
//告訴委托web視圖取消了指定元素的上下文菜單。
- webView:contextMenuDidEndForElement:
說明:
- UIContextMenuConfiguration包含上下文菜單配置細(xì)節(jié)的對象。
2.2.5 請求的權(quán)限
//確定安全源對象描述的web資源是否可以訪問設(shè)備的方向和運(yùn)動(dòng)。
- webView:requestDeviceOrientationAndMotionPermissionForOrigin:initiatedByFrame:decisionHandler:
//確定安全源對象描述的web資源是否可以訪問設(shè)備的麥克風(fēng)音頻和攝像機(jī)視頻。
- webView:requestMediaCapturePermissionForOrigin:initiatedByFrame:type:decisionHandler:
//設(shè)備資源訪問的可能權(quán)限決定的枚舉。
typedef NS_ENUM(NSInteger, WKPermissionDecision) {
WKPermissionDecisionPrompt,
WKPermissionDecisionGrant,
WKPermissionDecisionDeny,
}
//列舉可捕獲音頻、視頻或兩者的媒體設(shè)備類型的枚舉。
typedef NS_ENUM(NSInteger, WKMediaCaptureType) {
WKMediaCaptureTypeCamera,
WKMediaCaptureTypeMicrophone,
WKMediaCaptureTypeCameraAndMicrophone,
}
3、 web視圖的配置
3.1 WKWebViewConfiguration
WKWebViewConfiguration是用來初始化web視圖的屬性集合。提供了關(guān)于如何配置WKWebView對象的信息。
你在你的代碼中創(chuàng)建一個(gè)WKWebViewConfiguration對象,配置它的屬性,并將它傳遞給你的WKWebView對象的初始化器。
web視圖只在創(chuàng)建時(shí)包含您的配置設(shè)置;以后不能動(dòng)態(tài)更改這些設(shè)置
作用:
- 用于您的web內(nèi)容的初始cookie
- 您的web內(nèi)容使用的任何自定義URL方案的處理程序
- 設(shè)置如何處理媒體內(nèi)容設(shè)置如何處理媒體內(nèi)容
- 有關(guān)如何在web視圖中管理選擇的信息
- 自定義腳本注入到網(wǎng)頁
- 決定如何呈現(xiàn)內(nèi)容的自定義規(guī)則
3.1.1 配置Web View的行為
API:
@property (nonatomic, strong) WKWebsiteDataStore *websiteDataStore
說明:
- 用于獲取和設(shè)置站點(diǎn)cookie以及跟蹤緩存數(shù)據(jù)對象的對象。
- 用作Cookie的設(shè)置
API:
@property (nonatomic, strong) WKUserContentController *userContentController;
說明:
- 該對象協(xié)調(diào)應(yīng)用程序的本地代碼與網(wǎng)頁的腳本和其他內(nèi)容之間的交互。
- 用作web與native交互
API:
@property (nonatomic, strong) WKProcessPool *processPool;
說明:
- web內(nèi)容的進(jìn)程池
- 當(dāng)一個(gè)web視圖被初始化時(shí),一個(gè)新的web內(nèi)容進(jìn)程將從指定的池或已有的進(jìn)程中創(chuàng)建
- 這個(gè)對象協(xié)調(diào)web視圖用來渲染它的web內(nèi)容和執(zhí)行腳本的進(jìn)程。
API:
@property (nullable, nonatomic, copy) NSString *applicationNameForUserAgent
說明:
- 出現(xiàn)在用戶代理字符串中的應(yīng)用程序名稱。
API:
@property (nonatomic) BOOL limitsNavigationsToAppBoundDomains
說明:
- 一個(gè)布爾值,指示web視圖是否限制導(dǎo)航到應(yīng)用程序域內(nèi)的頁面。
3.1.2 配置Web視圖的首選項(xiàng)
API:
@property (nonatomic, strong) WKPreferences *preferences;
說明:
- 管理web視圖的首選項(xiàng)相關(guān)設(shè)置的對象。
API:
@property (null_resettable, nonatomic, copy) WKWebpagePreferences *defaultWebpagePreferences
說明:
- 加載和呈現(xiàn)內(nèi)容時(shí)要使用的默認(rèn)首選項(xiàng)。
3.1.3 為自定義URL方案添加處理程序
API:
- (void)setURLSchemeHandler:(nullable id <WKURLSchemeHandler>)urlSchemeHandler forURLScheme:(NSString *)urlScheme
說明:
- 注冊一個(gè)對象以加載與指定URL方案關(guān)聯(lián)的資源。
- 設(shè)置URL模式的處理對象
API:
- (nullable id <WKURLSchemeHandler>)urlSchemeHandlerForURLScheme:(NSString *)urlScheme
說明:
- 返回指定URL模式當(dāng)前注冊的處理程序?qū)ο蟆?/li>
3.1.4 配置呈現(xiàn)行為
API:
@property (nonatomic) BOOL ignoresViewportScaleLimits
說明:
- 一個(gè)布爾值,決定網(wǎng)頁視圖是否允許縮放網(wǎng)頁。
- 默認(rèn)為NO
API:
@property (nonatomic) BOOL suppressesIncrementalRendering;
說明:
- 一個(gè)布爾值,指示web視圖是否在內(nèi)容完全加載到內(nèi)存之前抑制內(nèi)容呈現(xiàn)。
- 默認(rèn)為NO
3.1.5 設(shè)置媒體播放首選項(xiàng)
API:
@property (nonatomic) BOOL allowsInlineMediaPlayback;
說明:
- 一個(gè)布爾值,指示HTML5視頻是內(nèi)聯(lián)播放還是使用本機(jī)全屏控制器。
API:
@property (nonatomic) BOOL allowsAirPlayForMediaPlayback
說明:
- 一個(gè)布爾值,指示web視圖是否允許通過AirPlay播放媒體。
API:
@property (nonatomic) BOOL allowsPictureInPictureMediaPlayback
說明:
- 指示是否可以播放HTML5視頻
- 默認(rèn)為YES
API:
@property (nonatomic) WKAudiovisualMediaTypes mediaTypesRequiringUserActionForPlayback
說明:
- 需要用戶手勢才能開始播放的媒體類型。
API:
typedef NS_OPTIONS(NSUInteger, WKAudiovisualMediaTypes) {
WKAudiovisualMediaTypeNone = 0,
WKAudiovisualMediaTypeAudio = 1 << 0,
WKAudiovisualMediaTypeVideo = 1 << 1,
WKAudiovisualMediaTypeAll = NSUIntegerMax
}
說明:
- 需要用戶手勢才能開始播放的媒體類型。
3.1.6 確定數(shù)據(jù)類型
API:
@property (nonatomic) WKDataDetectorTypes dataDetectorTypes
說明:
- 應(yīng)用于web視圖內(nèi)容的數(shù)據(jù)檢測器類型。
- WKDataDetectorTypes是數(shù)據(jù)檢測器類型類
3.1.7 設(shè)置選擇的粒度
API:
@property (nonatomic) WKSelectionGranularity selectionGranularity;
typedef NS_ENUM(NSInteger, WKSelectionGranularity) {
WKSelectionGranularityDynamic,
WKSelectionGranularityCharacter,
}
說明:
- 用戶可以交互地選擇web視圖內(nèi)容的粒度級別。
- 默認(rèn)值為WKSelectionGranularityDynamic。
- WKSelectionGranularity枚舉用戶可以選擇和修改web視圖內(nèi)容的粒度。
3.1.8 選擇用戶界面的方向性
API:
@property (nonatomic) WKUserInterfaceDirectionPolicy userInterfaceDirectionPolicy
typedef NS_ENUM(NSInteger, WKUserInterfaceDirectionPolicy) {
WKUserInterfaceDirectionPolicyContent,
WKUserInterfaceDirectionPolicySystem,
}
說明:
- 用戶界面元素的方向性。
- WKUserInterfaceDirectionPolicy枚舉在web視圖中決定用戶界面元素的方向性的策略
3.2 WKWindowFeatures
一個(gè)WKWindowFeatures對象包含一個(gè)網(wǎng)頁從其包含的web視圖請求的屬性。,用來顯示網(wǎng)頁請求其窗口的相關(guān)屬性。
不能直接創(chuàng)建WKWindowFeatures對象。當(dāng)一個(gè)導(dǎo)航操作導(dǎo)致一個(gè)新的web視圖的顯示,WKWebView創(chuàng)建這個(gè)對象,并把它傳遞給它的UI委托對象的webView:createWebViewWithConfiguration:forNavigationAction:windowFeatures:方法。委托使用此對象中的信息來配置并返回新的web視圖。
檢查窗口的位置和尺寸:
一個(gè)布爾值,指示是否使包含的窗口可調(diào)整大小。
@property (nullable, nonatomic, readonly) NSNumber *allowsResizing;
檢查可見性屬性:
一個(gè)布爾值,指示網(wǎng)頁是否請求可見的菜單欄。
@property (nullable, nonatomic, readonly) NSNumber *menuBarVisibility;
一個(gè)布爾值,指示網(wǎng)頁是否請求可見的狀態(tài)欄。
@property (nullable, nonatomic, readonly) NSNumber *statusBarVisibility;
一個(gè)布爾值,指示網(wǎng)頁是否請求可見工具欄。
@property (nullable, nonatomic, readonly) NSNumber *toolbarsVisibility;
3.3 WKProcessPool
WKProcessPool對象表示W(wǎng)ebKit用來管理web內(nèi)容的單個(gè)進(jìn)程。一個(gè)不透明的token,用來在一個(gè)進(jìn)程中運(yùn)行多個(gè)web視圖。
為了提供更安全穩(wěn)定的體驗(yàn),WebKit在獨(dú)立的進(jìn)程中渲染web視圖的內(nèi)容,而不是在你的應(yīng)用程序的進(jìn)程空間中。
默認(rèn)情況下,WebKit給每個(gè)web視圖自己的進(jìn)程空間,直到它達(dá)到實(shí)現(xiàn)定義的進(jìn)程限制。在此之后,具有相同WKProcessPool對象的web視圖共享相同的web內(nèi)容進(jìn)程。
如果你的應(yīng)用程序創(chuàng)建了多個(gè)web視圖,將相同的WKProcessPool對象分配給可能安全地共享一個(gè)進(jìn)程空間的web視圖。實(shí)例化這個(gè)類的一個(gè)實(shí)例,并將它分配給每個(gè)web視圖的WKWebViewConfiguration對象的processPool屬性。
不提供任何屬性和方法
3.4 WKPreferences
使用WKPreferences對象來指定您的網(wǎng)站的首選項(xiàng),包括最小字體大小、JavaScript行為和處理欺詐網(wǎng)站的行為。它封裝了應(yīng)用于網(wǎng)站的標(biāo)準(zhǔn)行為。
創(chuàng)建這個(gè)對象,并將它分配給你用來創(chuàng)建web視圖的WKWebViewConfiguration對象的preferences屬性。
3.4.1 設(shè)置渲染的偏好
API:
@property (nonatomic) CGFloat minimumFontSize;
說明:
- 最小字體大小,以點(diǎn)為單位。
API:
@property (nonatomic) BOOL tabFocusesLinks
說明:
- 一個(gè)布爾值,指示按下tab鍵是否將焦點(diǎn)更改為鏈接和表單控件。
3.4.2 設(shè)置Java和JavaScript首選項(xiàng)
API:
javaScriptCanOpenWindowsAutomatically
說明:
- 一個(gè)布爾值,指示JavaScript是否可以在沒有用戶交互的情況下打開窗口。
3.4.3 設(shè)置fraud警告首選項(xiàng)
API:
@property (nonatomic, getter=isFraudulentWebsiteWarningEnabled) BOOL fraudulentWebsiteWarningEnabled
說明:
- 一個(gè)布爾值,指示web視圖是否對可疑的欺詐內(nèi)容(如惡意軟件或網(wǎng)絡(luò)釣魚)顯示警告。
3.5 WKWebpagePreferences
指定加載和呈現(xiàn)頁面內(nèi)容時(shí)使用的行為的對象。當(dāng)你想改變你的web視圖的默認(rèn)呈現(xiàn)行為時(shí),創(chuàng)建一個(gè)WKWebpagePreferences對象。
通常,iOS設(shè)備呈現(xiàn)web內(nèi)容是為了移動(dòng)體驗(yàn),而Mac設(shè)備呈現(xiàn)內(nèi)容是為了桌面體驗(yàn)。
3.5.1 設(shè)置JavaScript首選項(xiàng)
API:
@property (nonatomic) BOOL allowsContentJavaScript
說明:
- 一個(gè)布爾值,指示是否允許運(yùn)行來自web內(nèi)容的JavaScript。
3.5.2 設(shè)置首選內(nèi)容模式
API:
@property (nonatomic) WKContentMode preferredContentMode
typedef NS_ENUM(NSInteger, WKContentMode) {
WKContentModeRecommended,
WKContentModeMobile,
WKContentModeDesktop
}
說明:
- 網(wǎng)頁視圖在加載和呈現(xiàn)網(wǎng)頁時(shí)使用的內(nèi)容模式。
- WKContentMode指示如何呈現(xiàn)web視圖內(nèi)容的常量
4、 數(shù)據(jù)管理
4.1 WKWebsiteDataStore
使用WKWebsiteDataStore對象來配置和管理網(wǎng)站數(shù)據(jù)。用于管理cookie、磁盤和內(nèi)存緩存以及web視圖的其他類型的數(shù)據(jù)。
作用:
- 管理網(wǎng)站使用的cookies
- 了解網(wǎng)站存儲的數(shù)據(jù)類型
- 刪除不需要的網(wǎng)站數(shù)據(jù)
4.1.1 創(chuàng)建數(shù)據(jù)存儲對象
API:
+ (WKWebsiteDataStore *)defaultDataStore;
說明:
- 返回默認(rèn)數(shù)據(jù)存儲
- 該存儲將數(shù)據(jù)持久地存儲到磁盤
API:
+ (WKWebsiteDataStore *)nonPersistentDataStore;
說明:
- 創(chuàng)建一個(gè)新的非持久的數(shù)據(jù)存儲對象,該對象將網(wǎng)站數(shù)據(jù)存儲在內(nèi)存中,而不是將數(shù)據(jù)寫入磁盤。
- 實(shí)現(xiàn)“隱私瀏覽”很有用
4.1.2 檢查數(shù)據(jù)存儲屬性
API:
@property (nonatomic, readonly, getter=isPersistent) BOOL persistent;
說明:
- 一個(gè)布爾值,指示該對象是否將數(shù)據(jù)存儲到磁盤。
4.1.3 檢索Cookie Store
API:
@property (nonatomic, readonly) WKHTTPCookieStore *httpCookieStore
說明:
- 管理網(wǎng)站的HTTP cookie的對象。
4.1.4 檢索特定類型的數(shù)據(jù)
API:
- (void)fetchDataRecordsOfTypes:(NSSet<NSString *> *)dataTypes completionHandler:(void (^)(NSArray<WKWebsiteDataRecord *> *))completionHandler
說明:
- 從數(shù)據(jù)存儲中獲取指定的記錄類型。
API:
+ (NSSet<NSString *> *)allWebsiteDataTypes;
說明:
- 返回所有可用數(shù)據(jù)類型的集合。
4.1.5 刪除特定類型的數(shù)據(jù)
API:
- (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes forDataRecords:(NSArray<WKWebsiteDataRecord *> *)dataRecords completionHandler:(void (^)(void))completionHandler;
說明:
- 從一個(gè)或多個(gè)數(shù)據(jù)記錄中刪除指定的網(wǎng)站數(shù)據(jù)類型。
API:
- (void)removeDataOfTypes:(NSSet<NSString *> *)dataTypes modifiedSince:(NSDate *)date completionHandler:(void (^)(void))completionHandler;
說明:
- 刪除在指定日期之后更改的網(wǎng)站數(shù)據(jù)。
4.2 WKWebsiteDataRecord
使用WKWebsiteDataRecord對象來發(fā)現(xiàn)網(wǎng)站存儲的信息類型。一個(gè)特定網(wǎng)站持久存儲的數(shù)據(jù)記錄。
記錄識別網(wǎng)站存儲的數(shù)據(jù)類型,但不識別實(shí)際數(shù)據(jù)。您可以使用這些信息來幫助用戶管理網(wǎng)站數(shù)據(jù)。例如,Safari為用戶提供了查看和刪除網(wǎng)站數(shù)據(jù)的方法。每個(gè)記錄的域名包含網(wǎng)站的域名和后綴。
我們不能直接創(chuàng)建WKWebsiteDataRecord對象。WebKit創(chuàng)建這些記錄并將它們存儲在web視圖的數(shù)據(jù)存儲中。
使用該數(shù)據(jù)存儲的fetchDataRecordsOfTypes:completionHandler:來檢索當(dāng)前記錄對象。還可以使用該對象刪除不需要的記錄。
4.2.1 獲取記錄信息
API:
@property (nonatomic, readonly, copy) NSString *displayName;
說明:
- 數(shù)據(jù)記錄的顯示名稱。
4.2.2 獲取數(shù)據(jù)類型
API:
@property (nonatomic, readonly, copy) NSSet<NSString *> *dataTypes;
說明:
- 與記錄相關(guān)聯(lián)的數(shù)據(jù)類型。
4.3 WKHTTPCookieStore
管理與特定web視圖相關(guān)的HTTP cookie的對象。
使用WKHTTPCookieStore為您的網(wǎng)頁指定初始cookie,并管理網(wǎng)頁內(nèi)容的cookie。例如,當(dāng)用戶退出時(shí),可以使用此對象刪除當(dāng)前會話的cookie。要檢測網(wǎng)頁何時(shí)改變cookie,請使用addObserver:方法安裝一個(gè)cookie觀察者。
不需要直接創(chuàng)建wkhttpcookestore對象。相反,從web視圖的配置對象的WKWebsiteDataStore對象中檢索這個(gè)對象。
4.3.1 管理cookie
API:
- (void)getAllCookies:(void (^)(NSArray<NSHTTPCookie *> *))completionHandler;
說明:
- 異步獲取所有存儲的cookie,并將它們交付給指定的完成處理程序。
API:
- (void)setCookie:(NSHTTPCookie *)cookie completionHandler:(nullable void (^)(void))completionHandler;
說明:
- 將一個(gè)cookie添加到cookieStore上。
API:
- (void)deleteCookie:(NSHTTPCookie *)cookie completionHandler:(nullable void (^)(void))completionHandler
說明:
- 刪除指定的cookie。
4.3.2 觀察Cookie Store的變化
API:
- (void)addObserver:(id<WKHTTPCookieStoreObserver>)observer;
說明:
- 向cookie存儲添加一個(gè)觀察者
API:
- (void)removeObserver:(id<WKHTTPCookieStoreObserver>)observer;
說明:
- 從cookie存儲中移除一個(gè)觀察者。
- WKHTTPCookieStoreObserver提供在監(jiān)控網(wǎng)頁cookies變化的對象中采用的方法
4.4 WKURLSchemeHandler
一個(gè)加載資源的協(xié)議,加載的URL模式并不能被WebKit 處理,也就是加載自定義的資源。在對象中采用WKURLSchemeHandler協(xié)議,為您的web內(nèi)容處理自定義URL方案。
自定義方案允許你將自定義的資源類型集成到你的web內(nèi)容中,你也可以為你的應(yīng)用程序需要的資源定義自定義方案。
在你的應(yīng)用程序?qū)ο笾胁捎眠@個(gè)協(xié)議,并使用WKWebViewConfiguration的setURLSchemeHandler:forURLScheme:方法注冊它。
當(dāng)一個(gè)web視圖遇到一個(gè)使用自定義方案的資源時(shí),它會創(chuàng)建一個(gè)WKURLSchemeTask對象,并將它傳遞給你的方案處理程序?qū)ο蟮姆椒ā?/p>
使用webView:startURLSchemeTask:方法開始加載資源。
當(dāng)你的處理器加載這個(gè)對象時(shí),web視圖可能會調(diào)用你處理器的webView:stopURLSchemeTask:方法來通知你這個(gè)資源不再需要了。
加載自定義資源:
//請求處理程序開始加載指定資源的數(shù)據(jù)。
- webView:startURLSchemeTask:
響應(yīng)一個(gè)被取消的資源請求:
//請求處理程序停止加載指定資源的數(shù)據(jù)。
- webView:stopURLSchemeTask:
4.5 WKURLSchemeTask
WKURLSchemeTask協(xié)議定義了WebKit用來請求自定義資源的接口。
不在自己的對象中采用這個(gè)接口。相反,WebKit創(chuàng)建了采用這個(gè)接口的對象,并將它們交付給定制方案處理程序(采用WKURLSchemeHandler協(xié)議的對象)
你可以使用WebKit提供的對象來獲取關(guān)于請求資源的信息并加載它們。您還可以使用這些對象向WebKit報(bào)告您的進(jìn)度。
說明:
- 當(dāng)WebKit需要一個(gè)自定義方案時(shí),它會在任務(wù)的request屬性中放置一個(gè)適當(dāng)?shù)腢RL請求。
- 在接收到請求后,確定資源的大小,并使用適當(dāng)?shù)腢RL響應(yīng)對象調(diào)用didReceiveResponse:方法。
- 提供響應(yīng)反映了web服務(wù)器在接收請求時(shí)的行為。
- 加載資源數(shù)據(jù)的一部分后,調(diào)用didReceiveData:方法將其發(fā)送到WebKit。
- 您可以多次調(diào)用該方法以增量地交付數(shù)據(jù),也可以使用所有數(shù)據(jù)調(diào)用一次。
- 在您完成交付所有數(shù)據(jù)之后,調(diào)用didFinish方法。如果在加載過程中出現(xiàn)錯(cuò)誤,調(diào)用didFailWithError:來報(bào)告它。
5、 導(dǎo)航相關(guān)
5.1 WKNavigationDelegate
WKNavigationDelegate提供用于接受或拒絕導(dǎo)航更改的方法,以及用于跟蹤導(dǎo)航請求的進(jìn)度的方法。用來協(xié)調(diào)web視圖主框架中的變化的對象中實(shí)現(xiàn)WKNavigationDelegate協(xié)議的方法。當(dāng)用戶試圖導(dǎo)航web內(nèi)容時(shí),web視圖與它的導(dǎo)航委托協(xié)調(diào)來管理任何轉(zhuǎn)換。
作用:
- 限制內(nèi)容中特定鏈接的導(dǎo)航
- 跟蹤請求的進(jìn)度,并響應(yīng)錯(cuò)誤和身份驗(yàn)證挑戰(zhàn)
5.1.1 允許或拒絕導(dǎo)航請求
API:
- webView:decidePolicyForNavigationAction:preferences:decisionHandler:
說明:
- 請求委托獲得根據(jù)指定首選項(xiàng)和操作信息導(dǎo)航到新內(nèi)容的權(quán)限。
API:
- webView:decidePolicyForNavigationAction:decisionHandler:
說明:
- 請求委托授予根據(jù)指定操作信息導(dǎo)航到新內(nèi)容的權(quán)限。
- WKNavigationActionPolicy指示是否允許或取消從操作導(dǎo)航到網(wǎng)頁的常量
API:
- webView:decidePolicyForNavigationResponse:decisionHandler:
說明:
- 請求委托在知道導(dǎo)航請求的響應(yīng)后導(dǎo)航到新內(nèi)容的權(quán)限。
- WKNavigationResponsePolicy指示是否允許或取消從響應(yīng)導(dǎo)航到網(wǎng)頁的常量
5.1.2 跟蹤請求的加載進(jìn)度
API:
- webView:didStartProvisionalNavigation:
說明:
- 告訴委托主體框架的導(dǎo)航已經(jīng)啟動(dòng)。
API:
- webView:didReceiveServerRedirectForProvisionalNavigation:
說明:
- 告訴委托web視圖收到了一個(gè)請求的服務(wù)器重定向。
API:
- webView:didCommitNavigation:
說明:
- 告訴委托web視圖已經(jīng)開始接收主體框架的內(nèi)容。
API:
- webView:didFinishNavigation:
說明:
- 告訴委托導(dǎo)航已經(jīng)完成。
5.1.3 響應(yīng)認(rèn)證挑戰(zhàn)
API:
- webView:didReceiveAuthenticationChallenge:completionHandler:
說明:
- 請求委托響應(yīng)身份驗(yàn)證質(zhì)詢。
API:
- webView:authenticationChallenge:shouldAllowDeprecatedTLS:
說明:
- 詢問委托是否繼續(xù)使用已棄用的TLS版本的連接。
5.1.4 響應(yīng)導(dǎo)航錯(cuò)誤
API:
- webView:didFailNavigation:withError:
說明:
- 告訴委托導(dǎo)航期間發(fā)生錯(cuò)誤。
API:
- webView:didFailProvisionalNavigation:withError:
說明:
- 告訴委托在早期導(dǎo)航過程中發(fā)生了錯(cuò)誤。
API:
- webViewWebContentProcessDidTerminate:
說明:
- 告訴委托web視圖的內(nèi)容過程被終止。
5.1.5 處理下載進(jìn)度
API:
webView:navigationResponse:didBecomeDownload:
說明:
- 告訴委托導(dǎo)航響應(yīng)變成了下載。
API:
- webView:navigationAction:didBecomeDownload:
說明:
- 告訴委托導(dǎo)航操作變成了下載。
5.2 WKBackForwardList
使用WKBackForwardList對象來檢索web視圖之前加載的頁面。用來管理以前加載的網(wǎng)頁列表,web視圖使用它來進(jìn)行向前和向后導(dǎo)航。
通常,不會直接創(chuàng)建WKBackForwardList對象。每個(gè)web視圖自動(dòng)創(chuàng)建一個(gè),并使用它來存儲所有加載頁面的歷史記錄。
從web視圖的backForwardList屬性中獲取這個(gè)對象,并使用它的內(nèi)容來方便編程導(dǎo)航。
5.2.1 獲取最近的項(xiàng)
//當(dāng)前項(xiàng)之前的項(xiàng)
@property (nullable, nonatomic, readonly, strong) WKBackForwardListItem *backItem;
//當(dāng)前項(xiàng)
@property (nullable, nonatomic, readonly, strong) WKBackForwardListItem *currentItem;
//當(dāng)前項(xiàng)之后的項(xiàng)
@property (nullable, nonatomic, readonly, strong) WKBackForwardListItem *forwardItem;
5.2.2 獲取列表中的特定項(xiàng)
- (nullable WKBackForwardListItem *)itemAtIndex:(NSInteger)index;
說明:
- 返回與當(dāng)前項(xiàng)相對偏移量處的項(xiàng)。
5.2.3 獲得子列表
//當(dāng)前項(xiàng)之前的項(xiàng)數(shù)組。
@property (nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *backList;
//當(dāng)前項(xiàng)之后的項(xiàng)數(shù)組。
@property (nonatomic, readonly, copy) NSArray<WKBackForwardListItem *> *forwardList;
5.3 WKBackForwardListItem
使用wkbackforwardlisttitem對象來獲取以前訪問過的網(wǎng)頁的信息。網(wǎng)頁視圖先前訪問過的網(wǎng)頁項(xiàng)。
該對象標(biāo)識頁面的標(biāo)題和URL。它還標(biāo)識了請求該網(wǎng)頁的URL。您不需要直接創(chuàng)建wkbackforwardlisttitem對象。相反,當(dāng)web視圖加載新頁面時(shí),WKBackForwardList對象會將它們與其關(guān)聯(lián)的web視圖一起創(chuàng)建。
獲取特定于頁面的信息:
- (instancetype)init NS_UNAVAILABLE;
/*! @abstract The URL of the webpage represented by this item.
*/
@property (readonly, copy) NSURL *URL;
/*! @abstract The title of the webpage represented by this item.
*/
@property (nullable, readonly, copy) NSString *title;
獲取請求頁面:
//最初請求web視圖加載此頁面的源URL。
@property (readonly, copy) NSURL *initialURL;
5.4 WKNavigation
WKNavigation對象唯一標(biāo)識一個(gè)網(wǎng)頁的加載請求。跟蹤網(wǎng)頁加載進(jìn)度的對象。
當(dāng)你請求web視圖加載內(nèi)容或?qū)Ш降巾撁鏁r(shí),web視圖會返回一個(gè)WKNavigation對象來識別你的請求。
隨著加載操作的進(jìn)行,web視圖將該操作的進(jìn)度報(bào)告給它的導(dǎo)航委托的各種方法,并將匹配的WKNavigation對象傳遞給它們。
獲取內(nèi)容模式:
WebKit用來加載網(wǎng)頁的內(nèi)容模式。
@property (nonatomic, readonly) WKContentMode effectiveContentMode
5.5 WKNavigationAction
使用一個(gè)WKNavigationAction對象來決定是否允許在你的應(yīng)用程序的web視圖中導(dǎo)航。包含有關(guān)導(dǎo)致導(dǎo)航發(fā)生的操作的信息。
你不能直接創(chuàng)建WKNavigationAction對象。相反,web視圖創(chuàng)建它們并將它們傳遞給適當(dāng)?shù)奈袑ο?。使用委托的方法來分析操作,并決定是否允許產(chǎn)生導(dǎo)航。
5.5.1 獲取導(dǎo)航類型
API:
@property (nonatomic, readonly) WKNavigationType navigationType;
說明:
- 觸發(fā)導(dǎo)航的操作類型。
API:
typedef NS_ENUM(NSInteger, WKNavigationType) {
WKNavigationTypeLinkActivated,
WKNavigationTypeFormSubmitted,
WKNavigationTypeBackForward,
WKNavigationTypeReload,
WKNavigationTypeFormResubmitted,
WKNavigationTypeOther = -1,
}
說明:
- 觸發(fā)導(dǎo)航的操作類型。
5.5.2 檢查導(dǎo)航信息
API:
@property (nonatomic, readonly, copy) NSURLRequest *request;
說明:
- 與導(dǎo)航操作關(guān)聯(lián)的URL請求對象。
API:
@property (nonatomic, readonly, copy) WKFrameInfo *sourceFrame;
說明:
- 請求導(dǎo)航的框架。
API:
@property (nullable, nonatomic, readonly, copy) WKFrameInfo *targetFrame;
說明:
- 在其中顯示新內(nèi)容的框架。
5.5.3 檢查用戶操作
API:
@property (nonatomic, readonly) NSInteger buttonNumber;
說明:
- 引起導(dǎo)航請求的鼠標(biāo)按鈕的數(shù)量。
API:
@property (nonatomic, readonly) NSEventModifierFlags modifierFlags;
說明:
- 在導(dǎo)航請求時(shí)按下的修改鍵。
5.6 WKNavigationResponse
使用WKNavigationResponse對象來決定是否允許在你的應(yīng)用程序的web視圖中導(dǎo)航。包含對導(dǎo)航請求的響應(yīng)的對象,用于制定與導(dǎo)航相關(guān)的策略決策。
你不能直接創(chuàng)建WKNavigationResponse對象。相反,web視圖創(chuàng)建它們并將它們傳遞給適當(dāng)?shù)奈袑ο蟆J褂梦械姆椒▉矸治鲰憫?yīng),并決定是否允許產(chǎn)生導(dǎo)航。
5.6.1 獲取響應(yīng)詳細(xì)信息
//frame的響應(yīng)
@property (nonatomic, readonly, copy) NSURLResponse *response;
5.6.2 獲取額外的響應(yīng)信息
//A Boolean value that indicates whether the response targets the web view’s main frame.
@property (nonatomic, readonly) BOOL canShowMIMEType;
//一個(gè)布爾值,指示響應(yīng)是否針對web視圖的主框架。
@property (nonatomic, readonly, getter=isForMainFrame) BOOL forMainFrame;
6、 下載
6.1 WKDownload
表示web資源下載的對象。
6.2 WKDownloadDelegate
您實(shí)現(xiàn)的用于跟蹤下載進(jìn)度和處理重定向、身份驗(yàn)證挑戰(zhàn)和失敗的協(xié)議。
6.2.1 跟蹤下載進(jìn)度
API:
- download:decideDestinationUsingResponse:suggestedFilename:completionHandler:
說明:
- 請求委托提供一個(gè)文件目的地,系統(tǒng)應(yīng)在此寫入下載數(shù)據(jù)。
API:
- downloadDidFinish:
說明:
- 告訴委托下載完成。
API:
- download:didFailWithError:resumeData:
說明:
- 告訴委托下載失敗,并提供錯(cuò)誤信息和可用于重新啟動(dòng)下載的數(shù)據(jù)。
6.2.2 響應(yīng)授權(quán)挑戰(zhàn)
API:
- download:didReceiveAuthenticationChallenge:completionHandler:
說明:
- 請求委托響應(yīng)身份驗(yàn)證質(zhì)詢。
API:
WKDownloadRedirectPolicy
說明:
- 帶有指示是否繼續(xù)重定向的用例的枚舉。
6.2.3 對重定向
API:
- download:willPerformHTTPRedirection:newRequest:decisionHandler:
說明:
- 請求委托響應(yīng)下載的重定向響應(yīng)。
API:
WKDownloadRedirectPolicy
說明:
- 帶有指示是否繼續(xù)重定向的用例的枚舉。
7、 網(wǎng)頁內(nèi)容的處理
7.1 WKUserContentController
WKUserContentController對象提供了你的應(yīng)用程序和運(yùn)行在web視圖中的JavaScript代碼之間的橋梁。用于管理JavaScript代碼和web視圖之間的交互,以及過濾web視圖中的內(nèi)容。
創(chuàng)建并配置一個(gè)WKUserContentController對象,作為整個(gè)web視圖設(shè)置的一部分。在創(chuàng)建web視圖之前,將該對象分配給你的WKWebViewConfiguration對象的userContentController屬性
過程:
- 將JavaScript代碼注入到web視圖中運(yùn)行的網(wǎng)頁中。
- 安裝自定義JavaScript函數(shù)來調(diào)用應(yīng)用的本地代碼。
- 指定自定義過濾器,以防止網(wǎng)頁加載受限制的內(nèi)容。
7.1.1 添加和刪除自定義腳本
API:
- (void)addUserScript:(WKUserScript *)userScript;
說明:
- 注入指定的腳本到網(wǎng)頁的內(nèi)容。
API:
- (void)removeAllUserScripts;
說明:
- 從web視圖中刪除所有用戶腳本。
API:
@property (nonatomic, readonly, copy) NSArray<WKUserScript *> *userScripts;
說明:
- 與用戶內(nèi)容控制器相關(guān)聯(lián)的用戶腳本。
7.1.2 添加和刪除消息處理程序
API:
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler name:(NSString *)name;
說明:
- 添加可以從JavaScript代碼調(diào)用的消息回調(diào)處理程序。
API:
- (void)addScriptMessageHandler:(id <WKScriptMessageHandler>)scriptMessageHandler contentWorld:(WKContentWorld *)world name:(NSString *)name
說明:
- 安裝一個(gè)消息處理程序,您可以從JavaScript代碼中指定的內(nèi)容世界中調(diào)用它。
API:
- (void)addScriptMessageHandlerWithReply:(id <WKScriptMessageHandlerWithReply>)scriptMessageHandlerWithReply contentWorld:(WKContentWorld *)contentWorld name:(NSString *)name
說明:
- 安裝一個(gè)消息處理程序,該處理程序向JavaScript代碼返回一個(gè)回復(fù)。
API:
- (void)removeScriptMessageHandlerForName:(NSString *)name;
說明:
- 從JavaScript代碼中卸載指定名稱的自定義消息處理程序。
API:
- (void)removeScriptMessageHandlerForName:(NSString *)name contentWorld:(WKContentWorld *)contentWorld
說明:
- 從JavaScript代碼中指定的內(nèi)容世界中卸載自定義消息處理程序。
API:
- (void)removeAllScriptMessageHandlersFromContentWorld:(WKContentWorld *)contentWorld
說明:
- 從JavaScript代碼中指定的內(nèi)容世界中卸載所有定制消息處理程序。
API:
- (void)removeAllScriptMessageHandlers
說明:
- 卸載與用戶內(nèi)容控制器關(guān)聯(lián)的所有自定義消息處理程序。
API:
WKScriptMessageHandler
說明:
- 一個(gè)從運(yùn)行在網(wǎng)頁中的JavaScript代碼中接收消息的接口。
API:
WKScriptMessageHandlerWithReply
說明:
- 用于響應(yīng)網(wǎng)頁中運(yùn)行的JavaScript代碼的消息的接口。
7.1.3 添加和刪除內(nèi)容規(guī)則
API:
- (void)addContentRuleList:(WKContentRuleList *)contentRuleList
說明:
- 將指定的內(nèi)容規(guī)則列表添加到內(nèi)容控制器對象。
API:
- (void)removeContentRuleList:(WKContentRuleList *)contentRuleList
說明:
- 從內(nèi)容控制器對象中移除指定的規(guī)則列表。
API:
- (void)removeAllContentRuleLists
說明:
- 從內(nèi)容控制器中移除所有規(guī)則列表。
API:
WKContentRuleList
說明:
- 一個(gè)用于web內(nèi)容的規(guī)則列表。
7.2 WKContentRuleListStore
使用WKContentRuleListStore來編譯和管理web視圖中過濾內(nèi)容的規(guī)則。包含如何在web視圖中加載和過濾內(nèi)容的規(guī)則。
規(guī)則列表在你的應(yīng)用程序中扮演著內(nèi)容攔截器的角色。你可以使用它們來阻止web視圖加載特定的內(nèi)容,無論是基于該內(nèi)容的原始位置還是其他你指定的標(biāo)準(zhǔn).
說明:
- 獲取默認(rèn)的WKContentRuleListStore對象或創(chuàng)建一個(gè)自定義的store對象,并使用它來編譯或訪問可用的規(guī)則。
- 每個(gè)store對象將其現(xiàn)有規(guī)則持久地存儲在文件系統(tǒng)中,并在創(chuàng)建時(shí)加載這些規(guī)則。
- 一個(gè)store對象不會自動(dòng)應(yīng)用它的任何規(guī)則到一個(gè)特定的web視圖。要將規(guī)則應(yīng)用到web視圖,需要將其添加到web視圖配置對象的WKUserContentController對象中。
7.2.1 創(chuàng)建內(nèi)容規(guī)則列表存儲
API:
+ defaultStore
說明:
- 返回默認(rèn)的內(nèi)容規(guī)則列表存儲區(qū)。
API:
+ storeWithURL:
說明:
- 在指定目錄中創(chuàng)建一個(gè)新的內(nèi)容規(guī)則列表存儲區(qū)。
7.2.2 創(chuàng)建和刪除內(nèi)容規(guī)則列表
API:
compileContentRuleListForIdentifier:encodedContentRuleList:completionHandler:
說明:
- 將指定的JSON內(nèi)容編譯成一個(gè)新規(guī)則列表,并將其添加到當(dāng)前數(shù)據(jù)存儲區(qū)。
API:
- removeContentRuleListForIdentifier:completionHandler:
說明:
- 從當(dāng)前數(shù)據(jù)存儲異步移除規(guī)則列表。
7.2.3 訪問當(dāng)前規(guī)則列表
API:
- getAvailableContentRuleListIdentifiers:
說明:
- 異步獲取存儲中所有規(guī)則列表的標(biāo)識符。
API:
- lookUpContentRuleListForIdentifier:completionHandler:
說明:
- 異步搜索數(shù)據(jù)存儲中的特定規(guī)則列表。
7.3 WKContentWorld
使用WKContentWorld對象作為命名空間,將你的應(yīng)用程序的web環(huán)境與你執(zhí)行的單個(gè)網(wǎng)頁或腳本的環(huán)境分開。
定義JavaScript代碼執(zhí)行范圍的對象,用于防止不同腳本之間的沖突。
內(nèi)容世界有助于防止兩個(gè)腳本以沖突的方式修改環(huán)境變量時(shí)發(fā)生的問題。在自己的內(nèi)容世界中執(zhí)行腳本有效地為它提供了一個(gè)單獨(dú)的環(huán)境變量的副本來修改。
說明:
- WKContentWorld對象是一個(gè)命名空間,不會在當(dāng)前web視圖或網(wǎng)頁之外持久化數(shù)據(jù)。
- 如果你在兩個(gè)WKWebView對象中使用相同的內(nèi)容世界,一個(gè)web視圖的內(nèi)容世界中的變量不會出現(xiàn)在另一個(gè)web視圖中。
- 類似地,當(dāng)用戶或你的應(yīng)用程序?qū)Ш降揭粋€(gè)新網(wǎng)頁時(shí),前一頁的變量消失了,即使兩個(gè)頁面共享相同的內(nèi)容世界。
- 使用這個(gè)類的方法和屬性來獲取所需的內(nèi)容世界。
- WKContentWorld為你的應(yīng)用程序提供了一個(gè)默認(rèn)的內(nèi)容世界,并為當(dāng)前網(wǎng)頁提供了一個(gè)內(nèi)容世界。您還可以創(chuàng)建新的內(nèi)容世界。例如,您可以為您管理的每個(gè)JavaScript擴(kuò)展創(chuàng)建一個(gè)自定義內(nèi)容世界。在配置或執(zhí)行與內(nèi)容相關(guān)聯(lián)的腳本時(shí)指定內(nèi)容世界對象。
作用場景:
- 你有復(fù)雜的腳本邏輯來連接你的web內(nèi)容到你的應(yīng)用程序,但是你的web內(nèi)容有自己復(fù)雜的腳本庫。在這種情況下,為特定于應(yīng)用程序的腳本使用一個(gè)內(nèi)容世界,為特定于內(nèi)容的腳本使用一個(gè)單獨(dú)的內(nèi)容世界。
- 您實(shí)現(xiàn)了一個(gè)支持JavaScript擴(kuò)展的web瀏覽器。在這種情況下,為每個(gè)擴(kuò)展創(chuàng)建一個(gè)獨(dú)特的內(nèi)容世界,以防止擴(kuò)展之間的沖突。
7.3.1 獲取默認(rèn)內(nèi)容世界
客戶端的默認(rèn)世界。
defaultClientWorld
7.3.2 獲取當(dāng)前頁面的名稱空間
當(dāng)前網(wǎng)頁內(nèi)容的內(nèi)容世界。
pageWorld
7.3.3 檢索自定義內(nèi)容世界
返回具有指定名稱的自定義內(nèi)容世界。
+ worldWithName:
自定義內(nèi)容世界的名稱。
name
7.4 WKFrameInfo
包含網(wǎng)頁上某一框架信息的對象。該類的一個(gè)實(shí)例是一個(gè)臨時(shí)的、僅包含數(shù)據(jù)的對象。它不能跨多個(gè)委托方法調(diào)用惟一地標(biāo)識一個(gè)框架。
檢查框架的信息:
一個(gè)布爾值,指示該框架是網(wǎng)站的主框架還是子框架。
mainFrame
框架的當(dāng)前請求。
request
框架的安全源。
securityOrigin
7.5 WKSecurityOrigin
WKSecurityOrigin對象是一個(gè)臨時(shí)的、僅包含數(shù)據(jù)的對象,它標(biāo)識與特定資源相關(guān)聯(lián)的主機(jī)名、協(xié)議和端口號。
你不能直接創(chuàng)建WKSecurityOrigin對象。相反,WebKit為它加載的資源創(chuàng)建了它們。第一方加載是指與請求網(wǎng)站具有相同安全源的任何加載URL。第一方的網(wǎng)頁可以訪問彼此的資源,如腳本和數(shù)據(jù)庫。
因?yàn)閃KSecurityOrigin對象是瞬態(tài)的,所以它不能在多個(gè)委托方法調(diào)用之間唯一地標(biāo)識安全源。
獲取主機(jī)信息:
host
port
獲取主機(jī)協(xié)議:
protocol
7.6 WKUserScript
webView注入網(wǎng)頁的腳本。當(dāng)你想將自定義腳本代碼注入到你的web視圖頁面時(shí),創(chuàng)建一個(gè)WKUserScript對象。
使用此對象指定要注入的JavaScript代碼,以及與何時(shí)以及如何注入該代碼相關(guān)的參數(shù)。在你創(chuàng)建web視圖之前,把這個(gè)對象添加到與你的web視圖配置相關(guān)的WKUserContentController對象中。
7.6.1 創(chuàng)建用戶腳本對象
API:
- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly;
說明:
- 創(chuàng)建包含指定源代碼和屬性的用戶腳本對象。
API:
- (instancetype)initWithSource:(NSString *)source injectionTime:(WKUserScriptInjectionTime)injectionTime forMainFrameOnly:(BOOL)forMainFrameOnly inContentWorld:(WKContentWorld *)contentWorld
說明:
- 創(chuàng)建一個(gè)用戶腳本對象,該對象的范圍是特定的內(nèi)容世界。
7.6.2 檢查腳本的信息
//腳本的源代碼。
@property (nonatomic, readonly, copy) NSString *source;
//將腳本注入網(wǎng)頁的時(shí)間。
@property (nonatomic, readonly) WKUserScriptInjectionTime injectionTime;
//將腳本內(nèi)容注入網(wǎng)頁的時(shí)間常數(shù)。
typedef NS_ENUM(NSInteger, WKUserScriptInjectionTime) {
WKUserScriptInjectionTimeAtDocumentStart,
WKUserScriptInjectionTimeAtDocumentEnd
}
//一個(gè)布爾值,指示是將腳本注入到主框架還是所有框架。
@property (nonatomic, readonly, getter=isForMainFrameOnly) BOOL forMainFrameOnly;
8、 網(wǎng)頁搜索
8.1 WKFindConfiguration
是搜索web視圖內(nèi)容時(shí)使用的配置參數(shù)。
創(chuàng)建一個(gè)WKFindConfiguration對象,并配置它的屬性來指定如何在web視圖的內(nèi)容中執(zhí)行搜索。要啟動(dòng)搜索,調(diào)用WKWebView的適當(dāng)方法,并將該對象與搜索字符串一起傳遞。
配置搜索參數(shù):
//一個(gè)布爾值,指示相對于當(dāng)前選擇的搜索方向。默認(rèn)為NO
@property (nonatomic) BOOL backwards;
//一個(gè)布爾值,指示在匹配搜索字符串時(shí)是否考慮大小寫。默認(rèn)為NO
@property (nonatomic) BOOL caseSensitive;
//一個(gè)布爾值,指示搜索是否繞到頁面的另一側(cè)。默認(rèn)為YES
@property (nonatomic) BOOL wraps;
8.2 WKFindResult
包含搜索web視圖內(nèi)容的結(jié)果的對象。
當(dāng)你使用WKWebView的方法執(zhí)行搜索時(shí),web view會創(chuàng)建一個(gè)WKFindResult對象,并將其交付給你的完成處理程序。您不需要直接創(chuàng)建該類的實(shí)例。使用web視圖提供的對象來確定它是否找到了匹配的內(nèi)容。
獲取搜索結(jié)果:
//一個(gè)布爾值,指示web視圖在搜索過程中是否找到匹配。
@property (nonatomic, readonly) BOOL matchFound;
9、 上下文菜單
9.1 WKContextMenuElementInfo
WKContextMenuElementInfo對象包含web視圖內(nèi)容中鏈接的URL。包含有關(guān)用戶在網(wǎng)頁中單擊的鏈接的信息的對象,您可以使用該對象為該鏈接配置上下文菜單。
您不需要直接創(chuàng)建該類的實(shí)例。相反,當(dāng)用戶與鏈接交互時(shí),web視圖會創(chuàng)建它們,并將它們傳遞給與之關(guān)聯(lián)的WKUIDelegate對象的方法。在委托方法實(shí)現(xiàn)中,使用此對象中的URL來確定如何配置上下文菜單。
獲取元素信息:
//用戶單擊的鏈接的URL。
@property (nonatomic, readonly, nullable) NSURL *linkURL;
10、 快照配置
10.1 WKSnapshotConfiguration
當(dāng)從web視圖的內(nèi)容生成圖像時(shí)使用的配置數(shù)據(jù)。
當(dāng)你想要根據(jù)web視圖的內(nèi)容生成圖像時(shí),創(chuàng)建一個(gè)WKSnapshotConfiguration對象。使用此對象指定web視圖中要捕獲的部分和捕獲行為。
要生成快照,請將配置對象傳遞給WKWebView的takeSnapshotWithConfiguration:completionHandler:方法,該方法返回一個(gè)平臺原生映像供您使用。
指定快照尺寸:
//你的web視圖要捕獲的部分,指定為視圖坐標(biāo)系統(tǒng)中的一個(gè)矩形。
@property (nonatomic) CGRect rect;
//The width of the captured image, in points.
@property (nullable, nonatomic, copy) NSNumber *snapshotWidth;
配置捕獲行為:
//A Boolean value that indicates whether to take the snapshot after incorporating any pending screen updates.
//默認(rèn)為YES
@property (nonatomic) BOOL afterScreenUpdates
10.2 WKPDFConfiguration
當(dāng)生成web視圖內(nèi)容的PDF表示時(shí)使用的配置數(shù)據(jù)。
當(dāng)你想要生成一個(gè)PDF版本的web視圖內(nèi)容時(shí),創(chuàng)建一個(gè)WKPDFConfiguration對象。
使用此對象指定web視圖中要捕獲的部分。要生成PDF內(nèi)容,將配置對象傳遞給WKWebView的createPDF(configuration:completionHandler:)方法,該方法返回PDF數(shù)據(jù)供您使用。
指定快照尺寸:
//你的web視圖要捕獲的部分,指定為視圖坐標(biāo)系統(tǒng)中的一個(gè)矩形。
@property (nonatomic) CGRect rect