121
114

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

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

Last updated at Posted at 2015-09-27

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

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

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

121
114
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
121
114

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?