App Thinning メモ

# App Thinning

　WWDC15 で発表された、アプリを自動で最適化して配信してくれる新しい仕組み App Thinning についてのメモ。以下3種類に分けられる。

- App Slicing
- On-Demand Resources (ODR)
- Bitcode

　iOS 9の特徴のひとつとしてその容量がiOS 8と比べてかなり少ないということがあるが、サードパーティアプリもそれに追随する必要がありそう。そのための仕組みが App Thinning かと。ストレージの消費は必要最小限に。

* [App Thinning (iOS, tvOS, watchOS)](https://developer.apple.com/library/ios/documentation/IDEs/Conceptual/AppDistributionGuide/AppThinning/AppThinning.html)
* [What's New in iOS](https://developer.apple.com/library/ios/releasenotes/General/WhatsNewIniOS/Articles/iOS9.html)
* [WWDC15 Video: Platforms State of the Union (3:20~)](https://developer.apple.com/videos/wwdc/2015/?id=102)

## App Slicing

　デバイスや解像度の増加でアプリのリソースやバイナリも増加する傾向にある。でも実際に使用するものは限られるので結果的には無駄が多くなる。それを必要最低限に削ぎ落とす仕組み。iPhone 6なら64-bitバイナリ、@2xリソースのみ、といった具合、おそらく。
　iTunes Connect には完全版をアップロードする。ユーザーがアプリを App Store からダウンロードする際に必要なデータが自動で選別される模様。


## On-Demand Resources (ODR)

　リソースが必要になったときに追加ダウンロードするようにできる仕組み。よくゲームアプリで行われているようなああいったことが Apple 公式で提供される。）

- [On-Demand Resources Guide](https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/index.html)
- [NSBundleResourceRequest](https://developer.apple.com/library/ios/documentation/Foundation/Reference/NSBundleResourceRequest_Class/index.html)

### リソースの種類

　基本的にはあらゆるデータファイルに対応するが、Swift や Objective-C などで書かれた実行可能なファイルは禁止されている。
　リソースの例として：

- データファイル
- 画像
- OpenGLシェーダー
- SpriteKitパーティクル、シーン、テクスチャアトラス
- WatchKitコンプリケーション

…とされている。

### ODR を有効にする (Xcode)

　ターゲットの `Build Settings` ペインから `Assets` カテゴリを表示。`Enable On-Demand Resources` 項目を `Yes` にする。無効にする場合は `No` にする。
![odr1.png](https://qiita-image-store.s3.amazonaws.com/0/3603/8daf7cd3-5233-a03c-a378-3b3f73b6fc9f.png)


### タグを定義する (Xcode)

　タグは ODR のセットを識別するために使用される。これの定義は Xcode で行う。ターゲットの Resource Tags ペインがその管理画面にあたる。
![odr2.png](https://qiita-image-store.s3.amazonaws.com/0/3603/94d56d39-5dba-d9b4-f22b-9d2865c22cf9.png)


### タグを追加する (Xcode)

　ファイル、フォルダの場合：
ファイルインスペクタに `On Demand Resource Tags` 欄があるので、タグを記入する。
![odr3.png](https://qiita-image-store.s3.amazonaws.com/0/3603/3503a73c-b4ae-9cbb-d7cb-173194257fd4.png)

　アセットカタログの場合：
アセットの属性インスペクタに `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 を取得する

https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/Managing.html

### ODR をホストする

https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/IntrotoHostingODR.html

任意のサーバーを自前で用意して ODR をホストすることができる。もちろん ATS を考慮する必要がある。

[アセットパックの出力方法](https://developer.apple.com/library/ios/documentation/FileManagement/Conceptual/On_Demand_Resources_Guide/GeneratingHostedContent.html)

Xcode では `Asset Pack Manifest URL Prefix` のビルド設定項目にアセットパックの URL を記入しておく。

## Bitcode

　Apple がアプリのコンパイルを代行して自動最適化してくれる仕組み。アプリを中間表現である Bitcode を含めた形式で iTunes Connect に提出しておけば、将来的に CPU アーキテクチャが変わった際に Apple がよろしくやってくれるというもの、らしい。Bitcode を採用する場合には、そのアプリに含めるすべてのバイナリ（フレームワーク、ライブラリ）も同様に Bitcode を含める必要がある。
　なお watchOS, tvOS では Bitcode が必須の模様。

　Bitcode に関しては[こちらの記事](http://qiita.com/items/f37dbb05de9d3832ce6b)が詳しいです。