ATS といえば自動列車停止装置…じゃなくて App Transport Security の略ですが(ここ笑うところ)、iOS では iOS 9.0 以降ではタダでは HTTP 通信が出来ないというやつですね。

今では延期なりましたが 2016年末から ATS 必須化されるところでした。

もちろん、iOS 9.0 で ATS が導入されたことは知っていましたし、ATS 必須化も知っていましたが、iOS 10.0 で幾つか新しく増えた ATS のキーの使い方でハマってしまったので書き残しておきます。

App Transport Security Settings (NSAppTransportSecurity)

Info.plist において、これは Dictionary で ATS に関する設定を書き換えるものですね。iOS 9.0 から使えるものです。

Allows Arbitrary Loads (NSAllowsArbitraryLoads)

これは App Transport Security Settings で使えるキーの一つで、Boolean 型、デフォルトは false です。true にすると全ての HTTP 通信が利用可能になります。要は今まで通り。iOS 9.0 以降で使えます。

Allows Arbitrary Loads For Media (NSAllowsArbitraryLoadsForMedia)

これも App Transport Security Settings で使えるキーの一つで、Boolean 型、デフォルトは false です。true にすると AV Foundation framework で App が読み込むメディアについての ATS 制限が無効になります。暗号化されているメディアをロードする場合に使用されるとか。iOS 10.0 以降で使えます。

Allows Arbitrary Loads In Web Content (NSAllowsArbitraryLoadsInWebContent)

これも App Transport Security Settings で使えるキーの一つで、Boolean 型、デフォルトは false です。true にすると Web View においての ATS 制限が無効になります。UIWebView とか WKWebView ですね。iOS 10.0 以降で使えます。

その他のキー

上に挙げた他にも、

  • Allows Local Networking (NSAllowsLocalNetworking) : Boolean
  • Exception Domains (NSExceptionDomains) : Dictionary

があり、Exception Domains に続くキーもあります。

iOS 10.0 から使えるキーに騙された(?)

Allows Arbitrary Loads In Web Content が iOS 10.0 から使えるということで、以前は Web View でちょこっと何かを表示させたいときも Allows Arbitrary Loads を true にしなければならず、なんだかな〜と思っていました。しかし Allows Arbitrary Loads In Web Content の登場でその必要もなくなったんですね(iOS 9 に対応させる場合には使えませんが)。

私は iOS 9.3 以降に対応させる App を開発しているところで、こんなふうに Info.plist を設定していました。

それで UIImageView に 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.

悩んでいたところ、iOS 10.0 から使える Allows Arbitrary Loads For Media、Allows Arbitrary Loads In Web Content について、Apple Information Property List Key Reference にこんな記述が…

If you add this key to your Info.plist file, then, irrespective of the value of the key, ATS ignores the value of the NSAllowsArbitraryLoads key.

Allows Arbitrary Loads For Media、Allows Arbitrary Loads In Web Content を Info.plist に追加すると、Allows Arbitrary Loads の値を無視してしまうんです。

上のスクリーンショットの通り、私は Allows Arbitrary Loads の他に Allows Arbitrary Loads In Web Content も追加していたため、Allows Arbitrary Loads が無視されたことによって UIImageView のための HTTP 通信が出来なかったんですね。

リファレンスを読もう

いま考えれば Allows Arbitrary Loads と Allows Arbitrary Loads In Web Content を両方記述することはおかしいのですが、上手く動作しないことにかなり悩みました…。リファレンス、ちゃんと読みます。

Information Property List Key Reference の App Transport Security に関する記述の日本語訳は Qiita にアップしておきます。

参考