index.uts 1.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142
  1. import * as AudioToolbox from "AudioToolbox";
  2. import * as UIKit from "UIKit";
  3. import { Thread } from "Foundation";
  4. /**
  5. * 触发设备震动
  6. * @param duration 震动持续时间,单位:毫秒(ms),仅在iOS 13.0+有效
  7. */
  8. export function vibrate(duration: number) {
  9. // 参数验证:确保duration为正数
  10. if (duration < 0) {
  11. duration = 0;
  12. }
  13. // 检查iOS版本,决定使用哪种震动方式
  14. if (UTSiOS.available("iOS 13.0, *")) {
  15. // 创建中等强度的触觉反馈生成器
  16. const generator = new UIKit.UIImpactFeedbackGenerator(
  17. (style = UIKit.UIImpactFeedbackGenerator.FeedbackStyle.medium)
  18. );
  19. // 准备生成器,提高首次触发的响应速度
  20. generator.prepare();
  21. // 记录开始时间
  22. const startTime = new Date().getTime();
  23. const endTime = startTime + duration;
  24. // 循环产生震动效果,直到达到指定时长
  25. while (new Date().getTime() < endTime) {
  26. // 触发触觉反馈,强度为0.5(中等强度)
  27. generator.impactOccurred((intensity = 0.5));
  28. // 暂停100毫秒,避免过于频繁的震动
  29. Thread.sleep((forTimeInterval = 0.1));
  30. }
  31. } else {
  32. // iOS 13.0以下版本:使用AudioToolbox播放系统震动音效
  33. // 注意:此方式无法控制震动时长,duration参数将被忽略
  34. AudioToolbox.AudioServicesPlayAlertSound(AudioToolbox.kSystemSoundID_Vibrate);
  35. }
  36. }