Reference Raywenderlich Core Haptics

About Core Haptics

Core Haptics는 iOS 13.0에서 도입된 API로 이를 통해 커스텀 생성, 고해상도 촉감과, 오디오 피드백 , 진동 제작이 가능하다

Add a Haptic

Haptic 재생을 위해 HapticManager 클래스를 작성하고 시작한다.

import CoreHaptics

우선 모듈을 불러온다.

final class HapticManager {
  init() throws {
    guard CHHapticEngine.capabilitiesForHardware().supportsHaptics else {
      throw CHHapticError(.notSupported)
    }
    
    let hapticEngine = try CHHapticEngine()
    self.hapticEngine = hapticEngine
  }
  
  private let hapticEngine: CHHapticEngine
}

HapticManager 클래스를 생성할 때 CHHapcticEngine이 사용 가능한지 확인하고, 불가하다면 조기 종료문으로 에러를 전달한다.

햅틱 재생은 패턴을 만들어서 재생하는데 CHHapticPattern 클래스를 통해 만들어 진다.

private extension HapticManager {
  // MARK: Haptic Patterns
  func slicePattern() throws -> CHHapticPattern {
    let slice = CHHapticEvent(eventType: .hapticContinuous,
                              parameters: [
      .init(parameterID: .hapticIntensity, value: 0.35),
      .init(parameterID: .hapticSharpness, value: 0.25)],
                              relativeTime: 0,
                              duration: 0.5
    )
    
    let snip = CHHapticEvent(
      eventType: .hapticTransient,
      parameters: [
        .init(parameterID: .hapticIntensity, value: 1),
        .init(parameterID: .hapticSharpness, value: 1)],
      relativeTime: 0.08
      )
    
    return try .init(events: [slice, snip], parameters: [])
    
  }
}

slicePattern이라는 이름으로 생성한 패턴은 다음과 같이 재생할 수 있다.

extension HapticManager {
  // MARK: Play Haptic Patterns
  func playSlice() throws {
    try hapticEngine.start()
    let player = try hapticEngine.makePlayer(with: slicePattern())
    try player.start(atTime: CHHapticTimeImmediate)
    hapticEngine.notifyWhenPlayersFinished { _ in
        .stopEngine
    }
  }
}

이제 뷰컨트롤러에서 HapticManager를 불러와서 진동이 필요한 부븐에 hapticManager.playSlice()를 사용하면 지정해준 패턴이 진동하게 되겠다.