joywayer
|
4a6b1e1631
|
Phase 1.7:BridgeBus 实现 H5↔Native 消息总线 + WKScriptMessageHandler
桥核心的运行时层:把 BridgeProtocol 落到 WKWebView 上,承担 JS → Native
消息分发 + Native → H5 主动调用 + 双向 callback 配对。
- 新增 ylgamehall/Source/Bridge/BridgeBus.swift
- @MainActor final class,BridgeProtocol + WKScriptMessageHandler 双重
conform;init(webView:, controller:) 自动向 controller 注册 WVJBHandler
通道
- JS → Native(userContentController:didReceive:)
- body 兼容单条 dict 与 batch [[dict]]
- 优先识 responseId → 查 pendingCallbacks 派给 Native 端 callback
- 否则按 handlerName 查 handlers,构造异步 responseCallback 闭包,
handler 是 @Sendable async 用独立 Task 执行
- Native → H5(call(_:data:callback:))
- 拼 payload {handlerName, data, callbackId?},base64 后注入
WebViewJavascriptBridge._handleMessageFromObjC('<base64>')
- callback 用 nativeCallbackCounter 递增成 objc_cb_<n> 入
pendingCallbacks,等 JS 响应回收
- sendResponseToJS:拼 {responseId, responseData} 走同一通道
- makeResponseCallback 辅助方法:把多层嵌套闭包拆出来,避免
Swift 6 类型推断在深嵌套 + actor 隔离上 ICE
- 资源生命周期:webView 弱引用避免循环;BridgeBus 由 controller.add(self)
retains,WebView 释放后 controller 一并清空 handler 列表自然 release
- BuildProject 通过,Swift 6 严格并发 0 warning;下一步 Phase 1.8 注入
marcuswestin/WVJB JS 端配套协议即可双向消息打通
|
2026-06-22 00:11:54 +08:00 |
|
joywayer
|
f740274d59
|
Phase 1.6:BridgeProtocol + BridgeData 协议骨架
桥核心的纯类型层,不依赖 WKWebView,便于 Phase 1.7 BridgeBus 实现与
单测注入 mock 都基于此抽象。
- 新增 ylgamehall/Source/Bridge/BridgeProtocol.swift
- protocol BridgeProtocol: AnyObject, Sendable
- register(_:handler:) 注册 H5 → Native handler,重复名覆盖
- call(_:data:callback:) Native → H5 主动调用,callback 可选
- typealias BridgeHandler = @Sendable (BridgeData?, BridgeCallback?)
async -> Void,允许 handler 内部 await
- typealias BridgeCallback = @Sendable (BridgeData?) -> Void
- enum BridgeData: Sendable 六态(string/number/bool/null/array/object),
与 JSON 值同构
- BridgeData JSON 互转:
- init?(jsonObject:) 从 JSONSerialization 输出递归构造;NSNumber
Bool/Double 鉴别用 CFGetTypeID 避免 NSNumber(value:true) 被当 1.0
- var jsonObject: Any 反向,供 evaluateJavaScript 拼 JSON 字符串
- BridgeData 访问语法糖:asString/asInt/asDouble/asBool/asArray/asObject
+ subscript(key:) 对象字段访问 + subscript(index:) 数组访问
- BridgeData 字面量构造:ExpressibleByStringLiteral/IntegerLiteral/
FloatLiteral/BooleanLiteral/ArrayLiteral/DictionaryLiteral,
fixture / handler 代码 ["k": 1, "v": true] 直接构造 .object
- BuildProject 通过,Sendable 全自动派生
|
2026-06-22 00:05:26 +08:00 |
|