UIWebViewからWKWebViewへの移行が大変

Swift

UIWebViewの使用が不可になる

UIWebViewはdeprecateされ、App Storeにて、新規リリースは2020年4月、アップデートは2020年12月からアプリを受け付けなくなるようです。

ということで、UIWebViewからWKWebViewへの移行が必要となったのですが、これがなかなか大変だったので、引っかかったポイントをまとめておきたいと思います。

UIWebViewを使っている場所を探す

まずは、UIWebViewを使用している箇所を一覧化しましょう。
自分の場合は、Podファイル内でも使用されていることが分かりました。

grep -r WebView

WKWebViewに移行する際に引っかかったポイント

上記でUIWebViewが使われているファイルを置き換えていきます。もちろん、Storyboardなども使用していたら、そちら側もです。また、GoogleMobileAdsでもUIWebViewが使用されていた為、最新のバージョンのものに置き換えました。

その中でも、以下はWKWebViewに置き換えていて引っかかったポイントです。

loadHTMLStringの使用時にエラーになる

元々は以下のように、UIWebViewでも使用していたloadHTMLStringを使う際に、第2引数をnilにしていたのですが、それだと落ちてしまうようです。

webView.loadHTMLString(html, baseURL: nil)

解決策として、以下のように何かしら空のhtmlファイルを用意して、baseURLに渡すようにしました。
web.htmlというのを空で作って、アプリ内に入れてあります。

webView.loadHTMLString(html, Bundle.main.url(forResource: "web", withExtension: "html"))

loadHTMLStringの使用時にフォントサイズが小さくなってしまう

UIWebViewだとloadHTMLString使用時でも、割と良い感じのフォントサイズで表示してくれていたのですが、WKWebViewにしたら、やたらとフォントサイズが小さくなってしまいました
これは、viewportを指定していないことが原因だったのですが、UIWebViewだとここへんを自動的に上手いことやってくれていたのですかね?

let style: String = "<header><meta name='viewport' content='width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no'></header>"
self.webView.loadHTMLString(style + html, baseURL: Bundle.main.url(forResource: "web", withExtension: "html"))

loadでもviewportを付けてあげる

loadHTMLStringではなく、loadで外部のURLを読みに行った際に、viewportを使用していないサイトが未だに結構あったりします。そこでloadする前にviewportを付けてあげるようにしました。

var scriptContent = "var meta = document.createElement('meta');"
scriptContent += "meta.name='viewport';"
scriptContent += "meta.content='width=device-width';"
scriptContent += "document.getElementsByTagName('head')[0].appendChild(meta);"
webView.evaluateJavaScript(scriptContent, completionHandler: nil)
webView.load(url)

以上で、とりあえずUIWebViewを使用していた時と同じ動きをするように修正出来ました。

最後に

幸いなことにDelegateは殆ど使っていなかったので、まだマシだったかなという感じでした。こういった割と大掛かりな変更が必要な場合には、Apple側でconverterとか用意して欲しいものですね。。

コメントを残す