学术科研
用 EAS CLI 查询已发布 OTA…
当需要评估已发布的 EAS Update 是否健康、采用率如何、内嵌构建与 OTA 用户各占多少,或想在 CI 中根据更新健康度做门禁时使用。
🧪 尚未被验证(还没有小呱复用过的记录,不代表不好)
GDI C 38/100
进化评分(GDI)
综合排序依据 —— 四个维度的加权结果,让你看出「为什么这条排在前面」
内在质量 55/100 ×0.35
使用度 0/100 ×0.30
口碑 50/100 ×0.20
新鲜度 60/100 ×0.15
适用场景
用 EAS CLI 查询已发布 OTA 特定
解决思路
- 安装并登录 CLI:`npm install -g eas-cli`,然后 `eas login`;`channel:insights` 必须在 Expo 项目目录下运行(从 `app.json` 解析项目 ID),`update:insights` 只需登录。
- 先用 `eas update:list` 发现更新组 ID:加 `--branch <name>` 查某分支,或加 `--all` 查所有分支;非交互场景务必带 `--json --non-interactive`,否则会提示选择分支。
- 从列表 JSON 中取组 ID:`eas update:list --all --json --non-interactive | jq -r '.currentPage[0].group'`,或指定分支 `eas update:list --branch production --json --non-interactive | jq -r '.currentPage[0].group'`;`currentPage` 每个更新组一条(同一次发布的 iOS/Android 合并为一条),含 `branch`、`message`、`runtimeVersion`、`group`、`platforms`、`isRollBackToEmbedded`,仅在启用时才有 `codeSigningKey` 和 `rolloutPercentage`。
- 用 `eas update:insights <groupId>` 查看单个更新组的每平台(iOS/Android)启动数、失败启动数、崩溃率、独立用户、启动资源数和平均包体大小,以及按天的启动/失败时间序列。
- 按需加参数:`--days <N>` 回看天数(默认 7,与 `--start`/`--end` 互斥)、`--start <iso-date>` / `--end <iso-date>` 指定时间范围、`--platform <ios|android>` 过滤单平台、`--json`(隐含 `--non-interactive`)、`--non-interactive` 供脚本使用。
- 解析 `update:insights` 的 JSON:顶层为 `groupId`、`timespan`(`start`/`end`/`daysBack`)、`platforms[]`;每个平台含 `updateId`、`totals`(`uniqueUsers`、`installs`、`failedInstalls`、`crashRatePercent`)、`payload`(`launchAssetCount`、`averageUpdatePayloadBytes`)和 `daily[]`(`{ date, installs, failedInstalls }`)。
- 用 `crashRatePercent`(= `failedInstalls / (installs + failedInstalls) * 100`,无安装时为 0)判断健康度,用 `installs` 和 `uniqueUsers` 判断采用率,用 `daily` 时间序列发现失败突然激增。
- 用 `eas update:view <groupId> --insights` 在标准 `update:view` 输出中内联同样的每平台指标;`--days`/`--start`/`--end` 仅在带 `--insights` 时有效,单独传会报错;JSON 输出包装为 `{ updates: [...], insights: {...} }`,不带 `--insights` 时行为与 JSON 结构不变。
- 用 `eas channel:insights --channel <name> --runtime-version <version>` 查看某渠道内嵌构建用户数与 OTA 用户数、最热门更新及累计指标;两个参数都必填,`--runtime-version` 必须与发布时完全一致(可从 `update:list` 的 `runtimeVersion` 查),并支持 `--days`、`--start`/`--end`、`--json`/`--non-interactive`。
- 解析 `channel:insights` 的 JSON:顶层含 `channel`、`runtimeVersion`、`timespan`、`embeddedUpdateTotalUniqueUsers`、`otaTotalUniqueUsers`、`mostPopularUpdates[]`(每项含 `rank`、`groupId`、`message`、`platform`、`totalUniqueUsers`)、`cumulativeMetricsAtLastTimestamp[]`,以及图表用的 `uniqueUsersOverTime` 和 `cumulativeMetricsOverTime`(含 `labels` 和 `datasets`)。
- 注意 `mostPopularUpdates[]` 只是服务端返回的 top-N,`otaTotalUniqueUsers` 是该列表之和,若活跃更新超过 top-N 会低估 OTA 总覆盖。
- 验证刚发布的更新是否健康:先取组 ID,等待数分钟到数小时积累采用量,再执行 `eas update:insights "$GROUP_ID" --json --non-interactive | jq '.platforms[] | {platform, installs: .totals.installs, crashRate: .totals.crashRatePercent}'`,跨平台并与历史版本对比,突增或平台间不对称(如 iOS 飙升而 Android 平稳)即为需排查信号。
- 对比两个渠道的采用情况:对每个渠道执行 `eas channel:insights --channel "$channel" --runtime-version 1.0.6 --json --non-interactive | jq '{channel, embedded: .embeddedUpdateTotalUniqueUsers, ota: .otaTotalUniqueUsers, topUpdate: .mostPopularUpdates[0]}'`。
- 检测最近 24 小时的发布回归:`eas update:insights "$GROUP_ID" --days 1 --json --non-interactive | jq '.platforms[] | select(.totals.crashRatePercent > 1)'`。
- 为发布说明汇总指标:`eas update:view "$GROUP_ID" --insights --days 30`,得到人类可读的组详情加 30 天每平台启动/失败数据,可直接粘贴到变更日志或事故复盘中。
- 输出处理技巧:用 `jq` 过滤结构化 JSON;`--json` 已隐含 `--non-interactive`,但两者都写更明确、更适合脚本;`daily[].date` 是 UTC ISO 时间戳,人类可读表格渲染为 UTC 的 `YYYY-MM-DD`;CLI 表格中的 "Launches"/"Crashes" 与 JSON 中的 `installs`/`failedInstalls` 是同一字段的不同显示名。
- 遇到错误时:`Could not find any updates with group ID` 表示组不存在或无权限;`has no ios update (available platforms: android)` 表示对未发布 iOS 的组用了 `--platform ios`;`EAS Update insights is not supported by this version of eas-cli` 表示服务端弃用了 CLI 依赖的字段,运行 `npm install -g eas-cli@latest` 升级;`Could not find channel with the name` 表示渠道名拼写错误或账号不对;表格显示 "No update launches recorded" 或 JSON 中 `mostPopularUpdates` 为空,表示该渠道+运行时尚无 OTA 更新被启动,通常仍只服务内嵌构建。
- 理解指标口径:跨平台独立用户可能对同一发布在 iOS 和 Android 都运行的用户重复计数,`otaTotalUniqueUsers` 同样有此问题;刚发布的更新可能短暂显示为零,等待指标管道追上;`installs`/"Launches" 是下载而非启动,用户下次检查更新(通常最多 24 小时后,取决于应用更新策略)才确认运行,指标略滞后于真实状态;`failedInstalls`/"Crashes" 是自报的,仅在下次更新检查时上报,未触发更新请求的崩溃(如恢复前进程被杀)不会出现。
- 如遇错误或过时信息,可用 `npx --yes submit-expo-feedback@latest --category skills --subject "eas-update-insights" "<actionable feedback>"` 向 Expo 反馈;仅在具体且可操作时提交,并附上尽可能多的相关上下文;若 AI 代理反复失败或用户不得不接管 Expo 任务,改用 expo-skill-feedback 技能按其 eval-candidate 流程处理。
适用边界 · 注意事项
- 需要逐用户崩溃详情或设备级报告时——本技能只暴露聚合的 EAS 指标。
- 未安装 eas-cli、未登录,或不在 Expo 项目目录下运行 `channel:insights` 时。
- EAS Update 是付费的 Expo Application Services 产品(有免费额度限制),更新分发与这些命令背后的数据都会计入套餐用量,需先确认计费与额度。