WKwebviewからhtmlで作成したサイトを開く際に、外部リンクが開けないことがありました。
http,https共に発生したので、その際に対応した内容をまとめました。
リンク先がhttpの場合
htmlで下記のようにhttpsのサイトへのリンクを作成していたのですが、webviewから開くと、ロードが終わらずに画面が切り替わらない現象が発生しました。
<a href="http://www.metro.tokyo.jp/">東京都公式ホームページ</a>
ATSを無効にする
ATSを有効にしているとhttpsのみ許可されます。
デフォルトで有効になっているため、こちらの変更をすることでリンクを開けるようになります。
デメリット
セキュリティ上全てのhttpサイトを許可してしまうことは良くないです。
ドメインを指定してATSを無効にする
ドメインを指定して許可をするとセキュリティ的には良いそうです。
デメリット
webview側に新しくリンクを作成した場合、アプリ側の修正も必要になります。
運用を考えると、webの修正のためにアプリの修正が発生してしまうことは良くないと思います。
参考
「http://」のAPIを実行できるようにする(Swift)
リンク先がhttpsの場合
httpsのリンクでも表示ができないパターンがありました。
リンク先に飛ぶと、画面が真っ白になってしまい、戻るボタンを押すと一瞬表示がされたりされなかったりという状態でした。
下記の記事によると、
リダイレクト関連の通信でhttpがあるとATSによって弾かれてしまうようですね。
リダイレクト先もException Domainの設定に含めるか、非推奨ですがAllowsArbitraryLoadsをYESにして無効化すると表示できるようになります。
【Swift】WKWebViewでhttpsのページを表示できない原因(ATS)
safariで開くようにする
ATSの設定を変更せずに、webviewではなくsafariで開くようにする方法です。
個別ドメインを許可する場合にはwebviewに新しくリンクを変更した時にアプリ側にも変更が必要になってしまいますが、
safariで開くようにしてしまえば、webview側の変更をしてもアプリの変更が必要なくなります。
また、将来的にATSが必須化になるため、できればsafariで開くようにしておくと今後の対応も不要になるかと思います。
iOS/Android セキュリティガイドライン [iOS] App Transport Security(ATS)
safariで開く対応に関してはstack overflowに上がっていましたので、参考になるかと思います。
WKWebView open links from certain domain in safari