用途
该技能用于指导并约束 React Native(Expo)应用通过 EAS Update 发布空中更新(OTA)。核心目标是确保 OTA 更新只到达与其原生层匹配的二进制包,并让发布、灰度、回滚环节可控、可核查。
主要规则与能力
- 运行时版本采用指纹策略:在顶层使用
runtimeVersion: { policy: 'fingerprint' },不使用固定字符串或appVersion策略;指纹只对原生输入做哈希,fingerprint.config.js负责把生命周期脚本(pre/post install、prepare、eas-build-*)纳入哈希,其他 npm scripts 与版本字段排除。 - 更新配置统一:
updates.url使用项目 EAS Update 地址https://u.expo.dev/<id>,与extra.eas.projectId一致;启用更新须有 URL,否则显式updates: { enabled: false };expo-updates必须是依赖而非 devDependency。 - 启动不阻塞、错误恢复保留:
fallbackToCacheTimeout: 0、checkAutomatically: 'ON_LOAD',不关闭反砖恢复措施,不在启动时等待网络。 - 每个发布变体一个通道:每个发布构建 profile 的
channel等于其变体等于环境;开发客户端不设通道;通道在构建时写入二进制。 - 发布命令必须显式指定通道、环境与消息:使用
eas update --channel <v> --environment <v> --message "<fix>",不用--auto。 - 原生变更不得空中下发:新增 SDK、原生包、插件或配置变更须先发布商店构建;发布前需通过
npm run verify与scripts/ota/update-preflight.ts预检。 - 商店通道分阶段发布:首次发布使用
--rollout-percentage 1-25,依据eas update:insights的崩溃率再提升;预览无需灰度。 - 禁止跨通道提升:同一提交在预览验证后,需用生产环境重新发布到生产通道,不使用
update:republish --destination-channel。 - 回滚由人工决策:先暂停通道,仅在目标之后无数据迁移时回滚,否则前向修复;相关操作不在 CI 中执行。
- UpdatesPort 适配层:唯一导入
expo-updates的适配器,调用前检查Updates.isEnabled,将特定错误码映射为禁用状态且不抛异常;更新检查在挂载及回到前台时进行(至多每小时一次),仅在用户点击后应用更新。
使用方式
技能提供模板与脚本:复制 templates/src/config/updates-config.ts 及其测试、templates/fingerprint.config.js、templates/src/services/updates/、templates/src/hooks/use-update-checks.ts、templates/scripts/ota/ 下的更新计划与预检脚本;参考 examples/ 中的 app.config、eas.json、组合根、应用根与发布工作流示例进行接线。安装命令为 npx expo install expo-updates。发布流程为:先发布商店构建,再运行预检脚本,经开发者确认后执行打印出的发布命令,并在预览机测试后按灰度发布到生产。最后从仓库根目录运行 node ${CLAUDE_SKILL_DIR}/scripts/check-ota.mjs .,修复 FAIL 项直至 RESULT: PASS。
适用场景
适用于使用 Expo 与 EAS Update 的 React Native 项目,尤其是需要区分多个发布变体、在 CI 中发布更新、需要灰度与回滚控制的团队。
限制与注意事项
- 调试构建从开发服务器加载 JS,只有 release 构建才运行更新器,因此需在 iOS 与 Android 的 release 构建上分别验证更新路径。
- 文档建议的 SDK 版本、
expo-updates版本号及验证日期来自资料原文,实际可用性暂未提供进一步说明。 - 涉及发布、提升灰度、回滚或暂停的操作,均需开发者明确同意后才可执行。