On-Demand Resources:とは何か、リクエストの仕組みとリソースの保存

著者: IT Sectr 公開日: 2026-04-17 読了時間: 9 分

On-Demand Resources は、アプリケーションコンテンツの遅延読み込みのためのAppleのテクノロジーです。すべてのリソースをインストールパッケージに含める代わりに、開発者はそれらをApp Storeサーバーにホストし、必要に応じてリクエストします。Apple ODR Guideによると、これにより初期インストールサイズが削減され、アプリのバージョンを更新することなく新しいコンテンツを追加できます。

重要なポイント

  • On-Demand Resources — アプリインストール後にオンデマンドでリソースを読み込む仕組み
  • リソース はAppleサーバーに保存され、NSBundleResourceRequestを介してリクエストされます
  • タグ はアプリの機能ブロックごとにリソースをグループ化します
  • プリフェッチ によりUX向上のため事前にリソースを読み込めます
  • ストレージクォータ は制限されており、開発者による監視が必要です

iOSのOn-Demand Resourcesとは

On-Demand Resources(ODR) は、iOS、tvOS、macOSに組み込まれたコンテンツ管理システムです。開発者はアプリのリソースを必須(インストールパッケージに含まれる)とオンデマンド(App Storeに保存され、必要に応じてダウンロード)に分割できます。

ODRの主要な概念

ODRシステムは3つの主要なエンティティで動作します:タグリソースパッケージリクエスト。タグはファイルのセットをグループ化する文字列識別子です。リソースパッケージはタグに関連付けられたデータセットです。リクエストはパッケージの読み込みを開始するNSBundleResourceRequestへのプログラム呼び出しです。

リソースリクエストのライフサイクル

リソースの読み込み はいくつかの段階を経ます:指定されたタグでのリクエストの初期化、ローカルストレージでの可用性の確認、存在しない場合はAppleサーバーからのダウンロード、準備完了時のアプリへの通知、使用後のリソースの解放。システムはキャッシュと未使用リソースの削除を自動的に管理します。

段階システムの動作実行時間
初期化タグ付きのNSBundleResourceRequestを作成即時
キャッシュ確認ローカルストレージでリソースを検索0.1~0.5秒
ダウンロードApple CDNからダウンロードサイズに依存
通知完了ハンドラまたはデリゲートを呼び出し即時
解放システムによる削除可能としてリソースをマークiOSの要求時

iOSでのODRの仕組み

ODRの仕組み は、App Storeのクラウドストレージからのリソースリクエストを管理するバックグラウンドサービスに基づいています。アプリがタグをリクエストすると、システムはリソースがローカルキャッシュに存在するか確認します。存在しない場合は、中断された接続の再開をサポートするバックグラウンドURLセッションを介してダウンロードを開始します。

NSBundleResourceRequestによるリクエスト管理

swift
import Foundation

class ResourceManager {
    let odrRequest = NSBundleResourceRequest(tags: ["level-3"])

    func loadLevel3() {
        odrRequest.conditionallyBeginAccessingResources { available in
            if available {
                self.startLevel3()
            } else {
                self.odrRequest.beginAccessingResources { error in
                    guard error == nil else { return }
                    self.startLevel3()
                }
            }
        }
    }

    func releaseResources() {
        odrRequest.endAccessingResources()
    }
}

conditionallyBeginAccessingResources メソッドは、即時の読み込みなしでキャッシュ内のリソースの可用性を確認します。可用性フラグが陽性の場合、アプリは遅延なく続行します。リソースがない場合、beginAccessingResourcesは progress プロパティを介して進行状況を示しながらダウンロードを開始します。

バックグラウンド読み込みと優先順位

iOS は現在のアプリアクティビティに基づいてODRリソースの読み込み優先順位を管理します。アプリがフォアグラウンドにある場合、読み込みは高い優先順位で実行されます。バックグラウンドでは、iOSはバッテリー残量が少ないときに読み込みを遅延または一時停止することがあります。

  • 高優先度 — 今すぐ必要なリソースの即時読み込み
  • 低優先度 — プリフェッチと事前キャッシュのための遅延読み込み
  • バックグラウンド — アクティブなWi-Fiと十分なバッテリーがある場合のみ読み込み

リソースタイプとODRタグ

ODRリソース には、画像、動画、音声ファイル、スプライト、レベルデータ、およびアプリの起動に重要でないその他のファイルを含めることができます。各リソースは、機能ブロックへの所属を決定する1つ以上のタグに結び付けられます。

