iOSアプリでWebViewを使用してサイトを閲覧する処理を実装する時には最近だとWkWebViewを使うことが多いと思います。
iOS9からATS(App Transport Security)が導入されたことで、httpのサイトやTLSに問題のあるサイトが標準では読み込めなくなり、上記のWkWebViewを使用している場合でも注意が必要です。WkWebViewで読み込み失敗すると、Storyboardが使えないこともあって真っ白の画面が表示されることが多く、問題の切り分けが難しいと思いますが、今回はそのトラブルシューティングについて何度かつまづいたので投稿します。
※WkWebViewについてやATSの話は割愛します。
Delegateを活用する
WKNavigationDelegateを使用することで、読み込み開始時から完了・読み込み失敗等がキャッチできます。それらの処理でデバッグコードを出力することで、どの部分で止まっているのかが確認できます。
class ViewController: UIViewController, WKNavigationDelegate, WKUIDelegate {
// 読み込み開始時イベント
func webView(_ webView: WKWebView, didStartProvisionalNavigation navigation: WKNavigation!) {
print("start")
}
// 読み込み終了時イベント
func webView(_ webView: WKWebView, didFinish navigation: WKNavigation!) {
print("finish")
}
// 読み込み失敗時イベント
func webView(_ webView: WKWebView, didFail navigation: WKNavigation!, withError error: Error) {
print("fail")
}
}
finishまで出力されて画面に表示されない場合、viewへの追加漏れ等が考えられます。
読み込むURLをチェックする。
Macのターミナルには標準で nscurl
コマンドが用意されており、これを使用することでinfo.plistをどう設定すれば良いかを判定することができます。
Chromeの開発者ツールでTLS1.2を確認しても読み込めないサイトもあるため、こちらで確実にチェックすることをお勧めします。
nscurl --ats-diagnostics --verbose https://XXX.XXXXXXXX.XX.XX/index.html
大量のレスポンスが表示されますが、上から順に確認し Result : PASS
の表記を探してください。
その上で出力されている内容をinfo.plistに記述し、再度WkWebViewで読み込めるかテストしてください。
※セキュリティを弱くするものですので、自分のサイトを読み込む等読み込む側を修正できるのであればそちらを修正することをお勧めします。
Disabling Perfect Forward Secrecy
ATS Dictionary:
{
NSExceptionDomains = {
"XX.XXX.XX" = {
NSExceptionRequiresForwardSecrecy = false;
};
};
}
Result : PASS
<plist version="1.0">
<dict>
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>sp.gch.jp</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
</dict>
</dict>
</dict>
〜
</dict>
</plist>