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

```Otafuku``` というWKWebViewを簡単に使うためのユーティリティライブラリを先日リリースしました。
[Github](https://github.com/tasanobu/Otafuku)と[Cocoacontrols](https://www.cocoacontrols.com/controls/webkit-helper-otafuku)で公開してから大分時間が経ちましたが、日本語では告知をしていなかったので、この記事で紹介いたします。（勢いで [Misen](https://github.com/tasanobu/Misen), [Kamagari](https://github.com/tasanobu/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をロードするかといったハンドリングが必要になります。
```WebViewUIController``` は```WKUIDelegate```プロトコルを実装し、上記２点をハンドリングします。

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

```swift: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```型の値です。

```swift: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``` を実行して下さい。


```ruby:
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をして下さい。
可能な限り対応したいと思ってます！