ざっくり見て行きましょう。
ローカルファイルの読み込みがやっと可能に
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
// dataStoreに永続的な保存を行う (通常)
webView.configuration.websiteDataStore = [WKWebsiteDataStore defaultDataStore];
// dataStoreへの永続的な保存をしない
webView.configuration.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
データの種類と時間を選択して削除可能に
//// 削除したいデータを選択
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
おわり
iOS 8の頃はトリッキーな手法で上記追加項目を再現する以外にはなかったのですが、iOS 9で実装も容易になってきました。
iOS 9への移行率も順調に伸びているので、これらの機能をフルに使いたい場合は思い切ってiOS 8のサポートを外しても良いかもしれませんね。
Ohajiki Web BrowserもiOS 9のみの対応としました。
WKWebViewで躓いた10つのまとめ
iOS 10 WKWebView 新機能 リンクを3D TouchでSafari以外の独自ViewControllerを表示する