Help us understand the problem. What is going on with this article?

iOS9でHTTP通信ができない時の解決法

More than 3 years have passed since last update.

iOS9.0からはHTTPS通信が推奨されているようで、App Transport Security(以下ATS)が有効である場合は何も設定しないとHTTP通信ができなくなってしまいます。
今回はその対処法についてまとめます。

エラー内容

何も対応しない状態でHTTP通信を行うと以下のログが出力されます。

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.

解決方法の説明に入る前に

.plistでPropertyList上からネストを作る方法です。
例えばApp Transport Security Settingsの下の階層にkey-valueの行を追加してしたい場合に以下の状態で「+」をクリックしてもネストは作られません。
スクリーンショット 2015-12-29 20.58.45.png

スクリーンショット 2015-12-29 22.20.35.png

ネストを作るには、左端の三角を▶︎ではなく▼の状態にする必要があります。
▼の状態で「+」をクリックすれば下の階層にkey-valueの行が追加されます。
スクリーンショット 2015-12-29 22.24.12.png

スクリーンショット 2015-12-29 22.24.26.png

解決方法1:ATSを無効にする(非推奨)

Info.plistを編集します。

PropertyListで編集する場合

keyにApp Transport Security Settingsを追加する

適当な行の「+」ボタンをクリックします。
下の画像ではMain storyboard file base nameの「+」をクリックし、その下に新しい行が追加された状態です。

スクリーンショット 2015-12-29 19.49.43.png

画像にある通り、keyの候補は色々と出てくるのですが、その中に今回必要なkeyがないので自分で「NSAppTransportSecurity」と入力します。
Enter押すと「App Transport Security Settings」に名前が変わります。

ATSを無効にする

今度はApp Transport Security Settingsの「+」をクリックしてください。
こんな表示になるはずです。
スクリーンショット 2015-12-29 19.59.57.png
ここでAllow Arbitrary Loadsを選択し、valueはYESにします。

完成形

スクリーンショット 2015-12-29 19.58.54.png

コードで編集する場合

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSAllowsArbitraryLoads</key>
    <true/>
</dict>

解決方法2:ATSを使用しつつ、一部のドメインを許可する

PropertyListで編集する場合

keyにApp Transport Security Settingsを追加する

解決方法1と同様です。

例外ドメインの設定

先程はkeyにAllow Arbitrary Loadsを選択しましたが、今度はException Domainsを選択します。
Exception Domainsの行の「+」をクリックして行を追加します。
New itemとなっている部分を許可したいドメインに書き換えます。
TypeがStringになっていると思うので、Dictionaryに変更します。
今現在こんなかんじだと思います。

スクリーンショット 2015-12-29 20.52.09.png

この状態だとまだドメインを指定しただけでそれをどうするのかを記述していないので、その指定をするkey-valueを付け足します。
ドメインを記述した行の「+」をクリックし、行を追加します。
New ItemをNSTemporaryExceptionAllowsInsecureHTTPLoadsに変えます。
このままだとStringなのでBooleanに変えてvalueをYESにします。

完成形

スクリーンショット 2015-12-29 20.52.09.png

コードで編集する場合

<key>NSAppTransportSecurity</key>
<dict>
    <key>NSExceptionDomains</key>
    <dict>
        <key>example.com</key>
        <dict>
            <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
            <true/>
        </dict>
    </dict>
</dict>

その他の解決方法

セキュリティレベルを下げる方法、基本的にATSを無効にするものの、一部のドメインをATSの対象にするという方法もありますが、よく使うのは上記2つではないのかなぁと思っています。

もっと詳しく知りたい場合はこちらの情報源が良いのではないかと思います。
http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/
http://shirakiya.hatenablog.com/entry/2015/10/03/234816
http://dev.classmethod.jp/smartphone/iphone/ios-9-intro-ats/

akatsuki174
iOS→Androidエンジニアになりました。それなりに使える言語はSwift, Objective-C, Kotlin, Java。 UX, データ分析, グロースハック, デザイン, 自然言語処理にも興味あり。 1分野に固まらず、いろんな分野のことについて書いていこうと思います。
techtrain
プロのエンジニアを目指すU30(30歳以下)の方に現役エンジニアにメンタリングもらえるコミュニティです。
https://techbowl.co.jp/techtrain/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした