WKWebViewを使ってみた。Swift

#基本
##生成
###インポート
```swift
import WebKit
```
###継承
```swift
class ViewController: UIViewController, WKNavigationDelegate{
//省略
}
```
参考:[WKWebViewに関する調査メモ](http://qiita.com/1234224576/items/0ecee5ce877e99ac3647#wknavigationdelegate)
###配置
Swift2.2

```swift
let webview = WKWebView(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height))
``` 
Swift3

```swift
let webview = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height))
```
###サイトを表示する
Swift2.2

```swift
let url = NSURL(string: "https://www.google.com")
urlRequest = NSURLRequest(URL: url)
self.webview.loadRequest(urlRequest)
``` 
Swift3

```swift
let url = URL(string: "https://www.google.com")
urlRequest = URLRequest(url: url)
self.webview.load(urlRequest)
```

#オプション
###タイトル取得
```swift
var title = self.webview.title
```
###URL取得
```swift
var currenturl = self.webview.url
```
###プログレスバー、インジゲーターを表示
ナビゲーションバーを生成するのは省略です。
Swift2.2

```swift
var progressView = UIProgressView()
//オブザーバーを使って取得
override func viewDidLoad(){
    //読み込み状態が変更されたことを取得
    self.webview.addObserver(self, forKeyPath: "loading", options: .New, context: nil)
    //プログレスが変更されたことを取得
    self.webview.addObserver(self, forKeyPath: "estimatedProgress", options: .New, context: nil)

    //プログレスバーを生成(NavigationBar下)
    progressView = UIProgressView(frame: CGRectMake(0, self.navigationController!.navigationBar.frame.size.height - 2, self.view.frame.size.width, 10))
    progressView.progressViewStyle = .Bar
    self.navigationController?.navigationBar.addSubview(progressView)
}
deinit{
    //消さないと、アプリが落ちる
    self.webview.removeObserver(self, forKeyPath: "estimatedProgress")
    self.webview.removeObserver(self, forKeyPath: "loading")
}

override func observeValueForKeyPath(keyPath: String?, ofObject object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>) {
    if keyPath == "estimatedProgress"{
        //estimatedProgressが変更されたときに、setProgressを使ってプログレスバーの値を変更する。
        self.progressView.setProgress(Float(self.webview.estimatedProgress), animated: true)
    }else if kyPath == "loading"{
        //インジゲーターの表示、非表示をきりかえる。
        UIApplication.sharedApplication().networkActivityIndicatorVisible = self.webview.loading
        if self.webview.loading{
            self.progressView.setProgress(0.1, animated: true)
        }else{
            //読み込みが終わったら0に
            self.progressView.setProgress(0.0, animated: false)
        }
    }
}
```

Swift3

```swift
var progressView = UIProgressView()

override func viewDidLoad(){
    self.tabBarController?.tabBar.isHidden = true
    self.webview.addObserver(self, forKeyPath: "loading", options: .new, context: nil)
    self.webview.addObserver(self, forKeyPath: "estimatedProgress", options: .new, context: nil)

    //プログレスバーを生成(NavigationBar下)
    progressView = UIProgressView(frame: CGRect(x: 0, y: self.navigationController!.navigationBar.frame.size.height - 2, width: self.view.frame.size.width, height: 10))
    progressView.progressViewStyle = .bar
    self.navigationController?.navigationBar.addSubview(progressView)
}
    
deinit{
    //消さないと、アプリが落ちる
    self.webview.removeObserver(self, forKeyPath: "estimatedProgress")
    self.webview.removeObserver(self, forKeyPath: "loading")
}

override func observeValue(forKeyPath keyPath: String?, of object: AnyObject?, change: [String : AnyObject]?, context: UnsafeMutablePointer<Void>?) {
    if keyPath == "estimatedProgress"{
        //estimatedProgressが変更されたときに、setProgressを使ってプログレスバーの値を変更する。
        self.progressView.setProgress(Float(self.webview.estimatedProgress), animated: true)
    }else if keyPath == "loading"{
        UIApplication.shared().isNetworkActivityIndicatorVisible = self.webview.isLoading
        if self.webview.isLoading {
            self.progressView.setProgress(0.1, animated: true)
        }else{
            //読み込みが終わったら0に
            self.progressView.setProgress(0.0, animated: false)
        }
    }
}
```


| 取得するもの | WKWebViewのオブザーバーのkeyPath |
|:------------:|:-----------:|
| サイトのURL | url |
| サイトのタイトル | title |
| 読み込み | loading |
| 進捗 | estimatedProgress |
| 戻る | canGoBack |
| 進む | canGoForward |

###スワイプで戻る、進む
```swift
self.webview.allowsBackForwardNavigationGestures = true
```

###UserScript
Swift2.2

```swift
//sourceに、実行するスクリプトを代入
let source = "console.log('Hello, UserScript!');"
let userScript = WKUserScript(source: source, injectionTime: .AtDocumentEnd, forMainFrameOnly: true)
let userController = WKUserContentController()
userController.addUserScript(userScript)
let configuration = WKWebViewConfiguration()
configuration.userContentController = userController
webview = WKWebView(frame: CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height), configuration: configuration)
``` 
Swift3

```swift
//sourceに、実行するスクリプトを代入
let source = "console.log('Hello, UserScript!');"
let userScript = WKUserScript(source: source, injectionTime: .atDocumentEnd, forMainFrameOnly: true)
let userController = WKUserContentController()
userController.addUserScript(userScript)
let configuration = WKWebViewConfiguration()
configuration.userContentController = userController
self.webview = WKWebView(frame: CGRect(x: 0, y: 0, width: self.view.frame.size.width, height: self.view.frame.size.height), configuration: configuration)
```

#リンク
[WKWebView Class Reference - Apple Developer](https://developer.apple.com/library/ios/documentation/WebKit/Reference/WKWebView_Ref/)

#コメント
勉強したての頃に書いたので、間違いがありましたら教えてください。
webViewのframe指定はあえてCGRectMake()を使って書きました。Swift3になってCGRectMake()がないみたいなんですが、CGRect()でいいんですかね？

(9/30追記)
removeObserverはdeinitに書くのが一般的だそうなので書き換えました。