Files
pangolin/scripts
wangjia dd721fafc8 fix(scripts): local_test.sh ipad 改走公司分发证书(ad-hoc),装机前核验签名主体
原 `ipad` 子命令用 `flutter run --release` 装真机,走的是 Xcode 工程的**开发**
签名。Apple 只把 Development 证书签发给团队里的**个人成员**(不存在组织版),
于是装到机上「设置→通用→VPN 与设备管理」里开发者显示成个人姓名,而不是
Yanmei (beijing) Technology Co., Ltd。

改为 ad-hoc 分发(Xcode 15+ 的 method=release-testing)+ 自动签名:
- 新增 write_ios_export_options() 生成 ExportOptions.plist(teamID=BYL4KQHMTN);
- `flutter build ipa --release --export-options-plist=…` 导出时由 Xcode 用
  **Apple Distribution: Yanmei…** 重签;
- 装机前解包 IPA 逐字比对签名主体(IOS_EXPECT_SIGNER),不符即中止 —— 防止
  以后无声退回个人证书;
- 用 devicectl 安装;仅当覆盖安装失败(旧包签名主体不同)才卸载重装,不无条件
  先卸(卸载会清空 app 数据要重新登录);
- 构建失败时提示新设备注册命令:光给 -allowProvisioningUpdates 不够,必须同时
  给 -allowProvisioningDeviceRegistration。

另外两处顺手修:
- 取 IPA 路径原写 `ls … | head -1`,在 set -o pipefail 下 head 提前退出会让 ls
  吃 SIGPIPE、管道返回 141,被 set -e 当失败终止脚本(实测复现,退出码 141)。
  改用数组 glob。签名主体提取的 `codesign | grep -m1` 同一个坑,改成整段捕获
  后用 awk 读完全部输入。
- API_URL 支持 env 覆盖(默认值不变),便于装生产地址的包做验证。

验证:bash -n 通过;shellcheck 无新增告警;
API_URL=https://api.yanmeiai.com bash scripts/local_test.sh ipad 无字天书
端到端 exit=0,日志确认"签名核验通过: Apple Distribution: Yanmei…"并装机成功。

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P9G7E3wmAYL9KeYCVZVsqu
2026-07-22 11:59:08 +08:00
..