WKWebviewで簡単なwebViewを作成する

## WKWebviewとは
UIWebviewよりも処理が高速かつ、JSのレンダリング周りの処理が安定している。
iOS8以降から使用可能。
googleChromeのiOSアプリもWKWebviewを使用している

[Appleの公式ドキュメント](https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebView_Ref/)にも
For new development, employ this class instead of the older UIWebView class.
とあるので、デフォでこのClassを使う。

## 1. 宣言
WKWebViewのインスタンスを作成します。
WKWebViewのデリゲートを指定
※ WKNavigationDelegateのプロトコルをClassに指定することを忘れないように

```
class WebViewController: UIViewController, WKNavigationDelegate {

  ・
　・

  webview = WKWebView()
  webview.navigationDelegate = self
  webview.translatesAutoresizingMaskIntoConstraints = false        
```

## 2. レイアウト
StoryBoard上ではWKWebviewを配置できないので、
コードでAutoLayoutの制約を付ける必要があります。

※ NSLayoutAnchor(iOS9以降)を使うとAutoLayoutの記述をCSSライクに簡単に書けます

```swift
containerView.addSubview(webview!)

// 上辺の制約
webview.topAnchor.constraintEqualToAnchor(containerView.topAnchor, constant: 0.0).active = true
// 下辺の制約
webview.bottomAnchor.constraintEqualToAnchor(containerView.bottomAnchor, constant: 0.0).active = true
// 左辺の制約
webview.leadingAnchor.constraintEqualToAnchor(containerView.leadingAnchor, constant: 0.0).active = true
// 右辺の制約
webview.trailingAnchor.constraintEqualToAnchor(containerView.trailingAnchor, constant: 0.0).active = true
```

### スワイプで戻る・進む
```webview.allowsBackForwardNavigationGestures = true```
にすると、スワイプ操作ができるようになります

## 2. webサイトの表示
loadReqestメソッドでページを表示

```swift
let request = NSURLRequest(URL: url!)
webview.loadRequest(request)
```

## 3. ナビゲーションの設置
戻る・進むボタンの設置の仕方ですが、ここは以前のUIWebVIewと一緒です。
ToolbarをStoryBoardで設置し、今回はコードでボタンを配置しました。

```swift
func creatToolbarItems() {
    
    let backBtnImage = UIImage(named: "back")
    let fowardBtnImage = UIImage(named: "next")    
    let flexbleItem = UIBarButtonItem(barButtonSystemItem: .FlexibleSpace, target: nil, action: nil)
  
    // 戻る・進む・リロードボタンの設置
    goBackBtn = UIBarButtonItem(image: backBtnImage, style: .Plain, target: self, action: #selector(goBack))
    goFowardBtn = UIBarButtonItem(image: fowardBtnImage, style: .Plain, target: self, action: #selector(goFoward))
    refreshBtn = UIBarButtonItem(barButtonSystemItem: .Refresh, target: self, action: #selector(refresh))
    
    toolbar.items = [goBackBtn, goFowardBtn, flexbleItem, refreshBtn]
}
```

## 4. デリゲート
WKNavigationのデリゲートメソッドを使用することで、
読み込み開始〜読み込み完了のタイミングのイベントを取得することができます。

よく使う例として、
ブラウザバックができるか判定して、backボタンのON,OFFを切り替える
処理は下記のようになります

```swift

// ページ読み込み完了時、呼ばれるメソッド
func webView(webView: WKWebView, didFinishNavigation navigation: WKNavigation!) {
    if webview.canGoBack {
        goBackBtn.tintColor = nil
    } else {
        goBackBtn.tintColor = UIColor.grayColor()
    }
}
```



## 注：target="_blank"なリンクがデフォルトだと開きません
下記のようにデリゲートメソッド内に
target="_blank"の場合の処理を記述

```swift
func webView(webView: WKWebView, decidePolicyForNavigationAction navigationAction: WKNavigationAction, decisionHandler: (WKNavigationActionPolicy) -> Void) {

    guard let url = navigationAction.request.URL else {
        decisionHandler(.Cancel)
        return
    }

    // target="_blank"の場合
    if navigationAction.navigationType == WKNavigationType.LinkActivated {
        if navigationAction.targetFrame == nil || !(navigationAction.targetFrame!.mainFrame) {
            webview.loadRequest(NSURLRequest.init(URL: url))
            decisionHandler(.Cancel)
            return
        }
    }

    decisionHandler(.Allow)
}
```

## 完成！

![http://i.giphy.com/26vUMGpwGCXVWRLI4.gif](http://i.giphy.com/26vUMGpwGCXVWRLI4.gif)

## 参考サイト
WKWebViewでtarget="_blank"なリンクが開かない時の対処法
http://qiita.com/ShingoFukuyama/items/b3a1441025a36ab7659c