App Thinning
WWDC15 で発表された、アプリを自動で最適化して配信してくれる新しい仕組み App Thinning についてのメモ。以下3種類に分けられる。
- App Slicing
- On-Demand Resources (ODR)
- Bitcode
iOS 9の特徴のひとつとしてその容量がiOS 8と比べてかなり少ないということがあるが、サードパーティアプリもそれに追随する必要がありそう。そのための仕組みが App Thinning かと。ストレージの消費は必要最小限に。
- App Thinning (iOS, tvOS, watchOS)
- What's New in iOS
- WWDC15 Video: Platforms State of the Union (3:20~)
App Slicing
デバイスや解像度の増加でアプリのリソースやバイナリも増加する傾向にある。でも実際に使用するものは限られるので結果的には無駄が多くなる。それを必要最低限に削ぎ落とす仕組み。iPhone 6なら64-bitバイナリ、@2xリソースのみ、といった具合、おそらく。
iTunes Connect には完全版をアップロードする。ユーザーがアプリを App Store からダウンロードする際に必要なデータが自動で選別される模様。
On-Demand Resources (ODR)
リソースが必要になったときに追加ダウンロードするようにできる仕組み。よくゲームアプリで行われているようなああいったことが Apple 公式で提供される。)
リソースの種類
基本的にはあらゆるデータファイルに対応するが、Swift や Objective-C などで書かれた実行可能なファイルは禁止されている。
リソースの例として:
- データファイル
- 画像
- OpenGLシェーダー
- SpriteKitパーティクル、シーン、テクスチャアトラス
- WatchKitコンプリケーション
…とされている。
ODR を有効にする (Xcode)
ターゲットの Build Settings
ペインから Assets
カテゴリを表示。Enable On-Demand Resources
項目を Yes
にする。無効にする場合は No
にする。
タグを定義する (Xcode)
タグは ODR のセットを識別するために使用される。これの定義は Xcode で行う。ターゲットの Resource Tags ペインがその管理画面にあたる。
タグを追加する (Xcode)
ファイル、フォルダの場合:
ファイルインスペクタに On Demand Resource Tags
欄があるので、タグを記入する。
アセットカタログの場合:
アセットの属性インスペクタに On Demand Resource Tags
欄があるので、タグを記入する。
タグの種類
管理画面でタグの種類を設定できる。
-
Initial install
タグ - アプリと同時にダウンロードされるリソース
-
Prefetch
タグおよび順番 - アプリのインストール後に追加でダウンロードするリソース。ダウンロード順も管理画面で設定できる
-
Dowloaded only on demand
タグ - 要求されたら追加ダウンロードされるオンデマンドリソース
容量の上限
それぞれのタグにおいて、そのタグ内リソースの合計は2GBが上限。すべての ODR の合計は20GBが上限。ただし、無制限に20GB使えるというわけではなく、状況やタグの種類によってその上限が細かく規定されている。
また、パフォーマンス的な理由から、Apple はひとつのタグの容量は64MB以下が理想的としている。
項目 | 上限 | App Slicing |
---|---|---|
アプリバンドル | 2GB | ✓ |
Initial install タグ | 2GB | ✓ |
Initial install / Prefetch タグ | 4GB | ✓ |
一度の ODR で使用できるタグ | 2GB | ✓ |
App Storeで管理されるタグ | 20GB |
不明:Initial install
タグはアプリバンドルの上限とは別?
ODR を取得する
ODR をホストする
任意のサーバーを自前で用意して ODR をホストすることができる。もちろん ATS を考慮する必要がある。
Xcode では Asset Pack Manifest URL Prefix
のビルド設定項目にアセットパックの URL を記入しておく。
Bitcode
Apple がアプリのコンパイルを代行して自動最適化してくれる仕組み。アプリを中間表現である Bitcode を含めた形式で iTunes Connect に提出しておけば、将来的に CPU アーキテクチャが変わった際に Apple がよろしくやってくれるというもの、らしい。Bitcode を採用する場合には、そのアプリに含めるすべてのバイナリ(フレームワーク、ライブラリ)も同様に Bitcode を含める必要がある。
なお watchOS, tvOS では Bitcode が必須の模様。
Bitcode に関してはこちらの記事が詳しいです。