WKWebView詳解(二)- WebKit框架認(rèn)識

WKWebView文章匯總

WKWebView提供了遠(yuǎn)比UIWebView多的類,可以實(shí)現(xiàn)更加豐富的功能,它有自己的框架WebKit,框架內(nèi)包含了所有相關(guān)的類。本文就將所有的類按照Apple文檔的劃分進(jìn)行講解。

后續(xù)在實(shí)際使用中有新的理解會繼續(xù)補(bǔ)充

  1. WebKit結(jié)構(gòu)認(rèn)識
  2. web視圖認(rèn)識
  3. web視圖的配置
  4. 數(shù)據(jù)管理
  5. 導(dǎo)航相關(guān)
  6. 下載
  7. 網(wǎng)頁內(nèi)容的處理
  8. 網(wǎng)頁搜索
  9. 上下文菜單
  10. 快照配置

1、WebKit結(jié)構(gòu)認(rèn)識

使用WebKit框架將樣式豐富的web內(nèi)容集成到應(yīng)用程序的原生內(nèi)容中。WebKit為web界面提供了完整的瀏覽體驗(yàn)。

通過WebKit框架可以完成一系列事情:

  1. 使用HTML、CSS和JavaScript顯示豐富的web內(nèi)容;
  2. 處理頁面內(nèi)容的更多的加載過程;
  3. 顯示多個(gè)MIME類型和復(fù)合框架元素;
  4. 在內(nèi)容頁面之間導(dǎo)航;
  5. 管理最近訪問頁面的前后列表。

也就是說,我們在自定義視圖層次結(jié)構(gòu)中呈現(xiàn)一個(gè)WKWebView對象并加載網(wǎng)頁內(nèi)容。使用相應(yīng)的對象來管理cookie、執(zhí)行腳本、控制導(dǎo)航、生成快照和執(zhí)行基于文本的搜索。


WKWebView代碼結(jié)構(gòu).png

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屬性

過程:

  1. 將JavaScript代碼注入到web視圖中運(yùn)行的網(wǎng)頁中。
  2. 安裝自定義JavaScript函數(shù)來調(diào)用應(yīng)用的本地代碼。
  3. 指定自定義過濾器,以防止網(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)容世界對象。

作用場景:

  1. 你有復(fù)雜的腳本邏輯來連接你的web內(nèi)容到你的應(yīng)用程序,但是你的web內(nèi)容有自己復(fù)雜的腳本庫。在這種情況下,為特定于應(yīng)用程序的腳本使用一個(gè)內(nèi)容世界,為特定于內(nèi)容的腳本使用一個(gè)單獨(dú)的內(nèi)容世界。
  2. 您實(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
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容