# DuooomiBleWrapper 该目录由 `pnpm build:ios` 生成,是可以直接交付给 iOS 原生宿主工程使用的 Swift Package。 ## 目录内容 - `Frameworks/DuooomiBleSDK.xcframework` - `Frameworks/hermesvm.xcframework` - `Sources/DuooomiBleWrapper/DuooomiBleManager.swift` - `Sources/DuooomiBleWrapper/DuooomiBleRuntime.swift` ## 宿主 App 接入步骤 1. 将 `dist/ios/DuooomiBleWrapper` 作为本地 Swift Package 引入宿主工程。 2. 在宿主 App 的一个长期存在的容器视图里启动 Brownfield 运行时。 3. 运行时启动完成后,通过 `DuooomiBleManager.shared` 调用蓝牙能力。 ## 最小使用示例 ```swift try DuooomiBleRuntime.shared.start(in: view) Task { let result = try await DuooomiBleManager.shared.connect(deviceId: "device-id") print(result) } ``` 如果是扫描,仍然沿用监听方式: ```swift DuooomiBleManager.shared.onDiscoveredDevicesChange = { devices in print(devices) } DuooomiBleManager.shared.scan() ``` ## 如果宿主需要显式初始化 Brownfield 如果你的宿主工程不能被 `DuooomiBleRuntime` 自动识别出 `ReactNativeHostManager` 或 `ReactNativeView`,可以显式传入初始化逻辑: ```swift try DuooomiBleRuntime.shared.start( in: view, initializeHost: { ReactNativeHostManager.shared.initialize() }, createReactNativeView: { ReactNativeView() } ) ``` ## 说明 - `DuooomiBleRuntime` 负责启动 Expo Brownfield 对应的 RN/JS 运行时 - `DuooomiBleManager` 的大部分命令方法为 `async throws`,例如 `connect`、`bind`、`transferFile` - `scan` / `stopScan` 仍然保持事件监听方式 - `DuooomiBleManager` 也会订阅 `ble/sdk/BleSDK.ts` 中定义的 shared state 并转发给宿主 如果只调用 `DuooomiBleManager` 而没有先启动 `DuooomiBleRuntime`,JS 侧的 `bleSDK.initialize()` 不会执行,消息也不会被处理。