云端 Mac 上的 iOS 构建通过了,模拟器里的确认按钮也能点击,团队却不能据此宣布触觉反馈验收完成。模拟器可以检查代码是否准备了正确的事件,却不能让测试者感到那一下振动。把这两件事写成不同的检查项:前者交给自动化,后者留给支持触觉的真机。
先定义反馈要表达什么
以“保存完成”为例,反馈应在保存操作成功之后触发一次,而不是在用户刚按下按钮时触发。保存失败时,界面需要显示错误,但不应播放成功反馈。写测试前,先把契约记成三项:触发条件、事件类型、触发次数。
不要用触觉代替文字或画面状态。用户可能关闭系统触觉,也可能使用不支持所选触觉能力的设备。保存结果应始终有可见的确认;触觉只是在这个结果之上增加一条感知线索。
自动化测试证明“请求了哪种反馈”,真机验收回答“反馈是否合适”。两者不能互相替代。
把事件规格留在播放代码之外
事件参数如果散落在按钮回调中,测试只能通过点击界面间接猜测发生了什么。先建立生成事件的函数,再让播放层使用它。这样,测试可以直接检查事件数量、类型与相对时间,不必依赖硬件是否振动。
在云端 Mac 上运行事件检查
下面的例子使用一个短暂事件表示“保存完成”。参数是示例起点,不是适用于所有产品的推荐强度;最终数值要经过真机体验确认。
import CoreHaptics
func confirmationEvents() -> [CHHapticEvent] {
let event = CHHapticEvent(
eventType: .hapticTransient,
parameters: [
CHHapticEventParameter(parameterID: .hapticIntensity, value: 0.65),
CHHapticEventParameter(parameterID: .hapticSharpness, value: 0.35)
],
relativeTime: 0
)
return [event]
}
在工程的测试目标中,可以先检查不依赖播放设备的契约。测试代码与应用代码应引用同一个 confirmationEvents(),不要在测试里重新造一份事件,否则两份参数可能各自漂移。
import XCTest
import CoreHaptics
@testable import YourApp
final class ConfirmationHapticsTests: XCTestCase {
func testConfirmationIsOneImmediateEvent() {
let events = confirmationEvents()
XCTAssertEqual(events.count, 1)
XCTAssertEqual(events[0].relativeTime, 0)
XCTAssertEqual(events[0].eventType, .hapticTransient)
}
}
把 YourApp 换成实际模块名后,在云端 Mac 上用工程现有的共享测试入口运行该测试目标。这里检查的是事件定义,不要求模拟器产生真实振动。若业务后来决定把一次反馈改成两段节奏,先改契约和测试,再讨论真机上的感受。
播放失败不能改变业务结果
播放层先检查 CHHapticEngine.capabilitiesForHardware().supportsHaptics,再创建引擎与播放器。引擎启动、模式创建或播放都可能失败;错误分支只记录为应用内部可诊断的反馈失败,不应把已经成功的保存操作改判为失败。引擎中断后也不要假设旧播放器始终可用,应按应用生命周期重新准备播放状态。
| 情况 | 应用必须保证 | 触觉处理 |
|---|---|---|
| 保存成功且支持触觉 | 显示保存完成状态 | 请求播放成功事件 |
| 保存成功但不支持触觉 | 同样显示保存完成状态 | 跳过播放 |
| 保存失败 | 显示可理解的错误 | 不播放成功事件 |
| 播放过程出错 | 保留已完成的保存结果 | 停止本次反馈并记录诊断信息 |
测调用时机,不测模拟器手感
给播放动作包一层可替换的接口。保存流程测试注入记录调用次数的实现:成功后断言调用一次,失败后断言零次,重复点击被业务逻辑拦截时也不应多播。另给无触觉能力的分支做测试,确认界面结果没有变化。这些检查比“模拟器有没有振动”更稳定,也更接近代码真正能保证的行为。
把体验验收留给真机
真机检查至少覆盖保存成功、失败、快速连续操作和从后台返回后的首次操作。观察触觉与完成状态是否同一时刻出现;连续点击时是否密集到难以辨认;系统中断音频或应用切到后台后,下一次反馈是否仍能正常请求。每次调参数只改一项,记录测试设备、系统版本与观察结果,避免把主观差异当成代码回归。
云端 Mac 可以完成编译、模拟器测试和事件契约检查。实际触感仍要由团队在支持触觉的设备上确认;远程桌面里看到的按钮动画不是触觉验收证据。
提交前核对边界
合并前确认四件事:事件生成函数由生产代码和测试共同使用;保存失败不会触发成功反馈;不支持触觉或播放异常时仍有明确的可见结果;真机记录包含触发时机与连续操作的观察。若某条真机体验意见导致参数调整,同时更新事件测试中的预期,并重新跑自动化检查。
这样分工后,云端 Mac 上的测试负责守住可重复的事实,真机检查负责守住无法由模拟器回答的体验问题。
常见问题
iOS 模拟器能验收触觉反馈的实际手感吗?
不能。模拟器适合检查事件构造、调用条件和无触觉设备的降级路径;强度是否合适、是否与画面同步,仍需在支持触觉的真机上检查。
设备不支持 Core Haptics 时应该让操作失败吗?
不应该。先完成原本的操作并更新可见状态,再把触觉视为附加反馈;不支持触觉或播放出错时,不应撤销操作结果。
让下一次实验有一台独享的 Mac
按需选择物理 Mac mini、节点与计费周期。机型与可用性以控制台实时返回为准。