// HapticFeedbackManager.m #import "HapticFeedbackManager.h" #import #import #import @implementation HapticFeedbackManager static CHHapticEngine *hapticEngine; + (void)initializeHapticEngine { if (!hapticEngine) { NSError *error = nil; hapticEngine = [[CHHapticEngine alloc] initAndReturnError:&error]; if (error) { NSLog(@"Failed to create haptic engine: %@", error.localizedDescription); } else { [hapticEngine startWithCompletionHandler:^(NSError * _Nullable error) { if (error) { NSLog(@"Failed to start haptic engine: %@", error.localizedDescription); } }]; } } } + (void)TriggerCustomHaptic:(float)intensity sharpness:(float)sharpness duration:(float)duration { if (@available(iOS 13.0, *)) { if (![CHHapticEngine capabilitiesForHardware].supportsHaptics) { NSLog(@"Haptic feedback is not supported on this device."); [self triggerFallbackHaptic]; return; } [self initializeHapticEngine]; NSError *error = nil; CHHapticEventParameter *intensityParameter = [[CHHapticEventParameter alloc] initWithParameterID:CHHapticEventParameterIDHapticIntensity value:intensity]; CHHapticEventParameter *sharpnessParameter = [[CHHapticEventParameter alloc] initWithParameterID:CHHapticEventParameterIDHapticSharpness value:sharpness]; CHHapticEvent *event = [[CHHapticEvent alloc] initWithEventType:CHHapticEventTypeHapticContinuous parameters:@[intensityParameter, sharpnessParameter] relativeTime:0 duration:duration]; CHHapticPattern *pattern = [[CHHapticPattern alloc] initWithEvents:@[event] parameters:@[] error:&error]; if (error) { NSLog(@"Failed to create haptic pattern: %@", error.localizedDescription); return; } id player = [hapticEngine createPlayerWithPattern:pattern error:&error]; if (error) { NSLog(@"Failed to create haptic player: %@", error.localizedDescription); return; } [player startAtTime:CHHapticTimeImmediate error:&error]; if (error) { NSLog(@"Failed to start haptic player: %@", error.localizedDescription); } } else { NSLog(@"Core Haptics is not available on this version of iOS."); } } + (void)triggerFallbackHaptic { // 使用轻微震动作为替代 // UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] // initWithStyle:UIImpactFeedbackStyleLight]; // [generator prepare]; // [generator impactOccurred]; // UIImpactFeedbackGenerator *generator = [[UIImpactFeedbackGenerator alloc] // initWithStyle:UIImpactFeedbackStyleHeavy]; // [generator prepare]; // [generator impactOccurred]; // 使用 UINotificationFeedbackGenerator 触发通知风格的震动 // UINotificationFeedbackGenerator *generator = [[UINotificationFeedbackGenerator alloc] init]; // [generator prepare]; // [generator notificationOccurred:UINotificationFeedbackTypeSuccess]; // 使用系统震动 AudioServicesPlaySystemSound(kSystemSoundID_Vibrate); } #ifdef __cplusplus extern "C" { #endif void TriggerCustomHaptic(float intensity, float sharpness, float duration) { [HapticFeedbackManager TriggerCustomHaptic:intensity sharpness:sharpness duration:duration]; } #ifdef __cplusplus } #endif @end