※冒頭は実体験を題材にしたAIイメージです。
JSの更新は配れた。でも古いバイナリに必要なネイティブ機能がない。このずれを避けるために、runtimeVersionによる配信管理と、任意機能のフォールバックを分けて考えます。
この記事では、画像キャッシュを例に、起動時import・機能の可用性・実機テストの境界を整理します。
JSを更新できても、ネイティブ部分は同時には増えない
Expoのアプリを運用するとき、JavaScriptの更新と、ネイティブコードを含む新しいビルドの配布を区別する必要があります。互換性のない更新を古いバイナリへ配らないための中心は、runtimeVersionなど、配信側の互換性管理です。
私の画像保存処理では、ファイル保存機能が使えない環境で、その機能だけを静かに止め、可能な表示経路を残す考え方を取り入れています。ただし、こうした防御は、互換性管理そのものを省略してよい理由にはなりません。
必須機能と、任意機能を分ける
以下は実際のネイティブモジュールをロードするコードではなく、可用性をアプリの判断へ渡すための型の例です。
type Capability<T> =
| { available: true; value: T }
| { available: false; reason: string };
type ImageCache = {
lookup(key: string): Promise<string | null>;
};
export async function resolveImage(
key: string,
remoteUrl: string,
cache: Capability<ImageCache>,
): Promise<string> {
if (!cache.available) return remoteUrl;
try {
return (await cache.value.lookup(key)) ?? remoteUrl;
} catch {
// 任意のキャッシュ機能だけが失敗した場合の方針例。
return remoteUrl;
}
}
この例だけで全障害を解決できるわけではありません。オフラインならリモートURLも表示できません。認証が必要な画像ならURLだけ返しても足りません。必須データの取得失敗を黙って無視してよいとも限りません。フォールバックは機能ごとの契約として決めます。
importする位置も、確認する
任意機能を使う直前に可用性を判定するつもりでも、起動時に評価されるimportで失敗すれば、その判定まで到達できないことがあります。インポート時の挙動を含めて、対象SDKと既存バイナリで確かめる必要があります。
「try/catchを置いたから古いバイナリでも安全」とは言い切れません。ネイティブ側の変更が必要なら、対応した新しいビルドを作り、互換性のある更新だけを配ります。
リリース前のテスト行列
新旧のサポート対象バイナリ、オンライン・オフライン、キャッシュあり・なし、保存容量不足、更新直後の再起動を区別して考えます。対応しない組み合わせは、黙って落とすのではなく、対応範囲と利用者への案内を決めておきます。
この記事は互換性設計の整理であり、どのSDK・バイナリでも同じコードが使えるという保証ではありません。
参考
Expo公式:Runtime versions
https://docs.expo.dev/eas-update/runtime-versions/
Expo公式:How EAS Update works
https://docs.expo.dev/eas-update/how-it-works/
※2026年11月7日時点の設計整理です。AIを編集・コード例の作成補助に使用し、本人のインタビューと確認した実装の考え方をもとに構成しました。実測していない性能値や学習効果は掲載していません。
作例を試す方へ(開発者本人のアプリ)
本記事の背景にある学習アプリ「合格!クエスト」です。実際の図鑑・問題・まちがい直しを試せます。
iOS:https://apps.apple.com/jp/app/id6775411516
Android:https://play.google.com/store/apps/details?id=com.gokakushakaiquest.app
iPhoneの社会Proは対象者・先着500名に7日間無料。コード SHAKAI70 の適用先:
https://apps.apple.com/redeem?ctx=offercodes&id=6775411516&code=SHAKAI70
※iPhone:対象者のみ。利用枠は先着500名、適用期限は2026/11/20。今回のコード特典は自動更新なし。対象・適用結果はApp Storeの画面をご確認ください。
※Android:SHAKAI70は使えません。社会Pro年額プランの対象新規ユーザーは7日間無料、無料期間後は年4,800円で自動更新。継続しない場合は無料期間終了前にGoogle Playで解約してください。価格・対象条件は購入画面をご確認ください。
