iOS Developer Library

デベロッパ

オンデマンドリソースガイド

このページの内容

オンデマンドリソースに関する要点

アプリケーションコンテンツは、普通にダウンロードしたアプリケーションバンドルに収容されていることもありますが、オンデマンドリソースはこれとは違い、App Storeが別途、要求に応じて供給します。アプリケーションバンドルを小容量に抑え、高速にダウンロードできるようにするとともに、豊富な内容を提供できるという利点があります。アプリケーションがオンデマンドリソース群を要求すると、オペレーティングシステムが代わりにダウンロードし、保存します。アプリケーションはこのリソースを使った後、要求を解放します。いったんダウンロードしたリソースはデバイス上に残っていることがあり、その場合、初回の起動時よりも高速にアクセスできます。

バンドルに収容可能なあらゆる型のデータ(実行コードを除く)を、リソースとして扱うことができます。表 1-1 に、オンデマンドリソースとして扱えるデータの型と、ファイルまたはアセットカタログの形でターゲットに収容できるか、を示します。

表 1-1 オンデマンドリソースの型

アセットカタログ

ファイル

データファイル

画像

OpenGLシェイダ

SpriteKitのパーティクル

SpriteKitのシーン

SpriteKitのテクスチャアトラス

Apple TVの画像スタック

データファイルには、実行コード(Swift、Objective-C、C、C++で作成)を除く、あらゆる種類のデータを収容できます。スクリプト言語で生成したファイルも、オンデマンドリソースにすることができます。

オンデマンドリソースの利点

アプリケーション側から見ると、オンデマンドリソースには次のような利点があります。

  • アプリケーション本体の容量削減。アプリケーションバンドル(ユーザがダウンロードするもの)が小容量になるため、ダウンロード時間を短縮し、デバイスの空き容量を増やすことができます。

  • アプリケーションリソースの遅延読み込み。特定の状況でしか使わないリソースは、実際にその状況になりそうになってから要求しても構いません。たとえばレベル制のゲームの場合、現在および次のレベルで使うリソースがあれば充分です。

  • 稀にしか使わないリソースの遠隔ストレージ。頻繁には使わないリソースの場合、必要が生じてから要求すれば充分です。たとえばチュートリアルは、使い始めの頃に読むだけで、それ以降は滅多に開きません。そこで、初回の起動時にチュートリアルを要求し、以後は、特に必要が生じたり、新機能が追加されたりしたときにのみ要求します。

  • In-App Purchaseのリソースの遠隔ストレージ。In-App Purchaseにより購入するモジュールには、追加のリソースが収容されています。このリソースは、起動後にアプリケーションが要求することになります。たとえば、キーボードアプリケーションで用いる、SuperGeekyというエモティコンパックを購入したとしましょう。するとアプリケーションは、起動処理の後、このパックを要求するようになります。

タグの働き

オンデマンドリソースを識別するため、開発時にタグをいくつか割り当てます。タグの実体は、開発者が決めた識別文字列です。タグ名により、当該リソースをアプリケーションがどのように使うか識別できます。たとえばゲームの場合、レベル5で用いる各リソースに、「level-5」というタグを与えることが考えられます。タグについて詳しくは、「タグの作成と割り当て」を参照してください。

アプリケーションは実行時に、タグを指定して遠隔リソースにアクセスするよう要求します。するとオペレーティングシステムは、当該タグがついたリソースをダウンロードし、アプリケーションがこれを使い終わるまで、ストレージ内に保持します。空き容量が足りなくなると、もう保持していないタグに対応するリソースを、ローカルストレージから破棄します。しかしそれまではデバイス上に残っていることもあります。タグに関連づけられたリソースへのアクセス要求について詳しくは、「オンデマンドリソースのアクセスとダウンロード」を参照してください。

再びゲームの例を考えてみましょう。多くのレベルに分かれており、現在および次のレベルに対応するリソースしか必要ない、という状況はよくあります。図 1-1 に、全レベルのリソースをアプリケーションバンドルに収容する方式を示します。

図 1-1 リソースをすべて保持している従来型のアプリケーション 画像: ../Art/adventure_no_odr_2x.png

レベルごとに分類し、タグを割り当てたオンデマンドリソースを使うことにすれば、アプリケーションバンドルの容量を削減できます。他の共有リソースも同様に扱えば、アプリケーション本体に収容する必要はありません。図 1-2 に、リソースにタグを割り当て、App Storeから配布するようにして、アプリケーションの容量を削減した様子を示します。

図 1-2 オンデマンドリソースを使って容量を削減したアプリケーション 画像: ../Art/adventure_odr_2x.png

このほかの機能として、App Storeからインストールする際に読み込むべきタグを指定する、リソース要求の優先度を設定する、ダウンロードの進捗状況を追跡する、使い終わったダウンロード済みタグに保存優先度を設定する、などがあります。

