ぴぽのたわごと

ジャンル問わず。自由気ままに書いてます。

【iOS】swiftでWebViewにサイトが表示されない

こんにちは。
iOSの勉強を始めたばかりのぴぽです。

早速Webページ画面を表示するアプリを作成しようとしていたのですけど、サイトが表示されない問題にぶつかりました。
解決法をメモしておきます。

まず僕の書いていたコードです。

import UIKit

class ViewController: UIViewController {

    @IBOutlet weak var webview: UIWebView!
    
    override func viewDidLoad() {
        super.viewDidLoad()

        let requestURL = NSURL(string: "http://www.google.com/")
        let req = NSURLRequest(url: requestURL! as URL)
        webview.loadRequest(req as URLRequest)
    }

    override func didReceiveMemoryWarning() {
        super.didReceiveMemoryWarning()
        // Dispose of any resources that can be recreated.
    }
}

その結果、
f:id:pipoblog:20171208121829p:plain:w200

こんな風に真っ白な画面のままだったんですね。

どうやらこれはiOS9から追加されたApp Transport Security(ATS)が影響しているようです。

ATSとは、iOS 9.0およびOS X v10.11以降で導入された、「サーバとアプリケーション間でセキュアな通信を保証するための機能」です。
ATSを有効化にすることにより、Appleが推奨する条件を満たすHTTPS通信のみ許可され、条件を満たさないHTTPS通信やHTTP通信は強制的に接続失敗扱いとなります。
引用元 株式会社ラック

つまりHTTP通信は接続させませんよってことみたいです。
今回のコードだと

let requestURL = NSURL(string: "http://www.google.com/")

URLを"http"にしていたことが問題だったんですね。

Googleさんの場合、HTTPSも用意されているので

let requestURL = NSURL(string: "https://www.google.com/")

と変更して見たところ
f:id:pipoblog:20171208123204p:plain:w200

無事表示させることができました!


HTTPSが用意されていないサイトの場合、
通信したいドメインをinfo.plistに記述していくか、ATSを無効にするかの対策を取らないといけないようです。

参考になりそうなサイトを見つけたのであげておきます。
info.plistに記述する方法▼
qiita.com

ATSを無効にする方法▼
qiita.com