- 增加了wrapper处理原生app的交互

This commit is contained in:
Yudi Xiao
2026-04-08 17:04:29 +08:00
parent 90dcd9605c
commit f9dfde0ace
19 changed files with 1501 additions and 32 deletions

62
wrappers/ios/README.md Normal file
View File

@@ -0,0 +1,62 @@
# 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()` 不会执行,消息也不会被处理。