Adobe AIR で開発したiPhoneアプリが iPhone( iOS9 )でサーバーと通信できない現象への対応
ここ最近、Adobe AIR SDK を利用した、iPhone 用のアプリ開発から遠ざかっておりました。
先日ようやくリリースされた案件は、Android版は Adobe AIR SDK を使って apk を吐き出し、iPhone版は HTML5 (JavaScript)を使った WEBアプリというような組み合わせの仕事をしておりました。
iPhone版のみの場合であれば、Object-C でネイティブアプリとして開発することもしております。
そんな状況で、久しぶりに Adobe AIR SDK を利用して iPhoneとAndroid向けのアプリを制作いたしました。
制作自体は問題なく順調に進行し、アプリ内課金や Admob、Google Play Store(Android版)やGame Center(iPhone版)なども、ANEを利用してこれまで通り問題なく動作させることができました。
使っていた端末でのデバッグも完了し、このままそれぞれ Google Play Store と iTunes Store へアップするだけという状況になって問題が発生しました。
iTunes Store へアップするためには、各種端末でのスクリーンショットを用意しないといけないのですが、その時にたまたま iPad用のスクリーンショットを撮ろうとしたら、アプリがアクセスしている Webサーバーとの通信でエラーが発生しました。
Wi-Fiとの接続状況が悪いからかと思ったのですが、Admob は表示されております。
手元にあった他のいくつかの端末へもインストールして、同様にテストしてみたところ、iPhone 6 Plus でも同じ現象が発生。
原因について、さらに調査をしてみると、どうやら通信できないのは、iOS9以降の端末ということが判明。
現在の最新の Adobe AIR SDK 22.0.0.153 を利用していて、その辺に原因があるのかなぁとさらに調査を進めてみました。
同様の事例が何か無いかとインターネットも合わせて調べてみたところ、Adobe AIR SDK 20 のリリースノートに原因らしきものを発見しました。
Adobe Flash Playerサポート終了
どうやら、Adobe AIR SDK 20 以降の AIR Runtime は、iOS 9 SDK を使用して作成されており、その為、iOS9から導入されたアプリと Web サービス(インターネット)間の保護されていない接続をブロックする機能である ATS(Apple Transport Security) に引っかかってしまうことが原因でした。
iOS9がリリースされた時に、Object-C で開発していたアプリの改修案件を請けた際には対応していて、知っていることではありましたが、Adobe AIR SDK でも同様の問題に引っかかってしまうとは・・・
Adobe AIR SDK 20 以降で、Loader および URLLoaderを使用した保護されていないWebサイトへ接続するような iPhoneアプリを作る際には、xmlファイルの書き換えが必要なようです。
ただし、iOS8までの端末の場合は、ATS に引っかからないので通信ができます。
また、利用している Adobe AIR SDK のバージョンが 20 未満の場合も、おそらく問題はないと思われます。
今回の現象に引っかかるのは、
通信が行えなくなるということです。
解決するには、サーバー側に SSL などの認証を利用して、通信を「https://〜」に変更することが最善策だとは思いますが、諸々の事情でそれもなかなか難しかったりします。
なので、とりあえずデフォルトの動作に対する例外のアドレスを、マニフェストファイル(****.xml)に追記することで対応できるようです。
xml ファイル内にある InfoAdditions タグにキーを追加して、やれば良いようです。
xmlファイルの内容の一部に、下記のようなコードを追記します。
〜中略〜 <iPhone> <InfoAdditions> <![CDATA[ <!-- ここから追加 --> <key>NSAppTransportSecurity</key> <dict><key>NSExceptionDomains</key> <dict> <!-- 以下の hogehoge.com の部分をアクセスするドメイン名に変更する --> <key>hogehoge.com</key> <dict> <!--Include to allow subdomains--> <key>NSIncludesSubdomains</key><true/> <!--Include to allow HTTP requests--> <key>NSTemporaryExceptionAllowsInsecureHTTPLoads</key><true/> <!--Include to specify minimum TLS version--> <key>NSTemporaryExceptionMinimumTLSVersion</key> <string>TLSv1.1</string> </dict> </dict> </dict> <!-- ここまで追加 --> ]]> </InfoAdditions> </iPhone>
実際に上記を記述した後、Adobe AIR SDK 22 でパブリッシュしたところ、無事に通信が行えました。
しばらく利用していなかった開発環境に久しぶりに戻ってくると、状況が色々と変わっていたりして大変だったりしますね。