LoginSignup
14

More than 5 years have passed since last update.

WKWebViewを使う際に便利なライブラリを公開しました

Posted at

Otafuku というWKWebViewを簡単に使うためのユーティリティライブラリを先日リリースしました。
GithubCocoacontrolsで公開してから大分時間が経ちましたが、日本語では告知をしていなかったので、この記事で紹介いたします。(勢いで Misen, Kamagari に続いて作りました。)

Otafuku : Utility classes to use WKWebView in Swift
https://github.com/tasanobu/Otafuku

機能

WebViewUIController

javaScriptの alert, confirm, prompt が実行された場合、ブラウザやUIWebViewのようにアラートを表示するためには、WKUIDelegateプロトコルを実装する必要があります。
また、HTMLのaタグにtarget=_blankが指定されていた場合、WKUIDelegateのメソッドが呼ばれ、新しいViewを開くとか、元のWKWebView上で指定されたURLをロードするかといったハンドリングが必要になります。
WebViewUIControllerWKUIDelegateプロトコルを実装し、上記2点をハンドリングします。

次のサンプルコードのように、WebViewUIControllerをViewControllerのプロパティとして宣言し、UIViewController.viewDidLoadでセットして下さい。
あとはWebViewUIControllerがよしなにやります。

ViewController
class ViewController: UIViewController {
    let uiDelegate = WebViewUIController()

    override func viewDidLoad() {
        super.viewDidLoad()
        webView.UIDelegate = uiDelegate
    }
}

WebViewPropertyObserver

UIWebViewと異なり、 WKWebViewのプロパティ(progress, title, URL など)はKVOに対応しており、UIを作る際に使いたくなることが多いと思います。
WebViewPropertyObserverを使うと、ViewControllerにKVO用の実装をすることなく、Closureでプロパティ値の変更を受け取ることができます。

Closureで受け取る値はSwiftのenumで実装されたWebViewProperty型の値です。

WebViewProperty
enum WebViewProperty {
  static let keys = ["title", "URL", "estimatedProgress", "canGoBack", "canGoForward", "hasOnlySecureContent", "loading"]

  case Title(String?)
  case URL(NSURL?)
  case CanGoBack(Bool)
  case CanGoForward(Bool)
  case EstimatedProgress(Float)
  case Loading(Bool)
  case HasOnlySecureContent(Bool)
}

以下が使い方を説明したサンプルコードです。

  • 初期化時、WKWebViewのインスタンスとプロパティの変更を受け取るClosureを引数に渡して下さい。
  • ViewControllerのプロパティとしてWebViewPropertyObserverを宣言し、ViewControllerがリリースされるまでは保持(retain)して下さい。
class ViewController: UIViewController {
    @IBOutlet var progressView: UIProgressView!
    @IBOutlet var backItem: UIBarButtonItem!
    @IBOutlet var forwardItem: UIBarButtonItem!

    var propertyObserver: WebViewPropertyObserver?

    override func viewDidLoad() {
        super.viewDidLoad()
        propertyObserver = WebViewPropertyObserver(webView: webView, handler:handleWebViewPropertyChange)
    }

    func handleWebViewPropertyChange(property: WebViewPropertyObserver.WebViewProperty) {
        switch property {
        case .Title(let title):
            navigationItem.title = title
        case .URL(let URL):
            // do something with URL
            break
        case .CanGoBack(let canGoBack):
            backItem.enabled = canGoBack
        case .CanGoForward(let canGoForward):
            forwardItem.enabled = canGoForward
        case .EstimatedProgress(let progress):
            progressView.progress = progress
        case .Loading(let loading):
            // do something with loading
            break
        case .HasOnlySecureContent(let secureContent):
            // do something with secureContent
            break
        }
    }
}

システム要件

  • iOS 8.0+
  • Xcode 6.3+

インストール方法

Cocoapodsを使うと簡単にインストールできます。
Podfileで このライブラリ(Otafuku) を追加し、 pod install or pod update を実行して下さい。

platform :ios, '8.0'
use_frameworks!

pod 'Otafuku'

まとめ

Otafuku が提供しているWKWebViewを使うためのユーティリティクラスの説明をしました。

Otafuku : Utility classes to use WKWebView in Swift
https://github.com/tasanobu/Otafuku

プロジェクトでWKWebViewを使う場合はOtafukuの利用を検討してもらえると嬉しいです。
iOS 9からはSFSafariViewControllerなるものが追加されますので、WKWebViewの立ち位置が微妙になるかと思いますが。。。
不具合や機能改善の要望などあれば、この記事のコメントやGithubのIssue/Pull Requestをして下さい。
可能な限り対応したいと思ってます!

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
14