[iOS] WKWebView使用心得

首先這玩意就是比UIWebView好用啊,好在哪呢?記憶體管理,記憶體不會被莫名其妙的吃掉啊。不過也變得比較複雜了一點點,以下我簡單紀錄使用的心得。

初始化

這東西要初始化,最簡單的作法就是

WKWebView *webView = [[WKWebView alloc] initWithFrame:frame];

當然你也可以設定WKWebViewConfiguration,這其實是把UIWebView的幾個設定抽出來形成的:
  • allowsInlineMediaPlayback
  • mediaPlaybackAllowsAirPlay
  • mediaPlaybackRequiresUserAction
由於我也沒用到這些,我就不多解釋了。

delegate

原本UIWebView的delegate只有一個,那就是UIWebViewDelegate。但新的delegate拆成兩個:
  • WKNavigationDelegate
  • WKUIDelegate
前者就是控制以前那些回報開始載入、完成載入、要不要載入的方法,後者是屬於UI的部份,不過我也沒用到,我主要用的是前者,那些方法大同小異。

WKNavigationDelegate方法呼叫順序

他的方法呼叫順序如下,當你loadRequest:之後:
  1. webView:decidePolicyForNavigationAction:decisionHandler:
  2. webView:didStartProvisionalNavigation:
  3. webView:decidePolicyForNavigationResponse:decisionHandler:
  4. webView:didCommitNavigation:
  5. webView:didFinishNavigation:
當畫面上有任何的link需要呈現時(比方說內嵌的youtube影片),他就會呼叫webView:decidePolicyForNavigationAction:decisionHandler:,判斷能不能允許這種內容的呈現。如果允許,才會繼續到下面的方法,到第四個方法時,又會繼續看看有沒有其他要載入的link,如果全都沒有了,最後才會到第五個方法,宣告結束。

decisionHandler的實作

在Action和response兩個方法裡面,一個是處理說引起Navigation的行為是要允許執行或是取消,一個是說根據Navigation的回應結果判斷是要允許執行還是取消,這兩個方法裡面有一個關鍵參數decisionHandler

這東西的實作如下範例:

decisionHandler([self shouldStartDecidePolicy: navigationAction.request]);

這邊我根據要引起Action的request內容來判斷要不要navigation,回傳BOOL值,如果是回傳Allow或Cancel參數會crash,要注意。

大致上就是這樣,更多的我也還沒用到,不過到這邊就能實作基本的網頁畫面了。

留言