読者です 読者をやめる 読者になる 読者になる

Umi Uyuraのブログ

Titaniumを使ったスマートフォンアプリ開発を中心に、プログラミング関連の作業ログ。

Titanium製iPhoneアプリのiOS 9対応について調べてみた

そろそろ本格的にTitaniumで開発したiPhoneアプリiOS 9対応することになりそうなので、自分の携わるアプリに関係するところ中心ですが、どんな対応が必要か調べておくことにしました。

iOS 9へ対応するための準備

以下の2つの環境が必要です。

まず、そもそもiOS 9 SDKで開発をするためにはXcode 7が必要です。

また下記の互換性テーブルを確認すると、iOS 9に対応したTitaniumアプリを開発するには Maximum target iOS version9.0.x になっているものが必要となり、 5.0.0 - latest となっていることから、SDK 5.x系が必要ということになります。

Titanium Compatibility Matrix - Appcelerator Platform - Appcelerator Docs

iOS 9で対応しなければならないこと

Titanium SDK 5.0.0.GAのリリースノート を確認したところ、 iOSNotice of Feature and Behavior Changes として、以下の項目がありました。

  • Application Transport Security
  • Contacts
  • Icons and Launch Images
  • IPv6 DNS64/NAT64 Compatibility
  • ListView Edit Actions

これらのうち、今回自分に関係したのは、 Application Transport SecurityIcons and Launch ImagesIPv6 DNS64/NAT64 Compatibility の3点でした。

連絡先は参照しておらず、TableViewを使っているものはありましたがListViewは使っていなかったので、 ContactsListView Edit Actions については何もしていません。

Icons and Launch Images

Noticeではありますが、New Featureでもあるのが、Asset Catalogへの対応でしょうか。

アプリアイコン・設定画面用アイコン・Spotlight用アイコン、そして起動イメージはAsset Catalogに追加されることになりました。

これにより、ストアから配信されるアプリサイズを小さくすることができる、App Thinningも活用できるようになるようです。

アイコンが自動生成されるようになった

Titanium 5.0から、どうやら必要な全てのサイズのアプリアイコンがない場合はビルドエラーになるようなのですが、代わりにアイコン類を自動生成してくれる機能がつきました。

1024x1024の DefaultIcon.png をプロジェクト直下に用意しておくことで、不足しているサイズのアイコンを自動生成してくれるようになります。

個別に用意したい場合は、これまで同様 app/assets (Alloy) や Resources (Classic) の配下に必要なものを置いておけば、それを使ってくれます。

試しに

f:id:umi-uyura:20151016073157p:plain

のような画像をプロジェクト直下に置いてビルドすると、

f:id:umi-uyura:20151016073224p:plain

アイコンのAsset Catalog内に不足しているアイコンが生成されているのがわかります。

ただし i18n フォルダ内に用意した起動画像は、Asset Catalogをサポートしていないようです。

Asset Catalog化されたことによる注意点

Asset Catalog化された画像は、これまでのように直接ファイルを参照できなくなっています。

よって、例えば backgroundImage などに Default.png をセットして使っているといった場合、そのままでは画像が表示されなくなります。

Objective-Cでは、UIImageでAsset Catalog内の画像を参照させることもできるようですが、Ti.UI.ImageViewではまだできない模様。

そのため、この場合は必要な画像のみを、他の画像同様 Resouces/iphone などにもコピーして配置しておくことで対処しました。

Application Transport Security

細かい条件が色々とあるようですが、ざっくりとSSL化していない通信は許可されなくなるそうです。

Titanium SDK 5.0.0.GAでは、このATSのデフォルトは無効(全ての通信を許可)になっています。よって、SDKバージョンをあげたら通信できなくなるといったことはないようです。

ただし、Apple的にATSを無効にすることは推奨していません。

不特定多数のサーバーと通信する可能性があるアプリであれば、ATSを無効にするしか手段がなさそうですが、今回想定しているアプリでは基本的に通信をおこなうサーバーは決まっているものであったため、ATSを有効にしつつ、特定ドメインの通信のみ可能とすることにしました。

ATSを有効にする

まずは、無効になっているATSを有効にしてみました。

tiapp.xmlNSAppTransportSecurity というキーを追加して、 NSAllowsArbitraryLoadsfalse に設定します。

<?xml version="1.0" encoding="UTF-8"?>
<ti:app xmlns:ti="http://ti.appcelerator.org">
  ...
  <ios>
    <plist>
      <dict>
        ...
        <key>NSAppTransportSecurity</key>
        <dict>
          <key>NSAllowsArbitraryLoads</key><false/>
        </dict>
      </dict>
    </plist>
  </ios>
  ...
</ti:app>

この状態でHTTP通信を行うと、以下のようなログが出力されていて、接続できませんでした。

