43 lines
1.3 KiB
Plaintext
43 lines
1.3 KiB
Plaintext
|
|
import * as AudioToolbox from "AudioToolbox";
|
|||
|
|
import * as UIKit from "UIKit";
|
|||
|
|
import { Thread } from "Foundation";
|
|||
|
|
|
|||
|
|
/**
|
|||
|
|
* 触发设备震动
|
|||
|
|
* @param duration 震动持续时间,单位:毫秒(ms),仅在iOS 13.0+有效
|
|||
|
|
*/
|
|||
|
|
export function vibrate(duration: number) {
|
|||
|
|
// 参数验证:确保duration为正数
|
|||
|
|
if (duration < 0) {
|
|||
|
|
duration = 0;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 检查iOS版本,决定使用哪种震动方式
|
|||
|
|
if (UTSiOS.available("iOS 13.0, *")) {
|
|||
|
|
// 创建中等强度的触觉反馈生成器
|
|||
|
|
const generator = new UIKit.UIImpactFeedbackGenerator(
|
|||
|
|
(style = UIKit.UIImpactFeedbackGenerator.FeedbackStyle.medium)
|
|||
|
|
);
|
|||
|
|
|
|||
|
|
// 准备生成器,提高首次触发的响应速度
|
|||
|
|
generator.prepare();
|
|||
|
|
|
|||
|
|
// 记录开始时间
|
|||
|
|
const startTime = new Date().getTime();
|
|||
|
|
const endTime = startTime + duration;
|
|||
|
|
|
|||
|
|
// 循环产生震动效果,直到达到指定时长
|
|||
|
|
while (new Date().getTime() < endTime) {
|
|||
|
|
// 触发触觉反馈,强度为0.5(中等强度)
|
|||
|
|
generator.impactOccurred((intensity = 0.5));
|
|||
|
|
|
|||
|
|
// 暂停100毫秒,避免过于频繁的震动
|
|||
|
|
Thread.sleep((forTimeInterval = 0.1));
|
|||
|
|
}
|
|||
|
|
} else {
|
|||
|
|
// iOS 13.0以下版本:使用AudioToolbox播放系统震动音效
|
|||
|
|
// 注意:此方式无法控制震动时长,duration参数将被忽略
|
|||
|
|
AudioToolbox.AudioServicesPlayAlertSound(AudioToolbox.kSystemSoundID_Vibrate);
|
|||
|
|
}
|
|||
|
|
}
|