Xcode
Swift
WKWebView

WebKit ViewでURLを取得する

ちょっと手間取ったのでメモ

WKNavigationDelegateとKOVを使った例をそれぞれ紹介します。

開発環境

・Xcode9
・Swfit4

実装(WKNavigationDelegate)

import UIKit
import WebKit // Webkitを読み込む

// WKNavigationDelegateを追加
class ViewController: UIViewController, WKNavigationDelegate {

    @IBOutlet weak var webView: WKWebView!

    let homeUrl = "https://qiita.com/trend"

    override func viewDidLoad() {
        super.viewDidLoad()

        openUrl(urlString: homeUrl)
        // webViewにデリゲートを設定
        webView.navigationDelegate = self

    }

    func openUrl(urlString: String){
        let url = URL(string: urlString)
        let urlRequest = URLRequest(url: url!)
        webView.load(urlRequest)
    }

    // ページが表示されたら下記の関数を実行
    func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
        let activeUrl: URL? = self.webView.url
        let url = activeUrl?.absoluteString

        // 特定のURLで分岐処理
        if url! == "https://qiita.com/trend" {
            print(url!)
        }       
    }

}

didFinish関数はアプリを立ち上げた時に一回だけ呼ばれます。
毎回ページURLを判定して何か処理を行いたい時はKOVを使います。

実装(KOV)

import UIKit
import WebKit // Webkitを読み込む

class ViewController: UIViewController {

    @IBOutlet weak var webView: WKWebView!

    let homeUrl = "https://qiita.com/trend"

    override func viewDidLoad() {
        super.viewDidLoad()

        // オブサーバーの設定
        self.webView?.addObserver(self, forKeyPath:"URL", options:.new, context:nil)
        openUrl(urlString: homeUrl)
    }

    func openUrl(urlString: String){
        let url = URL(string: urlString)
        let urlRequest = URLRequest(url: url!)
        webView.load(urlRequest)
    }

    deinit {
        self.webView?.removeObserver(self, forKeyPath: "URL")
    }

    override func observeValue(forKeyPath keyPath: String?, of object: Any?, change: [NSKeyValueChangeKey : Any]?, context: UnsafeMutableRawPointer?) {
        switch keyPath {
            case "URL"?:
                if let url = change![NSKeyValueChangeKey.newKey] as? URL {
                    let urlString: String = url.absoluteString
                    // ページアクセスするたびにURLを取得
                    print(url)

                }

        default:
            break

        }

    }


}

参考サイト

WKWebView リファレンス
mixi-inc/iOSTraining
[Swift4]Webkit View(WKWebView)の使い方
SwiftでWKWebViewとKey-Value Observingを使ってWebページの読込み状況を取得する
SwiftでKVO(Key-Value Observing)を行う