2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

いまさらWKWebViewメモ

Posted at

使った時のメモ

2017/10くらいに書いて下書きのまま放置されてたのを、Qiitaの下書きが圧迫されてきたので2018/03にそのまま公開。なんで最後の方は適当です。

公式のリファレンスでexampleが乗ってるのでとりあえず動かしたい場合はコレで良さ気。

レイアウト

IBではUIWebViewしかないので、Storyboardなどで配置できない。
公式例にある通り、コード上で初期化して制約をつけて配置する。

全画面をWebViewとして使う場合は、VCのloadView()をoverrideしてself.viewに紐付ける。

var webView: WKWebView!
    
override func loadView() {
    let webConfiguration = WKWebViewConfiguration()
    self.webView = WKWebView(frame: .zero, configuration: webConfiguration)
    self.webView.uiDelegate = self
    self.webView.navigationDelegate = self
    self.view = self.webView
}

※2018/03追記
Xcode9 (iOS11 SDK)よりIB上でWKWebViewが配置できるようになった。
が、iOS10以前も対応するには結局コード上で置かないといけないのであまり状況は変わってない。

delegate周り

ドキュメント見つつ、delegateどれがいつ呼ばれるかぜんぜん分からないのでとりあえず全部書いて適当に標準出力してみる。

適当な場所でnavigationのデリゲートセット

self.webView.navigationDelegate = self

全デリゲートメソッドを標準出力だけするようにとりあえず実装。
一部はクロージャ実行しないとエラーになったのでそこだけ修正。

以下呼ばれたメソッド(時系列順)

適当なURLで初回読み込み時


func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)
func webView(_ webView: WKWebView, didReceive challenge: URLAuthenticationChallenge, completionHandler: @escaping (URLSession.AuthChallengeDisposition, URLCredential?) -> Void)
func webView(_ webView: WKWebView, decidePolicyFor navigationResponse: WKNavigationResponse, decisionHandler: @escaping (WKNavigationResponsePolicy) -> Void)
func webView(_ webView: WKWebView, didCommit navigation: WKNavigation!)
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!)

まぁだいたい予想できそうな名前になっててくれてて、その通りの動きっぽい。

スクロールボタン(WebViewの画面最下部までスクロールするボタン)押下時

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)

リンクのボタン押下時

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)
func webView(_ webView: WKWebView, didFailProvisionalNavigation navigation: WKNavigation!, withError error: Error)

上から、遷移先に遷移するかの判断をする関数、遷移開始時に呼ばれる関数、遷移失敗時に呼ばれる関数。
遷移失敗するようにしてたのでFailになった。(アプリで遷移先URLだけ拾って別で処理するようにしてたので)

遷移先のURLは下記で取れる

func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
    if let url = webView.url {
        print(url)
    }
}

と思って下記を消したら取れなくなった。

func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)

このメソッドがないと、ボタン押した時に


func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)

が呼ばれない??

結局、URLが取りたいなら


func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!)

はナビゲーション開始時のものなので一旦おいといて.


func webView(_ webView: WKWebView, decidePolicyFor navigationAction: WKNavigationAction, decisionHandler: @escaping (WKNavigationActionPolicy) -> Void)

こっちの遷移前判断のほうででURL拾って判断した。

2
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?