diff --git a/haptics/ios/Sources/HapticsPlugin/Haptics.swift b/haptics/ios/Sources/HapticsPlugin/Haptics.swift index 97ad97d8a..3daadf616 100644 --- a/haptics/ios/Sources/HapticsPlugin/Haptics.swift +++ b/haptics/ios/Sources/HapticsPlugin/Haptics.swift @@ -6,6 +6,45 @@ import CoreHaptics var selectionFeedbackGenerator: UISelectionFeedbackGenerator? + // Haptic Engine Management + private var hapticEngine: CHHapticEngine? + private var idleTimer: Timer? + private let idleInterval: TimeInterval = 5.0 // Engine will shut down after 5 seconds of inactivity + + /** + * Initializes the haptic engine and starts it. + */ + private func initializeEngine() { + if CHHapticEngine.capabilitiesForHardware().supportsHaptics { + do { + hapticEngine = try CHHapticEngine() + try hapticEngine?.start() + } catch { + print("Error initializing haptic engine: \(error)") + hapticEngine = nil + } + } + } + + /** + * Reset the idle timer each time a haptic event is fired. + */ + private func resetIdleTimer() { + idleTimer?.invalidate() + idleTimer = Timer.scheduledTimer(withTimeInterval: idleInterval, repeats: false) { [weak self] _ in + self?.shutdownEngine() + } + } + + /** + * Shuts down the haptic engine if it is not in use. + */ + private func shutdownEngine() { + hapticEngine?.stop(completionHandler: nil) + hapticEngine = nil + } + + @objc public func impact(_ impactStyle: UIImpactFeedbackGenerator.FeedbackStyle) { let generator = UIImpactFeedbackGenerator(style: impactStyle) generator.impactOccurred() @@ -38,16 +77,19 @@ import CoreHaptics @objc public func vibrate(_ duration: Double) { if CHHapticEngine.capabilitiesForHardware().supportsHaptics { + // Reuse the existing engine or initialize a new one if needed. + if hapticEngine == nil { + initializeEngine() + } + // Reset the idle timer so the engine remains alive. + resetIdleTimer() + + guard let engine = hapticEngine else { + vibrate() // fallback if the engine couldn’t be created + return + } + do { - let engine = try CHHapticEngine() - try engine.start() - engine.resetHandler = { [] in - do { - try engine.start() - } catch { - self.vibrate() - } - } let intensity = CHHapticEventParameter(parameterID: .hapticIntensity, value: 1.0) let sharpness = CHHapticEventParameter(parameterID: .hapticSharpness, value: 1.0)