在云端 Mac 上验证 iOS 触觉反馈:先测事件,再上真机

在云端 Mac 上验证 iOS 触觉反馈:先测事件,再上真机

云端 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、节点与计费周期。机型与可用性以控制台实时返回为准。

查看云端 Mac 租用配置