클라우드 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를 확인한 뒤 엔진과 플레이어를 생성합니다. 엔진 시작, 패턴 생성, 재생은 모두 실패할 수 있습니다. 오류가 나면 앱 내부에서 진단할 수 있도록 피드백 실패를 기록하되, 이미 성공한 저장 작업을 실패로 바꿔서는 안 됩니다. 엔진이 중단된 뒤에는 기존 플레이어가 계속 동작한다고 가정하지 말고, 앱 수명 주기에 맞춰 재생 상태를 다시 준비하세요.
| 상황 | 앱이 보장해야 할 사항 | 햅틱 처리 |
|---|---|---|
| 저장 성공, 햅틱 지원 | 저장 완료 상태 표시 | 성공 이벤트 재생 요청 |
| 저장 성공, 햅틱 미지원 | 동일하게 저장 완료 상태 표시 | 재생 건너뛰기 |
| 저장 실패 | 이해할 수 있는 오류 표시 | 성공 이벤트 재생하지 않기 |
| 재생 중 오류 발생 | 이미 완료된 저장 결과 유지 | 이번 피드백을 중단하고 진단 정보 기록 |
시뮬레이터의 촉감이 아닌 호출 시점 테스트하기
재생 동작을 교체 가능한 인터페이스로 감싸세요. 저장 흐름 테스트에는 호출 횟수를 기록하는 구현을 주입해 성공 후에는 한 번, 실패 후에는 0번 호출됐는지 확인합니다. 반복 클릭을 비즈니스 로직이 차단했다면 재생 요청도 추가로 발생해서는 안 됩니다. 햅틱을 지원하지 않는 분기도 별도로 테스트해 화면에 표시되는 결과가 달라지지 않는지 확인하세요. 이런 검사는 ‘시뮬레이터가 진동했는가’보다 안정적이고, 코드가 실제로 보장할 수 있는 동작에 더 가깝습니다.
사용 경험 검증은 실기기에서 하기
실기기 점검에는 적어도 저장 성공과 실패, 빠르게 반복하는 조작, 백그라운드에서 돌아온 뒤 첫 조작을 포함하세요. 햅틱과 완료 상태가 동시에 나타나는지, 연속으로 누를 때 피드백이 너무 촘촘해 구분하기 어려운지 확인합니다. 시스템의 오디오 인터럽션이 발생하거나 앱이 백그라운드로 전환된 뒤에도 다음 피드백을 정상적으로 요청할 수 있는지 살펴보세요. 매개변수를 조정할 때는 한 번에 하나씩만 바꾸고 테스트 기기, 시스템 버전, 관찰 결과를 기록해 주관적인 체감 차이를 코드 회귀로 오인하지 않도록 합니다.
클라우드 Mac에서는 컴파일, 시뮬레이터 테스트, 이벤트 계약 검사를 완료할 수 있습니다. 실제 촉감은 팀이 햅틱 지원 기기에서 확인해야 합니다. 원격 데스크톱에 표시되는 버튼 애니메이션은 햅틱 검증의 증거가 아닙니다.
제출 전 경계 확인하기
병합 전에 네 가지를 확인하세요. 이벤트 생성 함수를 프로덕션 코드와 테스트가 함께 사용하는지, 저장 실패 시 성공 피드백이 발생하지 않는지, 햅틱 미지원이나 재생 오류 상황에서도 명확한 화면 결과가 남는지, 실기기 기록에 트리거 시점과 연속 조작에 대한 관찰이 포함되어 있는지 확인합니다. 실기기 체감에 관한 의견으로 매개변수를 조정했다면 이벤트 테스트의 예상 값도 함께 업데이트하고 자동화 검사를 다시 실행하세요.
이렇게 역할을 나누면 클라우드 Mac의 테스트는 반복해서 검증할 수 있는 사실을 지키고, 실기기 점검은 시뮬레이터가 답할 수 없는 사용 경험을 확인합니다.
자주 묻는 질문
iOS 시뮬레이터만으로 햅틱 품질을 확인할 수 있나요?
아니요. 이벤트 구성과 호출 조건은 확인할 수 있지만 강도와 화면의 체감 동기화는 햅틱 지원 실기기에서 확인해야 합니다.
Core Haptics를 지원하지 않는 기기에서는 어떻게 처리하나요?
원래 작업과 화면 상태 업데이트는 그대로 완료하고 햅틱만 생략합니다. 햅틱 재생 실패가 작업 실패로 이어지지 않게 합니다.
다음 실험을 위한 나만의 Mac
필요에 따라 전용 Mac mini, 노드 및 요금제를 선택하세요. 모델과 이용 가능 여부는 콘솔에서 실시간으로 확인할 수 있습니다.