iOS WKWebView的使用

黑暗森林的歌者發表於2018-02-26

WKWebView是iOS8開始增加的瀏覽檢視

新特性

效能高,穩定性好,佔用的記憶體比較小 支援JS互動 支援HTML5 新特性 可以新增進度條 支援內建手勢 據說高達60fps的重新整理頻率

使用 ######1、匯入webkit庫

#import <WebKit/WebKit.h>
複製程式碼

######2、遵守協議

WKNavigationDelegate 該代理提供的方法,可以用來追蹤載入過程(頁面開始載入、載入完成、載入失敗)、決定是否執行跳轉。

WKUIDelegate 這個代理的方法基本是與介面彈出提示框相關的,針對於web介面的三種提示框(警告框、確認框、輸入框)分別對應三種代理方法。 還有就是建立新的webview

######3、初始化

// 預設初始化
- (instancetype)initWithFrame:(CGRect)frame;
// 根據對webview的相關配置,進行初始化
- (instancetype)initWithFrame:(CGRect)frame configuration:(WKWebViewConfiguration *)configuration NS_DESIGNATED_INITIALIZER;
複製程式碼

WKWebView的AllowsBackForwardNavigationGestures屬性是否可以左劃返回

載入網頁或者HTML的方式跟UIWebView的相同的

######4、WKNavigationDelegate   追蹤載入過程

// 頁面開始載入時呼叫
- (void)webView:(WKWebView *)webView didStartProvisionalNavigation:(WKNavigation *)navigation;
// 當內容開始返回時呼叫
- (void)webView:(WKWebView *)webView didCommitNavigation:(WKNavigation *)navigation;
// 頁面載入完成之後呼叫
- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation;
// 頁面載入失敗時呼叫
- (void)webView:(WKWebView *)webView didFailProvisionalNavigation:(WKNavigation *)navigation;
複製程式碼

  頁面跳轉

// 接收到伺服器跳轉請求之後再執行
- (void)webView:(WKWebView *)webView didReceiveServerRedirectForProvisionalNavigation:(WKNavigation *)navigation;
// 在收到響應後,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationResponse:(WKNavigationResponse *)navigationResponse decisionHandler:(void (^)(WKNavigationResponsePolicy))decisionHandler;
// 在傳送請求之前,決定是否跳轉
- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler;
複製程式碼

######5、WKUIDelegate

// 建立一個新的WebView
- (WKWebView *)webView:(WKWebView *)webView createWebViewWithConfiguration:(WKWebViewConfiguration *)configuration forNavigationAction:(WKNavigationAction *)navigationAction windowFeatures:(WKWindowFeatures *)windowFeatures;
複製程式碼

  與JS互動

//顯示一個JS的Alert(與JS互動)
- (void)webView:(WKWebView *)webView runJavaScriptAlertPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(void))completionHandler;
//彈出一個輸入框(與JS互動的)
- (void)webView:(WKWebView *)webView runJavaScriptTextInputPanelWithPrompt:(NSString *)prompt defaultText:(nullable NSString *)defaultText initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(NSString * __nullable result))completionHandler;
//顯示一個確認框(JS的)
- (void)webView:(WKWebView *)webView runJavaScriptConfirmPanelWithMessage:(NSString *)message initiatedByFrame:(WKFrameInfo *)frame completionHandler:(void (^)(BOOL result))completionHandler;
//WebVeiw關閉(9.0中的新方法)
- (void)webViewDidClose:(WKWebView *)webView NS_AVAILABLE(10_11, 9_0);
複製程式碼

######6、WKScriptMessageHandler

這個協議中包含一個必須實現的方法,這個方法是提高App與web端互動的關鍵,它可以直接將接收到的JS指令碼轉為OC或Swift物件。

// 從web介面中接收到一個指令碼時呼叫
- (void)userContentController:(WKUserContentController *)userContentController didReceiveScriptMessage:(WKScriptMessage *)message;
複製程式碼

######7、容易遇到的問題 ➤點選其中的連結沒反應

如果一些HTML網頁的標籤頁的跳轉方式為

<a href = "xxx" target = "_black">
複製程式碼

那麼點選連結就不會載入 "_black" 的方式是開一個新的頁面,就像safari中彈出一個新的頁面顯示一樣 。 解決方法就是重新load,實現下面的代理方式

- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler { 
 if (navigationAction.targetFrame == nil) {
    //重新載入一個新頁面
     [webView loadRequest:navigationAction.request]; 
  } 
  decisionHandler(WKNavigationActionPolicyAllow);
}
複製程式碼

或者呼叫Safari開啟連結

相關文章