dd721fafc8
原 `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