[iPhone] SFSafariView, WKWebView でWebブラウザを作る

iOSアプリからWebにアクセスしたいときは、SFSafariView, WKWebView, (UIWebView)などを使うと可能です。あるいはSafariに投げてしまうこともできます。


Swift 5.1
Xcode 11.3.1

WebView

Webページを表示する方法はいくつかあります。他のブラウザアプリ、Safariなどへ渡してしまったり、ある程度標準的なUIが付随しているSFSafariViewControllerを使うこともできます。またWKWebViewを使ってカスタマイズすることも可能です。

今まであったUIWebViewは推奨されていません。UIWebViewでは通信関連APIが操作される可能性があり、セキュリティ上好ましくないのと、クラッシュ率が高いという理由からWKWebViewあるいはSFSafariViewControllerを使う方がいいようです。

UIApplication を使って Safari へ渡す

Safari に代行してもらうという安易ですが安全かもしれない方法です。
アプリからちょっとWeb アクセスしたいだけなのに、「戻る」だの、「ダウンロード中」の表示だの考えなくていいので簡単です。
その辺を適当にやるとAppleの申請で Regect になる可能性があります。

UIApplicationクラスを使います

ViewController.swift


コードはこれだけです。
SafariでWebに移動する場合は自分のアプリから外れるのでパラメータの扱いは工夫が必要です。

SFSafariViewController を使う

iOS9(iOS8)からはSFSafariViewControllerを使うことができるようになりました。Safariに渡してしまうのではなく、あくまでアプリの一部のViewControllerとして扱えます。

また、ブラウザに必要なボタン等が標準で付いていてお手軽です。カスタマイズしたいのであれば、後出のWKWebViewを使います。

UIViewController.swift

WKWebView を使う

アプリの中にWebページを挿入するなどのカスタマイズをしたい場合に使います。

SafeArea:
何も考えずに今まで通りに画面いっぱいにしているとSafeAreaの問題がiPhone X系で起きます。この場合はステータスバーにWebの内容が被ってしまいます。



topPaddingを計算してSafeAreaの上部にUIWebViewが被らないようにします。下部はボタンを出すときは考慮する必要がありますが、そうでない場合はむしろ見せるというスタンスのようです(面倒ですが)とりあえずportraitの場合だけ考えてみます。(Landscapの場合は両サイドとホームインジケータに注意を払わないといけませんが)

UIViewController.swift


カスタマイズなので「戻る」や「リロード」ボタンなどもそれぞれ作る必要があります。

Safari

WKWebView

UIWebView クラス

昔からあるものですがサポート終了です。iOS12以上ではWKWebViewを推奨しています。

ViewController.swift

References:
UIApplication — UIKit | Apple Developer Documentation
WKWebView — WebKit | Apple Developer Documentation
SFSafariViewController — SafariServices | Apple Developer Documentation
UIWebView — UIKit | Apple Developer Documentation