◉RORK LABEN
●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り27日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…●GPT-6.1 SOL — Rork のモデルメニューに追加(09-29)。Low/Medium/High を選べ、Pro・Max に含まれます●SONNET 5.5 — UI づくりが得意で、Sonnet 5 より出力が速いモデルが選べます(09-28)●SONNET 4.5 — Claude API での提供終了は 11/30、残り27日。API 連携を足したアプリは移行先の確認を●SDK 58 — React Native 0.88 に更新されました。Android のリリース版で R8 が既定オンになり、iOS は SceneDelegate を生成します●OBSERVE — EAS Observe がネイティブクラッシュも記録します(SDK 57.0.21 以降・10/07)●NEW — 起動広告が、背面から戻った回にしか出ていませんでした。「前面に戻った」合図が、…
記事一覧/アプリ開発
◇ アプリ開発/2026-06-13上級

壁紙パックをアプリ審査なしで配る — リモートアセットのバージョニングと差分配信を6本で運用する設計

新しい壁紙を追加するたびにアプリを再申請していると、運用が止まります。マニフェスト方式のバージョニングと差分ダウンロード、キャッシュ無効化とロールバックを、6本並行運用の実装と転送量の実測値とともに整理しました。

アセット配信3壁紙アプリ29バージョニングExpo234運用設計8

✦ プレミアム記事

季節の壁紙を10枚追加するだけのために、アプリのビルドを上げ、スクリーンショットを差し替え、App Store の審査に2日待つ。リリース直後はこれで回っていました。けれど個人開発で壁紙系を6本並行で運用するようになると、この手順が完全にボトルネックになりました。1本の審査待ちのあいだに別の3本でも追加したい画像が積み上がり、結局「今週はまとめて来週」と先送りする悪循環に入っていたのです。

コンテンツの追加は、本来アプリのコードとは無関係です。画像が増えても挙動は変わりません。それならアプリ審査の外に出してしまおう、と決めて作り直したのが、ここで紹介するリモートアセットパックの仕組みです。動かしているコードと、切り替え前後で測った転送量を添えて共有します。

なぜ「バンドル同梱」をやめたのか

最初の設計では画像をアプリにバンドルしていました。オフラインでも確実に表示でき、初回起動が速いという利点があります。一方で、画像を1枚増やすたびにアプリ全体を再申請する必要があり、IPA も膨らみ続けます。半年で 90MB を超えたあたりで限界を感じました。

判断の軸は2つだけに絞りました。ひとつは更新頻度です。週に何度も差し替えるコンテンツはリモート、リリース時に固定されるUI素材は同梱。もうひとつは初回体験です。起動直後に必ず見える数枚(デフォルトの表紙やオンボーディング画像)は同梱し、それ以外はリモートから取りに行く。この線引きで、同梱アセットを20枚程度に固定できました。

マニフェスト方式 — 何を配って何を消すか

リモート配信の中心になるのは、画像そのものではなくマニフェストです。アプリは起動時にまずマニフェストを取りに行き、そこに書かれた指示にしたがって画像を取得します。スキーマはこうしています。

{
  "packVersion": 142,
  "minAppVersion": "3.2.0",
  "generatedAt": "2026-06-13T02:00:00Z",
  "categories": [
    {
      "id": "seasonal-rainy",
      "title": { "ja": "雨の季節", "en": "Rainy Season" },
      "items": [
        {
          "id": "rainy-0142",
          "hash": "b7f3c1a9",
          "w": 1290, "h": 2796,
          "url": "https://cdn.example.com/packs/rainy-0142.heic",
          "thumb": "https://cdn.example.com/thumbs/rainy-0142.webp",
          "addedIn": 142
        }
      ]
    }
  ]
}

ポイントは hash と addedIn です。hash は画像の内容から生成した短い指紋で、これが変わったときだけ再ダウンロードします。addedIn はその画像が初めて登場したパックバージョンで、差分計算に使います。minAppVersion は、新しいフォーマットの画像(たとえば後から導入した動く壁紙)を古いアプリに配らないための安全弁です。

マニフェスト自体は CDN のエッジに置き、Cache-Control: max-age=300 で5分だけキャッシュします。短くしているのは、緊急で1枚消したいときに最大5分で全端末へ伝播させたいからです。画像本体は内容が変わらない前提なので max-age=31536000, immutable で1年キャッシュします。

✦

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
✦コンテンツパックをアプリ審査から切り離し、配信を即時化するマニフェスト設計の具体的なスキーマ
✦全件再取得を避ける差分ダウンロードで、更新1回あたりの転送量を平均 88% 削減した実装
✦壊れたパックを30秒で巻き戻すバージョンピン留めとロールバック手順(6本横断)
Stripe による安全な決済 · いつでもキャンセル可能
✦

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • ✦コピー&ペーストで使える実装コード付き
  • ✦毎日新しい上級ガイドを追加
  • ✦¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

◇ アプリ開発2026-08-24
サムネイルの移設は、配信中の版が旧パスを要求し続ける前提で組みました
サーバー側で画像の置き場所を変えても、ストアで配信中の版はビルド時のパス組み立てを持ち続けます。旧新どちらのパスでも 200 を返す双方向フォールバック、画像とカタログの更新順序、CDN を挟んだまま実応答を確かめる手順を、壁紙アプリの運用で使っている形のまま共有します。
◇ アプリ開発2026-10-31
EAS Build が「Project archive is too big」で止まったら、上がるファイルを大きい順に数えます
EAS Build のアップロードは 150 MiB で警告、2 GiB で失敗します。送る前に同梱ファイルを大きい順に並べる手順と、原因の見つけ方、.easignore に書く内容の決め方をまとめました。
◇ アプリ開発2026-10-29
アップロード前に一度だけ取りにいかれた画像が、エッジで 404 のまま残りました。保持の規則をステータス別に分け、アップロードと消去を一組にしました
新しい壁紙が、一部の地域でだけ 404 のまま表示されない。原因は、アップロード前に一度だけ取りにいかれた 404 を、CDN が画像と同じ長さで保持していたことでした。ステータス別の保持、診断の二本立て、アップロードと消去の一組を、手元で動かして確かめた記録です。