Xcode7 + iOS9端末だと広告がでないエラー
App Transport Security has blocked
iOS9のiPhone6でアプリの動作確認をしていると、広告がでていないことに気付きました。
焦ってログを見るとこんなエラーが
2015-09-28 10:26:43.461 xxx[285:18772] 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.
広告SDKのhttp通信がシャットアウトされたというログです。
なので広告を取得できず、表示されていません。
エラーの解決方法(邪道)
これ、対処法としては邪道です(後述)。非常によろしくないんですが…。
Xcodeのプロジェクトから、
『info.plist』を開き、『Add Row』で、『NSAppTransportSecurity』を追加。
Typeは『Array』として、子要素(『+』で追加、Typeは『String』)に、
『NSAllowsArbitraryLoads』 を追加。
Typeは『Boolean』とし、『YES』を設定すればOKです!
どういうエラーか
iOS9よりATS(App Transport Security)という機能が組み込まれ、
http通信は許可されなくなりました。(httpsで通信しなさいということ)
普通はiOS9に対応した最新SDKを組み込めばいいのですが、
あまり積極的でない提供者さんの場合はSDKが更新されていなかったりします。。。
邪道な理由
ATSをOFFにしているからです(ΦωΦ)
完全にAppleさんは非推奨なやり方ですので、自己責任でお願いします。
(iTunesに審査提出してみたところ、提出まではOKでした。リジェクトあり得ますが…)
正当の対処法としては、ATSの例外としてドメインを指定できるので、
SDKが通信するドメインさえわかれば登録するのが筋なんですが。
わからない場合はもう全部切るという方向で…いくしかないじゃないか…。
というかこれってSSPの事業者さんが一番大変そう。
各広告会社さんがHTTPS通信を提供しないと対応が完了しないですよね。
info.plistのソース版
ATSをOFF
<key>NSAppTransportSecurity</key>
<dict>
<key>NSAllowsArbitraryLoads</key>
<true/>
</dict>
ATSに例外ドメイン(google.co.jpとサブドメイン)を指定
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>google.co.jp</key>
<dict>
<key>NSExceptionRequiresForwardSecrecy</key>
<false/>
<key>NSIncludesSubdomains</key>
<true/>
</dict>
</dict>
</dict>
他にも指定できるオプションはいろいろあります。
NSIncludesSubdomains
NSTemporaryExceptionMinimumTLSVersion
NSRequiresCertificateTransparency
NSTemporaryExceptionRequiresForwardSecrecy
NSTemporaryThirdPartyExceptionAllowsInsecureHTTPLoads
NSTemporaryThirdPartyExceptionMinimumTLSVersion
NSTemporaryThirdPartyExceptionRequiresForwardSecrecy