在云端 Mac 上验证 iOS 动态字体布局

在云端 Mac 上验证 iOS 动态字体布局

订单确认页在默认字号下能完整显示地址和提交按钮,用户把 iPhone 文字调大后,按钮却被底部固定栏盖住了。开发机上打开一次页面很容易漏掉这种问题:动态字体会改变换行、单元格高度和滚动范围,而不只是把字放大。下面用云端 Mac 上的 iOS 模拟器固定测试条件,再用界面测试检查关键操作路径。

先确定测试对象与通过条件

选一个真实的长内容页面,例如订单确认、设置详情或错误说明。记录项目的 Xcode 工程、scheme、模拟器设备、iOS 运行时和测试账号状态;后续比较必须使用同一组条件。云端 Mac 若供多人使用,给这项测试指定独立的模拟器设备,避免另一项任务改变文字大小或清除应用数据。

先列出页面必须完成的动作,再写断言。建议至少覆盖标题可读、主要按钮可操作、长说明可滚动到末尾,以及返回操作可用。单纯检查视图是否存在,不足以证明文字没有被裁掉。

检查对象 可执行的通过条件 需人工复核的现象
页面标题 能找到预期的可访问性标识 换行后是否压住相邻内容
主操作 滚动后能点击并进入预期状态 按钮文字是否完整
长说明 末段内容可滚动到可见区域 文本或容器边缘是否截断

把“看起来正常”拆成能操作的路径和需要查看的截图。自动断言负责拦住明确故障,截图负责发现断言尚未描述的视觉问题。

固定模拟器并切换文字大小

在云端 Mac 上先确认 Xcode 命令行工具指向预期版本,再列出可用设备。不要直接假设 booted 永远是同一台设备:同机并行任务可能启动多个模拟器。将目标设备的 UDID 写入任务配置,启动后等待系统完成引导。

xcode-select -p
xcrun simctl list devices available
export SIM_UDID="从上一步选择的设备 UDID"
xcrun simctl boot "$SIM_UDID"
xcrun simctl bootstatus "$SIM_UDID" -b
xcrun simctl help ui

如果设备已经启动,boot 会提示其当前状态;确认 UDID 无误后直接执行 bootstatus 即可。simctl ui 的文字大小参数随已安装工具提供的帮助核对,不要把别的 Xcode 版本接受的档位名称直接抄进脚本。给测试任务传入经本机帮助核实的档位值,例如通过环境变量 TEXT_SIZE,然后执行:

: "${TEXT_SIZE:?set a supported content size}"
xcrun simctl ui "$SIM_UDID" content_size "$TEXT_SIZE"
xcrun simctl ui "$SIM_UDID" content_size

至少跑默认档、一个较大档和产品承诺支持的最大档。不要只测两端:中间档可能刚好让标题多换一行,却还没触发页面为最大字号准备的布局。每次切换后重新启动待测应用,保证当前页面不是切换前缓存的旧状态。

让界面测试检查操作路径

在应用中给关键控件设置稳定的可访问性标识,例如 checkout.title、checkout.submit 和 checkout.lastNote。标识应代表功能,而不是依赖会随语言变化的按钮文字。测试从同一个初始页面进入确认页;若需要登录或准备数据,使用项目已有的测试环境,不把真实凭据写进测试代码或日志。

下面的 XCTest 片段展示断言方向,具体导航和成功状态标识按项目实现替换。长页面先滑动,再判断末段与按钮是否可操作:

let app = XCUIApplication()
app.launch()
let title = app.staticTexts["checkout.title"]
XCTAssertTrue(title.waitForExistence(timeout: 10))

let page = app.scrollViews["checkout.content"]
let lastNote = app.staticTexts["checkout.lastNote"]
for _ in 0..<6 where !lastNote.isHittable {
    page.swipeUp()
}
XCTAssertTrue(lastNote.isHittable)

let submit = app.buttons["checkout.submit"]
for _ in 0..<6 where !submit.isHittable {
    page.swipeUp()
}
XCTAssertTrue(submit.isHittable)
submit.tap()
XCTAssertTrue(app.staticTexts["checkout.success"].waitForExistence(timeout: 10))

若页面并非 ScrollView,不要为了让示例通过而硬套选择器,应按实际容器调整。滑动次数设上限能避免测试在布局损坏时无限等待;但“可点”仍不能证明按钮文字完整,因此还要保留截图。

保留每档证据并定位故障

每一档记录设备 UDID、运行时、Xcode 版本、文字档位和测试结果。失败时先保存界面测试附件,再从相同档位重跑并获取模拟器截图;截图文件名加入档位和页面名,防止并行任务互相覆盖。若使用命令行留图,可执行 xcrun simctl io "$SIM_UDID" screenshot output.png,实际任务应把固定文件名改成自己的唯一输出路径。

查看截图时,先从最外层布局找原因。固定高度的标题容器常使第二行文字消失;横向排列的标签与金额会争夺宽度;屏幕底部的悬浮按钮可能盖住最后一段说明。优先让文字所在容器按内容增长,必要时将横排信息改为纵排,并为滚动内容预留底部空间。不要通过缩小文字来掩盖大字号故障。

遇到“测试偶尔通过”时,先确认测试是否一直使用相同 UDID、应用是否在切档后重新启动,以及断言是否误选了屏幕外的同名元素。确认条件稳定后再改布局,避免把设备状态污染误判成代码回归。

收成可维护的检查清单

把设备、运行时和支持的文字档位放进测试任务配置,逐档运行同一套界面测试。每次失败都保留档位、断言位置与截图;每次修复至少回测出错档及其相邻档。对没有可靠自动判据的截断和重叠,安排截图复核,不要给“元素存在”附会上线结论。

最后手工走一遍最重要的用户路径:放大文字后读完说明、找到主按钮、完成操作并返回。测试的目标不是让所有字号产生相同截图,而是在每个支持的字号下,内容仍然读得完,动作仍然做得到。

常见问题

只检查最大字号就够了吗?

不够。至少检查默认档、一个较大档和项目支持的最大档;中间档也可能因换行位置变化而单独出现遮挡。

元素存在是否意味着大字号布局通过?

不意味着。还要检查关键控件能否点到、内容能否滚动到,并查看失败截图;存在性断言发现不了所有截断问题。

把下一次构建交给独享的云端 Mac。

核对 ViewMini 的机型、区域和租期,再配置适合自己工作流的物理节点。

配置云端 Mac

继续核对设备与租期。

三档在售机型分别计日、周、月、季价格;下单前查看完整方案。

查看机型与价格 配置云端 Mac