とりあえず、URLSessionを使って通信してみる。(たぶん一番単純なもの)

macOS向けに書くがiOSでも基本的に同じだ。

ボタンを貼ってそれを押した時の処理をこんな感じにする。

    @IBAction func buttonClick(_ sender: NSButton) {
        let url = URL(string: "http://www.livedoor.com/")
        let config = URLSessionConfiguration.default
        let session = URLSession(configuration: config)
        let req = URLRequest(url: url!)
        
        let task = session.dataTask(with: req, completionHandler: {
            (data, res, err) in
            if let uerr = err {
                print(uerr.localizedDescription)
            }
            if let udata = data {
                let str = String(data: udata, encoding: String.Encoding.utf8)
                print(str ?? "エラー")
            }
        })
        task.resume()
    }

これを実行するとこんなエラーがでる。

2017-02-07 23:04:07.107 TestHttp[71203:1144451] App Transport Security has blocked a cleartext HTTP (http://) resource load since it is insecure. Temporary exceptions can be configured via your app's Info.plist file.
The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

App Transport Security(ATS)によってHTTP通信をブロックしてるって書いてある。基本的にHTTPS通信しろと言うことだ。
例外的にこれを解決するにはInfo.plistを変更する必要がある。何種類か方法があるが何個か書いておく。

非推奨の方法

App Transport Security Settingsを追加してその下にAllow Arbitrary Loadsを追加してYESにする。

002

例外ドメインを追加する方法

App Transport Security SettingsにException Domainsを追加してDictionary型でドメイン(ここではwww.livedoor.com)を追加する。NSTemporaryExceptionAllowsInsecureHTTPLoads、NSIncludesSubdomainsをBoolean型でYESで追加する。

003

次にTextViewに受信したデータを表示してみよう。
UI部品を操作するにはメインスレッドで行う必要があるのだが、dataTaskに指定するクロージャは別スレッドで実行されるのでDispatchQueue.main.asyncを使ってアクセスする。TextViewをはっ付けてtextViewでアクセスできるようにして、次のコードをprint(str ?? "エラー")の次あたりに追加する。

                DispatchQueue.main.async {
                    self.textView.string = str
                }

(追記)
DispatchQueue.main.asyncより、OperationQueue.main.addOperationの方がいいのかな。