WKWebViewとUIWebView

どうもこんにちは。

最近仕事で、iPhoneアプリの改修作業をしていて悩まされたWebViewのことを紹介したいと思います。


UIWebView

改修元のアプリでhtmlデータを表示するのに使われていたクラスなのですが、長らく非推奨で動いていました。

  • 今年2020年12月には廃止されること
  • html5非対応のため、videoタグなどが利用できない
  • iOS13非対応

今回の改修作業でhtml5のvideoタグの利用に対応するという項目があったので、改修の対象になっています。


WKWebView

現在推奨されているweb, htmlを表示する用のクラス。

UIWebViewから、コンストラクタの呼び出しやメソッド名が変わっている箇所はありますが、基本的になくなっている機能などは特になさそうなので、必要に応じてメソッド名を変更すればおおよそ使えるという感じなのかな、と思います。

イニシャライズ

// Swift -----
        let webConfiguration = WKWebViewConfiguration()
        webView = WKWebView(frame: .zero, configuration: webConfiguration)
// Objective-C -----
        WKWebVConfiguration *config = [[WKWebViewConfiguration alloc] init];
        webView = [[WKWebView alloc] initWithFrame:frame configuration:config];

WKWebViewConfiguration で設定を行ってイニシャライズをしないといけないのが、少し困りました。

ローカルのhtml表示時、相対パス

アプリのローカルデータとしてDocument以下にあるデータを用いていたんですけど、htmlの画像読み込みを相対パスで記述すると読み込めない…なんて問題も発生しました。

iOS13のみ。

iOS13で相対パスでデータを取得することができるのはtmpファイル以下のデータらしいです。

参考:iOSアプリのファイル保存について  https://qiita.com/nnsnodnb/items/13642c4a8d55641f893e

WKWebViewのコンテンツサイズの取得

WKWebViewのコンテンツサイズはwebView.scrollView.contentSizeで本来取得できるのですが、描画完了後でないと正しい値をとることができません……

webView: didFinishNavigationでjavascriptを実行したコールバック…であればとれました!

その他参考にしたもの(メモ程度ですが)