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

  • 107
    いいね
  • 0
    コメント

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

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

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を表示する