0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Expo OTAで古いアプリを起動不能にしないための互換性チェック

0
Posted at

TrailFusion AI 12日連載・第4話の表紙

※冒頭は実体験を題材にした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で解約してください。価格・対象条件は購入画面をご確認ください。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?