Titanium製iPhoneアプリのiOS 9対応について調べてみた
そろそろ本格的にTitaniumで開発したiPhoneアプリをiOS 9対応することになりそうなので、自分の携わるアプリに関係するところ中心ですが、どんな対応が必要か調べておくことにしました。
iOS 9へ対応するための準備
以下の2つの環境が必要です。
まず、そもそもiOS 9 SDKで開発をするためにはXcode 7が必要です。
また下記の互換性テーブルを確認すると、iOS 9に対応したTitaniumアプリを開発するには Maximum target iOS version が 9.0.x になっているものが必要となり、 5.0.0 - latest となっていることから、SDK 5.x系が必要ということになります。
Titanium Compatibility Matrix - Appcelerator Platform - Appcelerator Docs
iOS 9で対応しなければならないこと
Titanium SDK 5.0.0.GAのリリースノート を確認したところ、 iOSの Notice of Feature and Behavior Changes として、以下の項目がありました。
- Application Transport Security
- Contacts
- Icons and Launch Images
- IPv6 DNS64/NAT64 Compatibility
- ListView Edit Actions
これらのうち、今回自分に関係したのは、 Application Transport Security と Icons and Launch Images 、 IPv6 DNS64/NAT64 Compatibility の3点でした。
連絡先は参照しておらず、TableViewを使っているものはありましたがListViewは使っていなかったので、 Contacts 、 ListView 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) の配下に必要なものを置いておけば、それを使ってくれます。
試しに
のような画像をプロジェクト直下に置いてビルドすると、
アイコンの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.xml に NSAppTransportSecurity
というキーを追加して、 NSAllowsArbitraryLoads
を false
に設定します。
<?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.xml に NSAppTransportSecurity
キーに NSExceptionDomains
キーを追加し、HTTPで通信を許可するために NSExceptionAllowsInsecureHTTPLoads
を true
で設定しました。
また、 www.example.com
のようにサブドメインにもアクセスするために、 NSIncludesSubdomains
を true
にしました。
<?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で NSExceptionDomains
に appcelerator.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オンリーのネットワーク環境でも動作するようにする必要があるようです。
とは言え、iOSのAPIを直接使っている場合は要確認かもしれませんが、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で!
予定していたHolographic FaceTimeやLaser keyboardなどのサポートがないのは、Appleのせいだそうです(笑)
参考
- iOS9対応でやろうと思っていることまとめ - NSBlogger
- iOS9 ATS問題 - Qiita
- iOS9 : App Transport Securityの確認方法 - VOYAGE GROUP techlog
- [iOS 9] iOS 9 で追加された App Transport Security の概要 | Developers.IO
- iOS9 で必要な IPv6 only Network への対応 - Qiita
Titanium Mobileアフ?リ開発のコツ: アプリ65個を作成して分かった実践ノウハウ
- 作者: 船見雅之
- 出版社/メーカー: Funami クリエイツ
- 発売日: 2015/07/19
- メディア: Kindle版
- この商品を含むブログを見る
Titanium mobileアプリ開発のコツpart2: WebAPI・モジュールを利用した開発のコツ
- 作者: 船見雅之
- 出版社/メーカー: Funami クリエイツ
- 発売日: 2015/07/25
- メディア: Kindle版
- この商品を含むブログを見る