Library / Custom Core Haptics patterns

AHAP files (designed patterns as assets)

Ship haptic patterns as JSON assets designers can iterate on without recompiling — the standard for game/media haptics.

0ms 105ms 210ms 315ms 420ms
Feel
Whatever you design: AHAP expresses the same events, parameters, and curves as code, in a portable file.
APIs
CHHapticEngine.playPattern(from: URL)AHAP
Minimum OS
iOS 13+
Raw .md
Swift (loading)
import CoreHaptics

func playAHAP(named name: String, engine: CHHapticEngine) {
    guard let url = Bundle.main.url(forResource: name,
                                    withExtension: "ahap") else { return }
    do {
        try engine.start()
        try engine.playPattern(from: url)
    } catch {
        print("Failed to play \(name).ahap: \(error)")
    }
}

// playAHAP(named: "Sparkle", engine: HapticEngine.shared.engine)
Sparkle.ahap
{
  "Version": 1.0,
  "Metadata": {
    "Project": "MyApp",
    "Created": "2026",
    "Description": "Sharp tick followed by a soft fading shimmer"
  },
  "Pattern": [
    {
      "Event": {
        "Time": 0.0,
        "EventType": "HapticTransient",
        "EventParameters": [
          { "ParameterID": "HapticIntensity", "ParameterValue": 0.8 },
          { "ParameterID": "HapticSharpness", "ParameterValue": 1.0 }
        ]
      }
    },
    {
      "Event": {
        "Time": 0.12,
        "EventType": "HapticContinuous",
        "EventDuration": 0.3,
        "EventParameters": [
          { "ParameterID": "HapticIntensity", "ParameterValue": 0.5 },
          { "ParameterID": "HapticSharpness", "ParameterValue": 0.6 }
        ]
      }
    },
    {
      "ParameterCurve": {
        "ParameterID": "HapticIntensityControl",
        "Time": 0.12,
        "ParameterCurveControlPoints": [
          { "Time": 0.0,  "ParameterValue": 1.0 },
          { "Time": 0.3,  "ParameterValue": 0.0 }
        ]
      }
    }
  ]
}
Copied