オンデマンドリソースのライフサイクル

アプリケーションの初回起動時、デバイス上にあるオンデマンドリソースは、プリフェッチの対象として設定したものだけです。この設定方法については「タグをプリフェッチする」を参照してください。アプリケーションはユーザの操作に応じて、必要なリソース群を表すタグを要求し、実際にこのリソースを使った後、使い終わった旨をオペレーティングシステムに通知します。その後、適当な時期に、オペレーティングシステムはタグを破棄します。

オンデマンドリソースを用いるアプリケーションの開発を進めていくと、あるタグを要求したとき、別のタグを関連づけたリソースもダウンロードされることがある、という現象に気がつくかも知れません。これは、オペレーティングシステムが、共有リソースのダウンロード用に最適化した「アセットパック」を単位として処理するからです。ひとつのタグを要求しただけで、複数のアセットパックがダウンロードされることもあります。アセットパックの生成は、アプリケーションのビルド時にXcodeがおこないます。たとえば、同じリソースに、ゲームのLevel1タグとLevel2タグの2つを割り当てているとしましょう。するとXcodeは、3つのアセットパックを生成します。

  • レベル1Level1タグのみのリソース群。

  • レベル2Level2タグのみのリソース群。

  • Level 1 + Level 2Level1Level2の両方のタグがついたリソース群。

タグ(および対応するリソース群)を要求するライフサイクル全体を、図 1-3 に示します。

図 1-3 オンデマンドリソースのライフサイクル 画像: ../Art/ODR_flow_2x.png
  1. アプリケーションはオペレーティングシステムに対してタグを要求します。

    オペレーティングシステムはこのタグを、対応するリソースを収容するアセットパックの集合に読み替えます。

    図 1-4 に、アプリケーションがLevel1タグとForestタグ(を割り当てたリソース)を要求している様子を示します。

    図 1-4 Level1タグとForestタグを要求している様子 画像: ../Art/step2_2x.png
  2. このタグに対応するアセットパックはローカルストレージ内にあるので、フェーズ6に進みます。

  3. 初回起動時や、前回取得したリソースが破棄されてしまっている(フェーズ9を参照)場合、タグに対応するアセットパック(App Storeがホスティングしているもの)を取得します。

    図 1-5 に、オンデマンドリソースがすべてApp Store側にある、という状況を示します。

    図 1-5 オンデマンドリソースがすべてApp Storeにある様子 画像: ../Art/step1_2x.png
  4. オペレーティングシステムは、アセットパックに対応するリソースのうち、ローカルストレージにないものをダウンロードします。

  5. 要求したタグに対応するアセットパックのリソースをダウンロードし終えました。

    図 1-6 に、Level1タグおよびForestタグに対応するリソースを、デバイスにダウンロードしている様子を示します。

    図 1-6 Level1およびForestのリソースをダウンロードしている様子 画像: ../Art/step3_2x.png
  6. 要求したタグに対応するアセットパックのリソースを正常にダウンロードし終え、あるいはすでにデバイス側のストレージにあった場合、オペレーティングシステムは当該アセットパックの保持数(カウンタ値)を増やし、タグの要求を満たした旨、アプリケーションに通知します。

    図 1-7 に、Level1およびForestに対応するリソースが揃った旨を、アプリケーションに通知している様子を示します。

    図 1-7 Level1およびForestのリソースが揃った様子 画像: ../Art/step4_2x.png

    タグの要求が満たされると、アプリケーションは実際に、対応するリソースを使って必要な処理をします。オンデマンドリソースへのアクセス方法は、アプリケーションにバンドルされているリソースの場合と同じです。ダウンロードしたリソースを、アプリケーションの仮想メンバーとして扱う様子を図に示します。

    図 1-8 ダウンロードしたリソースにアクセスしている様子 画像: ../Art/step5_2x.png
  7. アプリケーションはオペレーティングシステムに、タグを使い終わった旨通知します。

  8. オペレーティングシステムは、ローカルストレージ内のタグを解放します。実際には、タグに対応するアセットパックの保持数(カウンタ値)を減らします。

    以降、同じタグの要求があれば、フェーズ1に進みます。

  9. オペレーティングシステムは、アセットパックに対応するキャッシュ済みリソースを、ローカルストレージから破棄します。

    実際に破棄するアセットパックは、どのタグにも保持されていない(保持数が0である)ものです。リソースが破棄されず、次回起動時までそのまま残っていることもあります。

    再びタグを要求すると、フェーズ1に戻ります。破棄する順序は、タグの保持優先度を設定することにより変更可能です。詳しくは「オンデマンドリソースのアクセスとダウンロード」を参照してください。