目次
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とか用意して欲しいものですね。。