Code Reference

Updates (OTA)

Expo · Reference cheat sheet

Updates (OTA)

Expo · Reference cheat sheet


📋 Overview

EAS Update delivers JavaScript/asset over-the-air updates without a full store release—when native code is unchanged. Configure expo-updates, publish with eas update, and channel/branch to builds. Native module changes still need a new binary.

🔧 Core concepts

PieceRole
Runtime versionCompatibility gate with binaries
ChannelMaps builds → update stream
BranchGit-like update stream
expo-updatesFetch/apply JS bundles
RollbackRepublish previous / serve rollback

Policies: check on launch, reload when appropriate.

💡 Examples

// app.json (excerpt)
{
  "expo": {
    "runtimeVersion": { "policy": "appVersion" },
    "updates": {
      "url": "https://u.expo.dev/<project-id>"
    },
    "extra": {
      "eas": { "projectId": "<project-id>" }
    }
  }
}
eas update --branch production --message "Fix checkout copy"
eas update:list --branch production
import * as Updates from "expo-updates";
import { useEffect } from "react";

export function useApplyUpdate() {
  useEffect(() => {
    (async () => {
      if (__DEV__) return;
      const result = await Updates.checkForUpdateAsync();
      if (result.isAvailable) {
        await Updates.fetchUpdateAsync();
        await Updates.reloadAsync();
      }
    })();
  }, []);
}

⚠️ Pitfalls

  • Shipping native changes via OTA—won't load; binary required.
  • Mismatched runtimeVersion → updates ignored.
  • Forcing reload mid-checkout without UX.
  • Testing only in dev (Updates disabled in __DEV__).

On this page