[DEBUG] 2015-10-07 18:43:18.268 XXXXXXXXXXXXX[7336:46947] 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.
[ERROR] The resource could not be loaded because the App Transport Security policy requires the use of a secure connection.

特定ドメインの通信を可能にする

次に、特定ドメインに対する通信のみ可能にします。

tiapp.xmlNSAppTransportSecurity キーに NSExceptionDomains キーを追加し、HTTPで通信を許可するために NSExceptionAllowsInsecureHTTPLoadstrue で設定しました。

また、 www.example.com のようにサブドメインにもアクセスするために、 NSIncludesSubdomainstrue にしました。

<?xml version="1.0" encoding="UTF-8"?>
<ti:app xmlns:ti="http://ti.appcelerator.org">
  ...
  <ios>
    <plist>
      <dict>
        ...
        <key>NSAppTransportSecurity</key>
        <dict>
          <key>NSAllowsArbitraryLoads</key><false/>
          <key>NSExceptionDomains</key>
          <dict>
            <key>example.com</key>
            <dict>
              <key>NSExceptionAllowsInsecureHTTPLoads</key>
              <true/>
              <key>NSIncludesSubdomains</key>
              <true/>
            </dict>
          </dict>
        </dict>
      </dict>
    </plist>
  </ios>
  ...
</ti:app>

NSAppTransportSecurity は、他にも細かい制御が色々とできるようなので、詳しい設定は以下のURLを参照してください。

Appcelerator Analytics用コードの自動注入

Appcelerator Analyticsのために appcelerator.com サブドメインを有効にするコード注入がされるので、それを無効にしたければ tiapp.xml に以下のように追記するようにとありました。

<ti:app>
    <property name="ios.whitelist.appcelerator.com" type="bool">false</property>
</ti:app>

具体的には、ビルド後のInfo.plistで NSExceptionDomainsappcelerator.com が追加される形になります。

ですが、5.0.2.GAで確認した限り、以下のように tiapp.xml でAppcelerator Analyticsを無効にしている場合は、そもそも自動注入は行われないようでした。

<?xml version="1.0" encoding="UTF-8"?>
<ti:app xmlns:ti="http://ti.appcelerator.org">
  ...
  <analytics>false</analytics>
  ...
</ti:app>

私の場合は、自分用のTitaniumプロジェクトのテンプレートでAnalyticsはオフにしていることもあり、特に気にしなくても良さそうでした。

Titaniumプロジェクトのオレオレテンプレートを作る - Qiita

IPv6 DNS64/NAT64 Compatibility

今後iTunes Storeへサブミットするアプリは、IPv6オンリーのネットワーク環境でも動作するようにする必要があるようです。

とは言え、iOSAPIを直接使っている場合は要確認かもしれませんが、Titanium APIベースで開発している場合は、Titanium.Network内部の実装で対応してくれていると思われるので、それほど気にする必要はないかもしれません。

ただ、モジュールを使っている場合は、そのモジュールもIPv6 Compatibilityである必要がありますので、念のため動作確認はしておいた方が良さそうです。

もし対応していない箇所があると、審査時にリジェクトされることになる模様。

IPv4リテラルを使わないようにしておく

Apple的に、 127.0.0.1 といったIPv4アドレスリテラルをハードコーディングするのは推奨していないらしいので、コード内にそういった箇所がないかを確認しておきます。

開発用のサーバーをIPアドレス指定しているような場合など、そのコードが申請時に残らないようにしておいた方が良さそうですね。

IPv6対応の確認方法

念のため、本当にIPv6環境でも動作するのかを事前に確認するために、Macのインターネット共有機能を利用することができるようです。

ただし、OS X 10.11 (El Capitan) が必要とのこと。

自分はEl Capitanへのアップグレードを保留しているところなので、現状確認することができません。

いちおう IPv6 DNS64/NAT64 Compatibility への対応期限は2016年初頭ということで、いますぐ必須というわけではないため、タイミングをみて実施しようと思います。

Titaniumのサポート力は世界一ィィィィーーーーッ!

(スイマセン、言ってみたかっただけです)

3年前の時点で、TitaniumがiOS 9をサポートすることが明言されていました!しかもSDK 6.6.6で!

Titanium Mobile SDK 6.6.6 and iOS 9 support » Community Questions & Answers » Appcelerator Developer Center

予定していたHolographic FaceTimeやLaser keyboardなどのサポートがないのは、Appleのせいだそうです(笑)

参考

Titanium Mobileアフ?リ開発のコツ: アプリ65個を作成して分かった実践ノウハウ

Titanium Mobileアフ?リ開発のコツ: アプリ65個を作成して分かった実践ノウハウ

Titanium mobileアプリ開発のコツpart2: WebAPI・モジュールを利用した開発のコツ

Titanium mobileアプリ開発のコツpart2: WebAPI・モジュールを利用した開発のコツ