hmhv

iOS9のApp Thinning簡単まとめ

2015-09-15

App Thinningとは

App Storeからダウンロードするアプリのサイズを小さくすること。

App Thinningの利点

速くダウンロードできて、端末の容量も節約できる。
また端末に最適化されたアプリをダウンロードすることで性能向上も期待できる。

App Thinningの方法

  • slicing

端末に必要なリソースのみダウンロードさせる。

  • bitcode

端末に最適化されたアプリをダウンロードさせる。

  • on-demand resources

端末で必要な時にリソースをダウンロードさせる。

slicing詳細

例えば、image.png, image@2x.png, image@3x.pngの三つのイメージファイルがアプリに含まれている場合、
今までは全端末に三つのファイルすべてがダウンロードされていたが、slicingによって
iPhone4以前の非Retina端末にはimage.pngのみ、
iPhone6+端末にはimage@3x.pngのみ、
それ以外のRetina端末にはimage@2x.pngのみがダウンロードされるようになる。

アプリ開発者はイメージファイルの管理をアセットで行うだけでそれ以外の面倒はApp Store側がすべて行う。

bitcode詳細

例えるならJIT(Just-In-Time Compiler、JITコンパイラ)に似ってるかな、、
今までは開発者がApp Storeに完全な実行ファイルをアップしていたが、bitcodeという中間ファイルをアップすることで
各端末(例えば、32bit, 64bit, Apple Watchなど)に最適化されたアプリをApp Store側で作ってくれる。

現在(Xcode7GMseed)のiOSアプリでbitcodeはデフォルトでONだが必須ではない。(watchOSアプリは必須)
以下のような二つの方法でOFFにできるようだ。

- プロジェクト設定にて

folder

- App Storeへアップロード時

folder

on-demand resources詳細

例えばゲームのステージ別のリソースや写真アプリのフィルタ用リソース、チャットアプリのスタンプ用リソースなどをアプリのダウンロード時ではなく必要になった時点でApp Storeからダウンロードすることできる。

on-demand resourcesの使い方
  1. プロジェクト設定画面でon-demand resourcesをONに

folder

  1. リソース管理用のタグを作成

folder

  1. 作成したタグにリソースファイルの関連付け
    folder
    folder
  2. 必要になったらNSBundleResourceRequestクラスでダウンロード
- (void)downloadOnDemendResource
{
    __weak typeof(self) wself = self;

        // ダウンロードするリソースのタグを指定
    NSSet *tags = [NSSet setWithObject:@"Tag1"];
    self.resourceRequest = [[NSBundleResourceRequest alloc] initWithTags:tags];
    
    //ダウンロード済みか確認
    [self.resourceRequest conditionallyBeginAccessingResourcesWithCompletionHandler: ^(BOOL resourcesAvailable) {
        if (resourcesAvailable) {
            //ダウンロード済みなら利用する
            //UIImage *image = [UIImage imageNamed:@"downloaded.png"];
            //[wself useResource];
        }
        else {
            //未ダウンロードなら優先順を設定してダウンロード開始する
            wself.resourceRequest.loadingPriority = NSBundleResourceRequestLoadingPriorityUrgent;
            [wself.resourceRequest beginAccessingResourcesWithCompletionHandler:^(NSError * error) {
                if (error) {
                    //エラー処理
                    return;
                }
                //ダウンロード完了なら利用する
                //UIImage *image = [UIImage imageNamed:@"downloaded.png"];
                //[wself useResource];
            }];
        }
    }];
}

参考:On-Demand Resources Essentials
参考:App Thinning (iOS, watchOS)