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

More than 1 year has passed since last update.

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


ローカルファイルの読み込みがやっと可能に

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のみの対応としました。

:link: WKWebViewで躓いた10つのまとめ

:link: iOS 10 WKWebView 新機能 リンクを3D TouchでSafari以外の独自ViewControllerを表示する