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クラスでダウンロード
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
- (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)

Share

Comments