Phase 1.15:VibratorHandler 单次振动 handler

新增 ylgamehall/Source/Bridge/Handlers/VibratorHandler.swift:
- 无状态 public enum VibratorHandler,static func register(on:)
- 入参忽略(参考原 msext RootVC.m:1816-1818:time 参数实际不读取)
- 副作用:AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
- responseCallback:.string("vibrator"),与契约 §3.1 [10]一致
- 模拟器无振动硬件、调用静默忽略;真机才能感知

WebContainerViewController.viewDidLoad 新增 registerBridgeHandlers()
单一聚合点,Phase 2+ 在此追加更多 handler,便于发现 / 调试。

repeatvibrator / canclevibrator 严格守住 Plan §5 Phase 2.2 范围,不
提前实现。

BuildProject 通过

Plan 进度已勾选(§5 Phase 1.15 + §8)

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
This commit is contained in:
joywayer
2026-06-22 04:02:33 +08:00
co-authored by Claude Opus 4.7
parent a20498f898
commit 6c943e2924
3 changed files with 45 additions and 3 deletions
@@ -0,0 +1,32 @@
//
// VibratorHandler.swift
// ylgamehall
//
// H5 Native handlervibrator §3.1 10
// Phase 1.15
// `repeatvibrator` / `canclevibrator` Phase 2.2
//
import AudioToolbox
/// handler
///
/// enum C API
/// handler ""
public enum VibratorHandler {
/// `bridge` `vibrator` handler
///
/// `docs/H5-Native-Contract.md` §3.1 10
/// - msext `RootVC.m:1816-1818` `time`
/// - `AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)`
/// - responseCallback `"vibrator"`
///
///
public static func register(on bridge: any BridgeProtocol) {
bridge.register("vibrator") { _, callback in
AudioServicesPlaySystemSound(kSystemSoundID_Vibrate)
callback?(.string("vibrator"))
}
}
}
@@ -40,12 +40,19 @@ public final class WebContainerViewController: UIViewController {
setupSplash()
bridgedWebView.webView.navigationDelegate = self
registerBridgeHandlers()
Task { @MainActor in
await runBootPipeline()
}
}
/// H5 Native handlerPhase 1.15 `vibrator`
/// Phase 2+ handler便 /
private func registerBridgeHandlers() {
VibratorHandler.register(on: bridgedWebView.bridge)
}
public override var supportedInterfaceOrientations: UIInterfaceOrientationMask { .landscape }
public override var preferredInterfaceOrientationForPresentation: UIInterfaceOrientation { .landscapeRight }
public override var prefersStatusBarHidden: Bool { false }