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にできるようだ。
- プロジェクト設定にて
- App Storeへアップロード時
on-demand resources詳細
例えばゲームのステージ別のリソースや写真アプリのフィルタ用リソース、チャットアプリのスタンプ用リソースなどをアプリのダウンロード時ではなく必要になった時点でApp Storeからダウンロードすることできる。
on-demand resourcesの使い方
- プロジェクト設定画面でon-demand resourcesをONに
- リソース管理用のタグを作成
- (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)
 





