iOS 9 WKWebView 主な変更点をざっくり

ざっくり見て行きましょう。

## ローカルファイルの読み込みがやっと可能に
iOS 8ではwebViewへ表示できるコンテンツはネット上のもの、もしくはインラインのHTMLのみでした。
iOS 9になりようやくローカルのファイルを読むことが可能になりました。

`- (nullable WKNavigation *)loadFileURL:(NSURL *)URL allowingReadAccessToURL:(NSURL *)readAccessURL; // WKWebView.h:101`

データとしても読み込めます。

`- (nullable WKNavigation *)loadData:(NSData *)data MIMEType:(NSString *)MIMEType characterEncodingName:(NSString *)characterEncodingName baseURL:(NSURL *)baseURL; // WKWebView.h:117`


## セキュア判定が用意に
証明書の情報を配列として得られます。

`@property (nonatomic, readonly, copy) NSArray *certificateChain; // WKWebView.h:172`


## UserAgentの変更も用意に
以下のプロパティの値がnilの時がデフォルトのUAになります。

`@property (nullable, nonatomic, copy) NSString *customUserAgent; // WKWebView.h:232`


## 3D Touchリンクに対応
現時点ではiPhone 6s, 6s plus のみ対応している3D Touchによりリンク先のページをプレビュー(peek)できます。
最後まで強く押す(pop)とWKWebViewではなくSafariで立ち上がります。

`@property (nonatomic) BOOL allowsLinkPreview; // WKWebView.h:238`


## Picture in Picture動画再生
以下のプロパティの値がYESでも、デバイスと動画サイト側が対応していないと使用できません。
(もしくはJavaScriptによって強制的にサイト側を対応させるなど)

`@property (nonatomic) BOOL allowsPictureInPictureMediaPlayback; // WKWebViewConfiguration.h:120`


## プライベートモードが実装可能に
Cookie, Cache, その他Webデータを端末内に残さないようにできます。

`@property (nonatomic, strong) WKWebsiteDataStore *websiteDataStore; // WKWebViewConfiguration.h:79`

```objc
// dataStoreに永続的な保存を行う (通常)
webView.configuration.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
// dataStoreへの永続的な保存をしない
webView.configuration.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
```


## データの種類と時間を選択して削除可能に

```objc
//// 削除したいデータを選択
NSSet *websiteDataTypes
= [NSSet setWithArray:@[
                        WKWebsiteDataTypeDiskCache,
                        WKWebsiteDataTypeOfflineWebApplicationCache,
                        WKWebsiteDataTypeMemoryCache,
                        WKWebsiteDataTypeLocalStorage,
                        WKWebsiteDataTypeCookies,
                        WKWebsiteDataTypeSessionStorage,
                        WKWebsiteDataTypeIndexedDBDatabases,
                        WKWebsiteDataTypeWebSQLDatabases
                        ]];
//// 全部選択
//NSSet *websiteDataTypes = [WKWebsiteDataStore allWebsiteDataTypes];
//// いつからのデータか
NSDate *dateFrom = [NSDate dateWithTimeIntervalSince1970:0];
//// 削除の実行
[[WKWebsiteDataStore defaultDataStore] removeDataOfTypes:websiteDataTypes modifiedSince:dateFrom completionHandler:^{
   // 完了時
}];
```


## その他

#### 呼び出し元ページの情報を確認
WKFrameInfoに追加されたプロパティ。alert,prompt,confirmやscriptMessageの呼び出し元ページの情報を確認できます。

`@property (nonatomic, readonly) WKSecurityOrigin *securityOrigin; // WKFrameInfo.h:54`


#### UserAgentの末尾に任意の名称を追加

`@property (nullable, nonatomic, copy) NSString *applicationNameForUserAgent; // WKWebViewConfiguration.h:89`


#### JavaScriptからclose()が実行されたときに呼ばれる

`- (void)webViewDidClose:(WKWebView *)webView; // WKUIDelegate.h:65`


#### コンテンツの実行中のプロセスが死んだときに呼ばれる

`- (void)webViewWebContentProcessDidTerminate:(WKWebView *)webView; // WKNavigationDelegate.h:145`


#### JavaScriptの実行結果が帰ってこないときのエラー

`WKErrorJavaScriptResultTypeIsUnsupported // WKError.h:50`


## 不具合？
iOS 9.0のWKWebViewではスクロールレートの変更が不可となっています。これがバグなのか新しい仕様なのかはわかりませんが、Open Radarでも報告されています。

#### Workaround

UIScrollViewのDelegate `scrollViewWillBeginDragging` 内で `decelerartionRate` を設定することで変更が可能でした。回答者に感謝。

[Cannot change WKWebView's scroll rate on iOS 9](http://stackoverflow.com/questions/31369538/cannot-change-wkwebviews-scroll-rate-on-ios-9-beta/32843700#32843700)

## おわり
iOS 8の頃はトリッキーな手法で上記追加項目を再現する以外にはなかったのですが、iOS 9で実装も容易になってきました。
iOS 9への移行率も順調に伸びているので、これらの機能をフルに使いたい場合は思い切ってiOS 8のサポートを外しても良いかもしれませんね。
[Ohajiki Web Browser](https://itunes.apple.com/jp/app/ohajiki-web-browser/id926105977)もiOS 9のみの対応としました。


:link: [WKWebViewで躓いた10つのまとめ](http://qiita.com/ShingoFukuyama/items/eede79a284c3669846e9)
:link: [iOS 10 WKWebView 新機能 リンクを3D TouchでSafari以外の独自ViewControllerを表示する](http://qiita.com/ShingoFukuyama/items/7a3232e6207c7ac59e77)