GADGET FACTORY 雑記帳

iPhone アプリ / Flash コンテンツ /Adobe AIR などを開発していて気づいたことや備忘録、TIPS、HACKなど

Adobe AIR で開発したiPhoneアプリが iPhone( iOS9 )でサーバーと通信できない現象への対応

ここ最近、Adobe AIR SDK を利用した、iPhone 用のアプリ開発から遠ざかっておりました。

先日ようやくリリースされた案件は、Android版は Adobe AIR SDK を使って apk を吐き出し、iPhone版は HTML5 (JavaScript)を使った WEBアプリというような組み合わせの仕事をしておりました。

iPhone版のみの場合であれば、Object-C でネイティブアプリとして開発することもしております。

そんな状況で、久しぶりに Adobe AIR SDK を利用して iPhoneAndroid向けのアプリを制作いたしました。

制作自体は問題なく順調に進行し、アプリ内課金や 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 のリリースノートに原因らしきものを発見しました。
Flash Player ヘルプ | リリースノート | Flash Player® 20、AIR® 20

どうやら、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 未満の場合も、おそらく問題はないと思われます。

今回の現象に引っかかるのは、

  • Adobe AIR SDK 20 以降の SDKを利用してパブリッシュしたアプリを
  • iOS9以降の実機で
  • インターネットとの通信で保護されていない接続を行おうとした場合

通信が行えなくなるということです。

解決するには、サーバー側に 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 でパブリッシュしたところ、無事に通信が行えました。

しばらく利用していなかった開発環境に久しぶりに戻ってくると、状況が色々と変わっていたりして大変だったりしますね。