Xcodeでのコンテンツタグ付け

Xcodeでは、Target Membershipタブの Resource Tags インスペクターを介してタグを設定します。開発者はプロジェクトの各ファイルについて、メインバンドルに含めるかタグで読み込むかを指定します。1つのファイルが複数のタグに属することができ、アプリの異なるセクション間でリソースを再利用できます。

xml
<!-- Info.plistでのResource Tags設定の例 -->
<key>NSBundleResourceRequestTags</key>
<dict>
    <key>level-3</key>
    <array>
        <string>levels/level3.scnassets</string>
        <string>textures/level3_tex.png</string>
    </array>
</dict>

ライフタイムによるタグカテゴリ

Appleは、リソースをデバイスに保持する期間に基づいて3つの ODRタグ カテゴリを区別しています。初期インストールタグはアプリとともに読み込まれ、システムによって削除されることはありません。プリフェッチタグ順序は、インストール直後のバックグラウンドプリロード順序を決定します。メインタグはオンデマンドでリクエストされ、ストレージが不足するとiOSによって削除される可能性があります。

カテゴリに加えて、各タグはダウンロード優先順位を持つことができます。高優先順位 のタグは、後でリクエストされた場合でも、低優先順位のタグよりも先に読み込まれます。これにより、開発者はコンテンツの表示順序を制御できます:最初にメイン画面の重要なリソース、次にアプリの詳細セクションの追加マテリアル。

  • 初期インストールタグ — 初回インストール時に読み込まれ、システムによって削除されない
  • プリフェッチタグ — UX向上のためインストール後にバックグラウンドでダウンロードされる
  • オンデマンドタグ — プログラムでリクエストされ、ストレージが不足するとiOSによって削除される可能性がある

XcodeでのOn-Demand Resourcesの設定

ODRの設定 はXcodeで3つの段階を含みます:タグによるリソースの分類、Info.plistでのダウンロードパラメータの設定、NSBundleResourceRequestを介したプログラムによるリクエストの実装。作業の大部分はビルド側で行われます。

Target Membershipでの分類

swift
// ODRステータスの確認と進行状況の監視
func monitorODRProgress(tag: String) {
    let request = NSBundleResourceRequest(tags: [tag])
    let observer = request.progress.observe(\.fractionCompleted) { progress, _ in
        DispatchQueue.main.async {
            let percent = Int(progress.fractionCompleted * 100)
            print("ODR: \(percent)% 読み込み完了")
        }
    }
}

ダウンロードの進行状況 は、KVO観測をサポートするNSProgressクラスのprogressプロパティを介して追跡されます。アプリはリソースのダウンロード中にユーザーに読み込みインジケーターを表示できます。ダウンロード完了後、リソースは標準のFileManagerおよびNSDataAssetメカニズムを介してメインアプリバンドルで利用可能になります。

クォータと制限パラメータ

ODRクォータ はiOSのバージョンによって異なります。iOS 13以降、デバイスはアカウントごとに最大20GBのオンデマンドリソースを保存できます。この容量はデバイスにインストールされているすべてのアプリ間で共有されます — 1つのアプリが多くの容量を占めると、他のアプリに残る容量が少なくなります。

使用済み容量の監視 はNSBundleResourceRequestを介して行われます。アプリは利用可能なODRストレージを確認し、それに応じて最初にどのリソースを読み込むかを決定できます。フォールバックメカニズムを実装することをお勧めします:ODRストレージがいっぱいの場合は、メインバンドルから品質を落としたリソースを使用します。

クォータを超えると、システムは最も最近使用されていない順にオンデマンドタグのリソースを削除し、最も古いものから始めます。アプリコードのリソースマネージャーは、NSBundleResourceRequestプロパティを介して現在のODRストレージ使用量を追跡できます。

開発者は、iOS がいつでもオンデマンドリソースを削除することを決定する可能性があることを考慮する必要があります — アプリは以前に読み込まれたリソースが突然利用できなくなる状況を正しく処理する必要があります。リソースアクセスエラーをインターセプトし、beginAccessingResourcesを介して再リクエストすることをお勧めします。アプリが機能するために不可欠な重要なリソースには、システムによって削除されない初期インストールタグを使用してください。

ODRの利点と制限

On-Demand Resources は開発者にアプリサイズ管理の柔軟なツールを提供しますが、ネットワークの可用性やiOSのストレージポリシーに関連するいくつかの制限があります。

