在雲端 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 租用方案