#背景
アプリ内で自社広告のために、ブラウザ(UIWebView)を貼り付けて広告を出しているのだけれど、iOS9にあげると表示がされなくなってしまった。
左画面の下部分にバナー状の広告を表示しているのと、右上のアイコンをクリックすると右画面が表示されて、自社作成アプリが表示される仕様なのだけれど、何も表示されず真っ白になってしまった。
#原因
どうやらiOS 9.0(OS Xは10.11)以上から導入されたATS(App Transport Security) という、アプリとウェブサービスとの間でセキュアな接続を確保するためのものです。
デフォルトではHTTP通信がHTTPS通信(SSL通信)に切り替えらてしまいます。
実行すると以下のようなエラーが出ているのがわかります。
didFailLoadWithError error: Error Domain=NSURLErrorDomain Code=-999 "The operation couldn’t be completed. (NSURLErrorDomain error -999.)" UserInfo=0x14e989f0 {NSErrorFailingURLKey=http://tadamatu0001.web.fc2.com/, NSErrorFailingURLStringKey=http://tadamatu0001.web.fc2.com/} shouldStartLoadWithRequest url: https://tadamatu0001.web.fc2.com/ NSURLSession/NSURLConnection HTTP load failed (kCFStreamErrorDomainSSL, -9802)
これによりHTTP通信がHTTPS通信(SSL通信)に切り替えられているのが分かる。
参考:App Transport Security Technote(英語)
#解決方法
ATSを有効にした状態で、ATSの対象にしないドメインを設定すればよい。
具体的には以下のようにする。
まずはInfo.plist
をSource Code
で開く。
[Info.plist]-[Open As]-[Source Code]
次にATSを有効にした状態で、ATSの対象にしないドメインをInfo.plist
に記載する。
<key>NSAppTransportSecurity</key>
<dict>
<key>NSExceptionDomains</key>
<dict>
<key>tadamatu0001.web.fc2.com</key>
<dict>
<key>NSIncludesSubdomains</key>
<true/>
<key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key>
<true/>
</dict>
</dict>
</dict>
NSIncludesSubdomains
はサブドメインにも適用するかどうかを設定しています。
他のオプションは以下を参考にしてください。
iOS 9 で追加された App Transport Security の概要
#結果
これで無事に表示されるようになりました。
めでたしめでたし。
この記事が皆様のお役に立てば幸いです。
ではまた。