ODRを使用する利点

ODR の主な利点は、初期インストールサイズの大幅な削減です。複数のレベルを持つゲーム、動画コンテンツを含むアプリ、または大規模な画像セットは、コンテンツを分割して読み込むことができます。ユーザーはすぐに基本機能にアクセスでき、追加のリソースはバックグラウンドでダウンロードされます。

技術的な制限

ODR は最初のアクセス時にリソースを読み込むために常時インターネット接続が必要です。カバレッジが悪い地域のユーザーは遅延やダウンロードエラーが発生する可能性があります。さらに、Appleはダウンロードしたリソースがデバイスに残ることを保証しません — ストレージが不足すると、iOSは警告なしにオンデマンドタグを削除することがあります。

  • ネットワークの必要性 — 最初のリソースリクエストにはインターネット接続が必要
  • 自動削除 — デバイスのストレージが不足するとiOSがキャッシュをクリアする可能性がある
  • デバッグの複雑さ — 読み込みの問題を再現するにはさまざまなネットワーク条件のシミュレーションが必要
  • タグサイズ — Appleは最適なパフォーマンスのためにタグあたり512 MBを超えないことを推奨
  • エラー処理 — アプリは読み込みの失敗を正しく処理し、リクエストを再試行する必要がある

よくある質問

アプリを更新せずに動的にコンテンツを追加するためにODRを使用できますか?

ODR を使用すると、App Storeで新しいバージョンを公開せずにリソースを追加および変更できます。Xcodeを介してAppleサーバー上のファイルを更新し、同じタグに割り当てるだけです。次のリクエスト時に、アプリはリソースの最新バージョンを受け取ります。これは季節限定コンテンツ、一時的なプロモーション、新しい画像やレイアウトのA/Bテストに便利です。

ストレージが不足している場合、iOSはODRリソースの削除をどのように管理しますか?

システム は、他のアプリの領域を解放する必要がある場合、オンデマンドタグのリソースを削除します。初期インストールタグのリソースは削除されません。削除順序は LRU(Least Recently Used) アルゴリズムによって決定されます — 最も長い間アクセスされていないリソースから最初に削除されます。

1つのアプリの最大ODRリソースサイズは?

iOS 13 以降、ODRストレージの合計制限はApple IDユーザーあたり20 GBです。最適なダウンロードパフォーマンスのために、単一のタグサイズは 512 MB を超えないようにする必要があります。制限を超えると、リクエストはNSBundleResourceRequestLowDiskSpaceErrorで失敗します。

ODRは最初のダウンロード後、オフラインモードで動作しますか?

はい、ダウンロード後、リソースはローカルキャッシュに保存され、インターネット接続なしで オフラインモード で利用可能です。問題が発生するのは、iOSがストレージ不足のためにリソースを削除し、ユーザーがネットワークなしでアクセスしようとした場合のみです。

ODRはURLSessionによる単純なファイルダウンロードとどう違うのですか?

ODR はApp Storeインフラストラクチャと統合されています:リソースはAppleのCDNでホストされ、キャッシュシステムによって管理され、開発者が独自のサーバーをセットアップする必要はありません。URLSession にはサーバーインフラストラクチャ、バージョン管理、手動キャッシュ管理が必要です。ODRはまた、接続が中断された場合のダウンロード再開を自動的に処理します。

まとめ

  • On-Demand Resources — iOSおよびtvOSアプリでの遅延コンテンツ読み込みのテクノロジー
  • システム はリソースをグループ化するタグとNSBundleResourceRequestを介したリクエストに基づく
  • すべてのファイルタイプがサポート:画像、動画、音声、スプライト、レベルデータ
  • タグカテゴリ — 初期インストール、プリフェッチ、オンデマンド(異なる保存ポリシー)
  • ストレージ制限 — Apple IDあたり20 GB、タグあたり最大512 MB
  • インストールサイズ はリソースをメインバンドルからAppleサーバーに移動することで削減
  • 推奨 — ゲーム、メディアコンテンツアプリ、マルチレベル構造のプロジェクトにODRを使用

ターンキー方式のモバイルアプリケーションを開発します

IT Sectrは2017年からスタートアップや企業向けにiOS・Androidアプリケーションを開発しています。私たちがご相談に乗り、最適なソリューションをご提案します。

プロジェクトについて相談

こちらもお読みください