ObjecTips

Swift & Objective-C で iOS とか macOS とか

iOS 13 WebKit の変更点

WKWebpagePreferences

WKWebpagePreferences クラスが追加された。
既存では WKPreferences というクラスが WKWebView 全体の設定クラスとして用意されている。
新たに追加された WKWebpagePreferences は基本的にはページ単位での設定クラスになる。

どういった設定ができるのかドキュメントを見てみると
WKWebpagePreferences - WebKit | Apple Developer Documentation

現状できる事は WKWebpagePreferences.ContentMode の設定のみ。
Webページの表示をデスクトップ表示するかモバイル表示するか推奨表示を利用するかを選択する事しかできない模様。

enum ContentMode : Int {
    case desktop
    case mobile
    case recommended
}

WKWebpagePreferences.ContentMode - WKWebpagePreferences | Apple Developer Documentation

使用方法

WKWebViewConfiguration を用いて WKWebView の全体設定としてデフォルトでどのモードで表示するかを設定する事ができる。

@NSCopying var defaultWebpagePreferences: WKWebpagePreferences! { get set }

defaultWebpagePreferences - WKWebViewConfiguration | Apple Developer Documentation

また、WKNavigationDelegate を利用して表示するページ毎にダイナミックに設定を変更する事もできる。

optional func webView(_ webView: WKWebView, 
      decidePolicyFor navigationAction: WKNavigationAction, 
          preferences: WKWebpagePreferences, 
      decisionHandler: @escaping (WKNavigationActionPolicy, WKWebpagePreferences) -> Void)

webView(_:decidePolicyFor:preferences:decisionHandler:) - WKNavigationDelegate | Apple Developer Documentation

iOS だけではなくて macOS でも利用可能なAPIなのでMacアプリでモバイルサイトの表示という事もできてしまいそうではあるが、実際にAPIを試してみたところ

  • iOSアプリでデスクトップ表示は可能
  • Macアプリでモバイル表示の設定はなぜか反映されず*1

という結果になった。(理由は不明)
またサイトによってはおそらくレスポンシブデザインでウィンドウ幅を基準に表示を表示を変えていたり、UserAgent を基準に表示を変えていたりしているため、この WKWebpagePreferences による表示切り替えが効かない場合もあった。
対応サイトでのみ有効という感じになりそう。

WKSnapshotConfiguration

スクリーンショットを撮る時の設定に afterScreenUpdates のオプションが追加された。

var afterScreenUpdates: Bool { get set }

afterScreenUpdates - WKSnapshotConfiguration | Apple Developer Documentation


WebKit の大まかな変更点は以上2つ
あとはエラーコードの追加のみ

WKError - WebKit | Apple Developer Documentation

*1:macOS アプリで WKWebView を使う場合は Capabilities > Sandbox > Outgoing Connection (Client) を有効にしないと通信できないので検証の際には注意