RORK LABEN
MAX — Rork MaxはReact NativeではなくネイティブSwiftアプリを生成。iPhone・iPad・Watch・TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR・Metalの3Dゲーム・Dynamic Island・Live Activities・HealthKit・Core MLなどネイティブ機能を解放しますCORE — 通常のRorkはReact Native(Expo)でiOS/Androidアプリを生成。自然言語からストア公開まで到達できますFUNDING — Rorkはa16zから$2.8Mを調達しましたGROWTH — 月間743,000訪問・成長率85%と勢いを増していますPRICING — 無料で始められ、有料プランは$25/月〜ですMAX — Rork MaxはReact NativeではなくネイティブSwiftアプリを生成。iPhone・iPad・Watch・TV・Vision Pro・iMessageに対応しますNATIVE — AR/LiDAR・Metalの3Dゲーム・Dynamic Island・Live Activities・HealthKit・Core MLなどネイティブ機能を解放しますCORE — 通常のRorkはReact Native(Expo)でiOS/Androidアプリを生成。自然言語からストア公開まで到達できますFUNDING — Rorkはa16zから$2.8Mを調達しましたGROWTH — 月間743,000訪問・成長率85%と勢いを増していますPRICING — 無料で始められ、有料プランは$25/月〜です
記事一覧/開発ツール
開発ツール/2026-06-22上級

無印 Rork と Rork Max を1つのバックエンドで支える — 旧バイナリを壊さない API レスポンス契約の設計

無印 Rork(React Native / Expo)と Rork Max(ネイティブ Swift)が同じ Cloudflare Workers バックエンドを叩く構成では、強制アップデートできない旧バイナリを壊さないことが設計の中心になります。レスポンスを封筒型にして加算のみで育て、能力フラグでクライアント差を吸収し、古いバージョンを安全に畳むまでを実装で示します。

Rork436Rork Max180Cloudflare Workers20APIバージョニングアーキテクチャ13

プレミアム記事

ある朝、レスポンスの一フィールドの名前を title から displayTitle に「整理」してデプロイしました。手元の最新ビルドでは何も問題が起きません。ところが数時間後、まだ前のバージョンを使い続けている端末から、一覧画面が空っぽになったという報告が届きはじめました。原因は単純で、古いアプリは title を読みに行き、そこに値がなくなっていたからです。

モバイルアプリのバックエンドが Web と決定的に違うのは、クライアントを強制的に入れ替えられないという一点です。Web なら次のリロードで全員が新しい JS を受け取りますが、アプリは審査と各ユーザーの更新操作を挟みます。更新しない人は、半年前のバイナリのまま、今日もあなたのバックエンドを叩き続けます。

この非対称性は、無印 Rork(React Native / Expo でクロスプラットフォーム生成)と Rork Max(ネイティブ Swift 生成)を併用しはじめると、さらに重くのしかかります。同じ機能でも、片方は JavaScript の fetch で、もう片方は Swift の URLSession でレスポンスを受け取ります。私自身、個人開発で複数の Expo アプリを1つの Cloudflare Workers バックエンドで束ねて運用していて、ここに将来 Max 由来のネイティブクライアントが加わる前提で契約を見直しているところです。本稿は、その「壊さずに育てる」ための実装を共有します。

なぜ「契約」を先に決めるのか

API のレスポンス形は、口約束ではなく契約です。一度どこかのバイナリに焼き込まれたら、そのバイナリが世の中から消えるまで、あなたはその約束に縛られます。だからこそ、最初に決めるべきは個々のフィールドではなく、「どう変えてよいか」というルールのほうです。

私が採っているルールは2つだけです。第一に、レスポンスは必ず封筒(envelope)でくるみ、データ本体とメタ情報を分けること。第二に、フィールドの変更は加算のみ(additive-only)に限り、削除・改名・意味の変更はしないこと。この2つを守るだけで、旧バイナリが落ちる事故の大半は消えます。

レスポンス封筒の最小形

封筒は、すべてのエンドポイントが共有する外側の構造です。データそのものは data に入れ、その外側にプロトコルの版や、サーバーが付けたい運用メタを置きます。Cloudflare Workers 側では、次のような薄いヘルパーで包みます。

// envelope.ts — すべてのレスポンスはこの形で返す
type Envelope<T> = {
  protocol: number;      // 封筒そのものの版(滅多に上げない)
  data: T;               // 本体。中身は加算のみで育てる
  meta: {
    serverTime: string;  // ISO8601
    minSupported: number; // この値未満のクライアントは更新を促す対象
    notice?: string;     // 任意の告知(メンテ予告など)
  };
};
 
export function ok<T>(data: T, minSupported = 1): Response {
  const body: Envelope<T> = {
    protocol: 1,
    data,
    meta: { serverTime: new Date().toISOString(), minSupported },
  };
  return Response.json(body);
}
 
export function fail(code: string, message: string, status = 400): Response {
  // エラーも封筒で返す。クライアントは data の有無ではなく error で分岐する
  return Response.json(
    { protocol: 1, error: { code, message },
      meta: { serverTime: new Date().toISOString(), minSupported: 1 } },
    { status },
  );
}

ポイントは、成功もエラーも同じ封筒で返すことです。クライアントは「data があるか」ではなく「error があるか」で分岐します。こうしておくと、後からエラーに retryAfter のような項目を足しても、既存のクライアントは知らんぷりして無視してくれます。無視してくれる、というのが封筒設計の肝です。

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

この記事の続きを読む

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

この記事で得られること
1つのバックエンドが React Native クライアントとネイティブ Swift クライアントの両方を、互いに壊さず支えるためのレスポンス封筒(envelope)の最小実装
新フィールドを足しても旧バイナリが落ちない『加算のみ(additive-only)』の進化規律と、やってはいけない破壊的変更の判断表
クライアントのバージョン分布をログから読み、どの閾値で古い契約を畳む(sunset)かを決める運用手順
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

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

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

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

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

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

関連記事

開発ツール2026-06-15
Rork Max の Swift 生成と Expo 版の責務分界 — どこまでをノーコードに任せ、どこから手で書くか
Rork Max が Swift ネイティブ生成に対応し、通常の Rork は引き続き Expo(React Native)を生成します。2つの生成エンジンを1つのアプリ事業の中でどう使い分けるか、責務の線引きを実アプリの運用視点で設計します。
開発ツール2026-05-26
App Store Connect・RevenueCat・AdMob の朝の指標を Cloudflare Workers で1本化する — 6アプリ運用の日次集約アーキテクチャ
Rork で複数アプリを運用する個人開発者向けに、App Store Connect API・RevenueCat REST・AdMob Reporting API を Cloudflare Workers Cron で集約し、毎朝1通の日次レポートに統合する実装手順をまとめました。
開発ツール2026-05-24
AI 機能のコスト上限を実行時に強制する設計 — Rork アプリの予算ガード・アーキテクチャ
AI 機能のコストが想定外に跳ねる事故を、最適化ではなく実行時の強制で防ぐ設計を、廣川政樹がアーティスト兼個人開発者の運用視点から、Cloudflare Durable Objects と React Native のコードレベルで解説します。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →