@hd-front-end/jsbridge-sdk 1.0.2 → 1.0.4
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +4 -2
- package/dist/index.d.ts +201 -2
- package/dist/index.esm.js +444 -1
- package/dist/index.esm.js.map +1 -1
- package/dist/index.js +446 -0
- package/dist/index.js.map +1 -1
- package/dist/index.umd.js +446 -0
- package/dist/index.umd.js.map +1 -1
- package/docs/00-/351/241/271/347/233/256/346/246/202/350/247/210.md +282 -0
- package/docs/01-/346/236/266/346/236/204/350/256/276/350/256/241.md +623 -0
- package/docs/02-/346/212/200/346/234/257/345/256/236/347/216/260.md +867 -0
- package/docs/03-API/344/275/277/347/224/250/346/226/207/346/241/243.md +1104 -0
- package/docs/04-/346/265/213/350/257/225/346/226/271/346/241/210.md +360 -0
- package/docs/05-/350/277/201/347/247/273/346/214/207/345/215/227.md +181 -0
- package/docs/06-/346/236/266/346/236/204/345/233/276/351/233/206.md +738 -0
- package/docs/07-/346/226/260/346/241/245/346/216/245/346/226/271/346/263/225/346/211/251/345/261/225/350/257/264/346/230/216.md +139 -0
- package/docs/CODE_REVIEW.md +65 -0
- package/docs/EVALUATION.md +72 -0
- package/docs/README.md +258 -0
- package/docs//345/205/263/351/224/256/351/227/256/351/242/230/350/247/243/347/255/224.md +495 -0
- package/docs//346/226/207/346/241/243/346/225/264/345/220/210/350/257/264/346/230/216.md +265 -0
- package/docs//346/233/264/346/226/260/346/227/245/345/277/227.md +669 -0
- package/docs//347/224/237/344/272/247/347/272/247-/345/277/253/351/200/237/345/274/200/345/247/213-v2.md +673 -0
- package/docs//347/224/237/344/272/247/347/272/247-/346/236/266/346/236/204/350/256/276/350/256/241-v2.md +730 -0
- package/docs//350/256/276/350/256/241/347/220/206/345/277/265/350/257/264/346/230/216.md +438 -0
- package/package.json +3 -2
|
@@ -0,0 +1,623 @@
|
|
|
1
|
+
# JSBridge SDK 架构设计(生产级 v2)
|
|
2
|
+
|
|
3
|
+
> **架构设计思路和接口定义(不含完整代码)**
|
|
4
|
+
|
|
5
|
+
## 1. 设计目标
|
|
6
|
+
|
|
7
|
+
设计一个**生产可用**的 JSBridge SDK,实现 H5 与原生应用的高效通信。
|
|
8
|
+
|
|
9
|
+
### 核心原则
|
|
10
|
+
|
|
11
|
+
- **职责单一**:SDK 聚焦于 bridge API
|
|
12
|
+
- **统一日志**:监控和业务日志都通过原生 log
|
|
13
|
+
- **双平台兼容**:自动兼容 Android 和 iOS
|
|
14
|
+
- **稳定可观测**:完善的错误处理和监控
|
|
15
|
+
|
|
16
|
+
### 两个目的
|
|
17
|
+
|
|
18
|
+
1. ✅ **监控 SDK 稳定性** - SDK 自动记录并上报
|
|
19
|
+
2. ✅ **提供日志能力** - 子应用可上传日志
|
|
20
|
+
|
|
21
|
+
## 2. 整体架构
|
|
22
|
+
|
|
23
|
+
### 2.1 三层架构
|
|
24
|
+
|
|
25
|
+
```
|
|
26
|
+
┌─────────────────────────────────────┐
|
|
27
|
+
│ 子应用层 │
|
|
28
|
+
│ - 直接使用 SDK API │
|
|
29
|
+
│ - 调用 JSBridge.log.info(...) │
|
|
30
|
+
│ - 可选封装适配层(自己决定) │
|
|
31
|
+
└─────────────────────────────────────┘
|
|
32
|
+
↓
|
|
33
|
+
┌─────────────────────────────────────┐
|
|
34
|
+
│ SDK 层 │
|
|
35
|
+
│ │
|
|
36
|
+
│ ┌─────────────────────────────┐ │
|
|
37
|
+
│ │ 核心通信(Bridge) │ │
|
|
38
|
+
│ │ - 平台检测 │ │
|
|
39
|
+
│ │ - Android/iOS 兼容 │ │
|
|
40
|
+
│ │ - 超时处理 │ │
|
|
41
|
+
│ └─────────────────────────────┘ │
|
|
42
|
+
│ │
|
|
43
|
+
│ ┌─────────────────────────────┐ │
|
|
44
|
+
│ │ API 层 │ │
|
|
45
|
+
│ │ - device/media/router │ │
|
|
46
|
+
│ │ - storage/system │ │
|
|
47
|
+
│ │ - log ← 新增 │ │
|
|
48
|
+
│ └─────────────────────────────┘ │
|
|
49
|
+
│ │
|
|
50
|
+
│ ┌─────────────────────────────┐ │
|
|
51
|
+
│ │ 监控层(Monitor) │ │
|
|
52
|
+
│ │ - 性能监控 │ │
|
|
53
|
+
│ │ - 通过 log 上报 ← v2 │ │
|
|
54
|
+
│ └─────────────────────────────┘ │
|
|
55
|
+
│ │
|
|
56
|
+
│ ┌─────────────────────────────┐ │
|
|
57
|
+
│ │ Debug 层 │ │
|
|
58
|
+
│ │ - vconsole 集成 │ │
|
|
59
|
+
│ │ - 调用追踪 │ │
|
|
60
|
+
│ └─────────────────────────────┘ │
|
|
61
|
+
└─────────────────────────────────────┘
|
|
62
|
+
↓
|
|
63
|
+
┌─────────────────────────────────────┐
|
|
64
|
+
│ 原生层 │
|
|
65
|
+
│ - Android: InjectJavascript │
|
|
66
|
+
│ - iOS: iframe 触发 │
|
|
67
|
+
│ - 统一 log handler │
|
|
68
|
+
│ - LogUtil 写入日志文件 │
|
|
69
|
+
│ - 统一上传到服务器 │
|
|
70
|
+
└─────────────────────────────────────┘
|
|
71
|
+
```
|
|
72
|
+
|
|
73
|
+
### 2.2 核心模块
|
|
74
|
+
|
|
75
|
+
| 模块 | 职责 | 代码量 |
|
|
76
|
+
|------|------|--------|
|
|
77
|
+
| **Bridge** | 核心通信、平台兼容 | 200 行 |
|
|
78
|
+
| **Monitor** | 性能监控、通过 log 上报 | 180 行 |
|
|
79
|
+
| **Debug** | vconsole、调用追踪 | 150 行 |
|
|
80
|
+
| **Log API** | 提供日志上传能力 | 80 行 |
|
|
81
|
+
| **device/media/router等** | 各类 API | 320 行 |
|
|
82
|
+
| **types** | 类型定义 | 120 行 |
|
|
83
|
+
| **index** | 统一导出 | 100 行 |
|
|
84
|
+
| **总计** | | **~1150 行** |
|
|
85
|
+
|
|
86
|
+
## 3. 核心模块设计
|
|
87
|
+
|
|
88
|
+
### 3.1 Bridge 核心通信层
|
|
89
|
+
|
|
90
|
+
#### 设计职责
|
|
91
|
+
|
|
92
|
+
- 平台检测:Android/iOS/Unknown
|
|
93
|
+
- 平台特定初始化
|
|
94
|
+
- 统一的 call/register 接口
|
|
95
|
+
- 超时处理
|
|
96
|
+
|
|
97
|
+
#### 关键接口
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
enum Platform {
|
|
101
|
+
Android = 'android',
|
|
102
|
+
iOS = 'ios',
|
|
103
|
+
Unknown = 'unknown'
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
class Bridge {
|
|
107
|
+
// 初始化(平台特定)
|
|
108
|
+
async init(): Promise<boolean>
|
|
109
|
+
|
|
110
|
+
// 调用原生方法
|
|
111
|
+
call<T>(method: string, data?: any): Promise<T>
|
|
112
|
+
|
|
113
|
+
// 注册方法供原生调用
|
|
114
|
+
register(method: string, handler: Function): void
|
|
115
|
+
|
|
116
|
+
// 获取平台
|
|
117
|
+
getPlatform(): Platform
|
|
118
|
+
|
|
119
|
+
// 是否在原生 App 中
|
|
120
|
+
inApp(): boolean
|
|
121
|
+
}
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
#### 平台检测逻辑
|
|
125
|
+
|
|
126
|
+
```typescript
|
|
127
|
+
private detectPlatform(): void {
|
|
128
|
+
const ua = navigator.userAgent
|
|
129
|
+
// Android: /SoaAndroid|HDApp.*Android/i
|
|
130
|
+
// iOS: /iPhone|iPad|iPod/i && /HDApp/i
|
|
131
|
+
// Unknown: 其他
|
|
132
|
+
}
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
#### 初始化逻辑
|
|
136
|
+
|
|
137
|
+
```typescript
|
|
138
|
+
// Android: window.InjectJavascript.init()
|
|
139
|
+
// iOS: 创建 iframe,src = 'https://__bridge_loaded__'
|
|
140
|
+
// 超时: 10 秒
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
### 3.2 Monitor 监控层
|
|
144
|
+
|
|
145
|
+
#### 设计职责
|
|
146
|
+
|
|
147
|
+
- 自动记录 API 调用性能
|
|
148
|
+
- 自动记录错误信息
|
|
149
|
+
- 定时通过 log API 上报
|
|
150
|
+
- 错误立即通过 log API 上报
|
|
151
|
+
|
|
152
|
+
#### 关键接口
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
interface ApiCallRecord {
|
|
156
|
+
api: string
|
|
157
|
+
platform: string
|
|
158
|
+
startTime: number
|
|
159
|
+
duration?: number
|
|
160
|
+
success: boolean
|
|
161
|
+
error?: string
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
interface PerformanceStats {
|
|
165
|
+
totalCalls: number
|
|
166
|
+
successCalls: number
|
|
167
|
+
failedCalls: number
|
|
168
|
+
avgDuration: number
|
|
169
|
+
maxDuration: number
|
|
170
|
+
minDuration: number
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
class Monitor {
|
|
174
|
+
// 记录调用
|
|
175
|
+
recordStart(api: string, platform: string, params?: any): ApiCallRecord
|
|
176
|
+
recordEnd(record: ApiCallRecord, success: boolean, result?, error?): void
|
|
177
|
+
|
|
178
|
+
// 上报(通过 log API)
|
|
179
|
+
async report(): Promise<void>
|
|
180
|
+
|
|
181
|
+
// 立即上报错误
|
|
182
|
+
async reportError(api: string, error: string, detail?): Promise<void>
|
|
183
|
+
|
|
184
|
+
// 查询统计
|
|
185
|
+
getStats(api?: string): PerformanceStats | Map<string, PerformanceStats>
|
|
186
|
+
getRecords(limit?: number): ApiCallRecord[]
|
|
187
|
+
}
|
|
188
|
+
```
|
|
189
|
+
|
|
190
|
+
#### 上报机制
|
|
191
|
+
|
|
192
|
+
**v2 版本(正确)**:
|
|
193
|
+
```typescript
|
|
194
|
+
// 定时上报
|
|
195
|
+
await bridge.call('log', {
|
|
196
|
+
tag: 'JSBridge-Monitor',
|
|
197
|
+
level: 'INFO',
|
|
198
|
+
message: `[MONITOR] ${JSON.stringify(data)}`
|
|
199
|
+
})
|
|
200
|
+
|
|
201
|
+
// 错误立即上报
|
|
202
|
+
await bridge.call('log', {
|
|
203
|
+
tag: 'JSBridge-Monitor',
|
|
204
|
+
level: 'ERROR',
|
|
205
|
+
message: `[ERROR] ${JSON.stringify(errorData)}`
|
|
206
|
+
})
|
|
207
|
+
```
|
|
208
|
+
|
|
209
|
+
### 3.3 Debug 调试层
|
|
210
|
+
|
|
211
|
+
#### 设计职责
|
|
212
|
+
|
|
213
|
+
- vconsole 集成
|
|
214
|
+
- 调用追踪
|
|
215
|
+
- 日志记录
|
|
216
|
+
- 开发/生产分离
|
|
217
|
+
|
|
218
|
+
#### 关键接口
|
|
219
|
+
|
|
220
|
+
```typescript
|
|
221
|
+
interface DebugConfig {
|
|
222
|
+
enabled: boolean
|
|
223
|
+
useVConsole?: boolean
|
|
224
|
+
logLevel?: 'debug' | 'info' | 'warn' | 'error'
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
class Debug {
|
|
228
|
+
// 初始化 vconsole
|
|
229
|
+
async initVConsole(): Promise<void>
|
|
230
|
+
|
|
231
|
+
// 记录日志
|
|
232
|
+
log(level: string, message: string, data?: any): void
|
|
233
|
+
|
|
234
|
+
// 追踪 API 调用
|
|
235
|
+
trace(api: string, params?: any): void
|
|
236
|
+
|
|
237
|
+
// 查询日志
|
|
238
|
+
getLogs(level?: string, limit?: number): any[]
|
|
239
|
+
}
|
|
240
|
+
```
|
|
241
|
+
|
|
242
|
+
### 3.4 Log API 层(新增)
|
|
243
|
+
|
|
244
|
+
#### 设计职责
|
|
245
|
+
|
|
246
|
+
- 提供简单的日志 API
|
|
247
|
+
- 将日志写入原生
|
|
248
|
+
- 支持不同级别
|
|
249
|
+
|
|
250
|
+
#### 关键接口
|
|
251
|
+
|
|
252
|
+
```typescript
|
|
253
|
+
enum LogLevel {
|
|
254
|
+
DEBUG = 'DEBUG',
|
|
255
|
+
INFO = 'INFO',
|
|
256
|
+
WARN = 'WARN',
|
|
257
|
+
ERROR = 'ERROR'
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
interface LogRequest {
|
|
261
|
+
tag?: string
|
|
262
|
+
level: LogLevel
|
|
263
|
+
message: string
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
// 通用方法
|
|
267
|
+
async function writeLog(request: LogRequest): Promise<void>
|
|
268
|
+
|
|
269
|
+
// 便捷方法
|
|
270
|
+
const log = {
|
|
271
|
+
debug: (message: string, tag?: string) => Promise<void>
|
|
272
|
+
info: (message: string, tag?: string) => Promise<void>
|
|
273
|
+
warn: (message: string, tag?: string) => Promise<void>
|
|
274
|
+
error: (message: string, tag?: string) => Promise<void>
|
|
275
|
+
}
|
|
276
|
+
```
|
|
277
|
+
|
|
278
|
+
## 4. 数据流设计
|
|
279
|
+
|
|
280
|
+
### 4.1 API 调用流程
|
|
281
|
+
|
|
282
|
+
```
|
|
283
|
+
子应用调用
|
|
284
|
+
↓
|
|
285
|
+
SDK API 层
|
|
286
|
+
↓
|
|
287
|
+
Monitor 记录开始
|
|
288
|
+
↓
|
|
289
|
+
Debug 追踪
|
|
290
|
+
↓
|
|
291
|
+
Bridge 调用
|
|
292
|
+
↓
|
|
293
|
+
原生处理
|
|
294
|
+
↓
|
|
295
|
+
Bridge 返回
|
|
296
|
+
↓
|
|
297
|
+
Monitor 记录结束
|
|
298
|
+
↓
|
|
299
|
+
Debug 记录日志
|
|
300
|
+
↓
|
|
301
|
+
返回给子应用
|
|
302
|
+
```
|
|
303
|
+
|
|
304
|
+
### 4.2 监控上报流程
|
|
305
|
+
|
|
306
|
+
```
|
|
307
|
+
API 调用(自动记录)
|
|
308
|
+
↓
|
|
309
|
+
Monitor 记录性能数据
|
|
310
|
+
↓
|
|
311
|
+
定时任务(1 分钟)
|
|
312
|
+
↓
|
|
313
|
+
Monitor.report()
|
|
314
|
+
↓
|
|
315
|
+
调用 bridge.call('log', {...})
|
|
316
|
+
↓
|
|
317
|
+
原生 LogUtil 写入日志文件
|
|
318
|
+
↓
|
|
319
|
+
原生统一上传到服务器
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
### 4.3 日志上传流程
|
|
323
|
+
|
|
324
|
+
```
|
|
325
|
+
子应用调用 JSBridge.log.info(...)
|
|
326
|
+
↓
|
|
327
|
+
SDK log API
|
|
328
|
+
↓
|
|
329
|
+
调用 bridge.call('log', {...})
|
|
330
|
+
↓
|
|
331
|
+
原生 LogUtil 写入日志文件
|
|
332
|
+
↓
|
|
333
|
+
原生统一上传到服务器
|
|
334
|
+
```
|
|
335
|
+
|
|
336
|
+
### 4.4 错误上报流程(立即)
|
|
337
|
+
|
|
338
|
+
```
|
|
339
|
+
API 调用失败
|
|
340
|
+
↓
|
|
341
|
+
Monitor 捕获错误
|
|
342
|
+
↓
|
|
343
|
+
Monitor.reportError()
|
|
344
|
+
↓
|
|
345
|
+
立即调用 bridge.call('log', {level: 'ERROR', ...})
|
|
346
|
+
↓
|
|
347
|
+
原生 LogUtil 写入(ERROR 级别)
|
|
348
|
+
↓
|
|
349
|
+
原生立即上传 ERROR 日志
|
|
350
|
+
```
|
|
351
|
+
|
|
352
|
+
## 5. 接口设计
|
|
353
|
+
|
|
354
|
+
### 5.1 初始化接口
|
|
355
|
+
|
|
356
|
+
```typescript
|
|
357
|
+
interface JSBridgeConfig {
|
|
358
|
+
debug?: Partial<DebugConfig>
|
|
359
|
+
monitor?: Partial<MonitorConfig>
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
interface MonitorConfig {
|
|
363
|
+
enabled: boolean
|
|
364
|
+
autoReport?: boolean // 自动上报
|
|
365
|
+
reportInterval?: number // 上报间隔(ms)
|
|
366
|
+
maxCacheSize?: number // 最大缓存条数
|
|
367
|
+
logTag?: string // 日志 TAG
|
|
368
|
+
}
|
|
369
|
+
|
|
370
|
+
// 使用示例
|
|
371
|
+
await init({
|
|
372
|
+
debug: {
|
|
373
|
+
enabled: isDev,
|
|
374
|
+
useVConsole: isDev
|
|
375
|
+
},
|
|
376
|
+
monitor: {
|
|
377
|
+
enabled: !isDev,
|
|
378
|
+
autoReport: !isDev,
|
|
379
|
+
reportInterval: 60000,
|
|
380
|
+
logTag: 'JSBridge-Monitor'
|
|
381
|
+
}
|
|
382
|
+
})
|
|
383
|
+
```
|
|
384
|
+
|
|
385
|
+
### 5.2 Bridge API 接口
|
|
386
|
+
|
|
387
|
+
```typescript
|
|
388
|
+
// 设备能力
|
|
389
|
+
JSBridge.scan(options?: ScanOptions): Promise<ScanResult>
|
|
390
|
+
JSBridge.vibrate(duration?: number): Promise<void>
|
|
391
|
+
JSBridge.getDeviceInfo(): Promise<DeviceInfo>
|
|
392
|
+
JSBridge.getNetworkType(): Promise<string>
|
|
393
|
+
|
|
394
|
+
// 媒体能力
|
|
395
|
+
JSBridge.chooseMedia(options: MediaOptions): Promise<MediaResult>
|
|
396
|
+
JSBridge.uploadFile(options: UploadOptions): Promise<UploadResult>
|
|
397
|
+
JSBridge.previewImage(options: PreviewOptions): Promise<void>
|
|
398
|
+
JSBridge.getImageInfo(options: ImageInfoOptions): Promise<ImageInfo>
|
|
399
|
+
JSBridge.bluetoothPrint(options: PrintOptions): Promise<PrintResult>
|
|
400
|
+
|
|
401
|
+
// 路由能力
|
|
402
|
+
JSBridge.setNavigationBar(options: NavBarOptions): Promise<void>
|
|
403
|
+
JSBridge.closeWebView(): Promise<void>
|
|
404
|
+
JSBridge.onRoute(handler: RouteHandler): void
|
|
405
|
+
JSBridge.onGetRouteInfo(handler: RouteInfoHandler): void
|
|
406
|
+
JSBridge.notifyRouteChange(data: RouteChangeData): Promise<void>
|
|
407
|
+
|
|
408
|
+
// 存储能力
|
|
409
|
+
JSBridge.getStorage(key?: string): Promise<any>
|
|
410
|
+
JSBridge.setStorage(data: any): Promise<void>
|
|
411
|
+
JSBridge.getAppInfo(): Promise<AppInfo>
|
|
412
|
+
JSBridge.onRefreshStore(handler: RefreshHandler): void
|
|
413
|
+
JSBridge.notifyAppOnload(data: any): Promise<void>
|
|
414
|
+
|
|
415
|
+
// 系统能力
|
|
416
|
+
JSBridge.makePhoneCall(options: PhoneCallOptions): Promise<void>
|
|
417
|
+
JSBridge.onPdaScan(handler: PdaScanHandler): void
|
|
418
|
+
```
|
|
419
|
+
|
|
420
|
+
### 5.3 Log API 接口(新增)
|
|
421
|
+
|
|
422
|
+
```typescript
|
|
423
|
+
// Log API
|
|
424
|
+
JSBridge.log.debug(message: string, tag?: string): Promise<void>
|
|
425
|
+
JSBridge.log.info(message: string, tag?: string): Promise<void>
|
|
426
|
+
JSBridge.log.warn(message: string, tag?: string): Promise<void>
|
|
427
|
+
JSBridge.log.error(message: string, tag?: string): Promise<void>
|
|
428
|
+
|
|
429
|
+
// 通用方法
|
|
430
|
+
JSBridge.writeLog(request: LogRequest): Promise<void>
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
### 5.4 Monitor API 接口
|
|
434
|
+
|
|
435
|
+
```typescript
|
|
436
|
+
Monitor.getStats(api?: string): PerformanceStats | Map<string, PerformanceStats>
|
|
437
|
+
Monitor.getRecords(limit?: number): ApiCallRecord[]
|
|
438
|
+
Monitor.clear(): void
|
|
439
|
+
Monitor.report(): Promise<void> // 手动上报(通过 log)
|
|
440
|
+
Monitor.reportError(api, error, detail?): Promise<void> // 错误上报
|
|
441
|
+
```
|
|
442
|
+
|
|
443
|
+
### 5.5 Debug API 接口
|
|
444
|
+
|
|
445
|
+
```typescript
|
|
446
|
+
Debug.trace(api: string, params?: any): void
|
|
447
|
+
Debug.getLogs(level?: string, limit?: number): any[]
|
|
448
|
+
Debug.clearLogs(): void
|
|
449
|
+
```
|
|
450
|
+
|
|
451
|
+
## 6. 原生端接口设计
|
|
452
|
+
|
|
453
|
+
### 6.1 Android 端
|
|
454
|
+
|
|
455
|
+
```kotlin
|
|
456
|
+
// 注册 log handler
|
|
457
|
+
webView.registerHandler("log") { data, callback ->
|
|
458
|
+
val request = Gson().fromJson(data, UniLog::class.java)
|
|
459
|
+
// request.tag, request.level, request.message
|
|
460
|
+
|
|
461
|
+
LogUtil.info(request.tag, request.message)
|
|
462
|
+
callback?.invoke(null)
|
|
463
|
+
}
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
### 6.2 iOS 端
|
|
467
|
+
|
|
468
|
+
```swift
|
|
469
|
+
// 注册 log handler
|
|
470
|
+
bridge.registerHandler("log") { data, callback in
|
|
471
|
+
let tag = request["tag"] as? String ?? "JSBridge"
|
|
472
|
+
let level = request["level"] as? String
|
|
473
|
+
let message = request["message"] as? String
|
|
474
|
+
|
|
475
|
+
os_log(.info, log: OSLog(...), "%{public}@", message)
|
|
476
|
+
callback?(nil)
|
|
477
|
+
}
|
|
478
|
+
```
|
|
479
|
+
|
|
480
|
+
## 7. 安全性设计
|
|
481
|
+
|
|
482
|
+
### 7.1 超时机制
|
|
483
|
+
|
|
484
|
+
```typescript
|
|
485
|
+
call<T>(method: string, data?: any): Promise<T> {
|
|
486
|
+
return Promise.race([
|
|
487
|
+
this.callBridge(method, data),
|
|
488
|
+
this.timeout(10000) // 10 秒超时
|
|
489
|
+
])
|
|
490
|
+
}
|
|
491
|
+
```
|
|
492
|
+
|
|
493
|
+
### 7.2 错误处理
|
|
494
|
+
|
|
495
|
+
```typescript
|
|
496
|
+
try {
|
|
497
|
+
const result = await bridge.call(method, data)
|
|
498
|
+
monitor.recordEnd(record, true, result)
|
|
499
|
+
return result
|
|
500
|
+
} catch (error) {
|
|
501
|
+
monitor.recordEnd(record, false, undefined, error.message)
|
|
502
|
+
monitor.reportError(method, error.message) // 立即上报
|
|
503
|
+
throw error
|
|
504
|
+
}
|
|
505
|
+
```
|
|
506
|
+
|
|
507
|
+
## 8. 性能优化
|
|
508
|
+
|
|
509
|
+
### 8.1 代码体积
|
|
510
|
+
|
|
511
|
+
- ✅ 核心代码 ~1150 行
|
|
512
|
+
- ✅ 打包体积 ~20KB
|
|
513
|
+
- ✅ gzip 后 ~7KB
|
|
514
|
+
|
|
515
|
+
### 8.2 运行性能
|
|
516
|
+
|
|
517
|
+
- ✅ 初始化 < 100ms
|
|
518
|
+
- ✅ API 调用 < 50ms
|
|
519
|
+
- ✅ 日志写入 < 10ms(异步)
|
|
520
|
+
|
|
521
|
+
### 8.3 内存优化
|
|
522
|
+
|
|
523
|
+
- ✅ 监控缓存限制(默认 100 条)
|
|
524
|
+
- ✅ Debug 日志限制
|
|
525
|
+
- ✅ 定时清理
|
|
526
|
+
|
|
527
|
+
## 9. 扩展性设计
|
|
528
|
+
|
|
529
|
+
### 9.1 新增 API
|
|
530
|
+
|
|
531
|
+
```typescript
|
|
532
|
+
// 1. 新建 src/api/newFeature.ts
|
|
533
|
+
export async function newFeature(options): Promise<Result> {
|
|
534
|
+
return bridge.call('newFeature', options)
|
|
535
|
+
}
|
|
536
|
+
|
|
537
|
+
// 2. 在 index.ts 中导出
|
|
538
|
+
export const JSBridge = {
|
|
539
|
+
// ... 现有 API
|
|
540
|
+
newFeature
|
|
541
|
+
}
|
|
542
|
+
|
|
543
|
+
// 3. 原生端实现
|
|
544
|
+
webView.registerHandler("newFeature") { data, callback ->
|
|
545
|
+
// 处理逻辑
|
|
546
|
+
callback?.invoke(result)
|
|
547
|
+
}
|
|
548
|
+
```
|
|
549
|
+
|
|
550
|
+
### 9.2 新增监控指标
|
|
551
|
+
|
|
552
|
+
```typescript
|
|
553
|
+
interface PerformanceStats {
|
|
554
|
+
// ... 现有指标
|
|
555
|
+
newMetric: number // 新增指标
|
|
556
|
+
}
|
|
557
|
+
```
|
|
558
|
+
|
|
559
|
+
## 10. 部署架构
|
|
560
|
+
|
|
561
|
+
### 10.1 npm 发布
|
|
562
|
+
|
|
563
|
+
```json
|
|
564
|
+
{
|
|
565
|
+
"name": "@hd-front-end/jsbridge-sdk",
|
|
566
|
+
"version": "2.0.0",
|
|
567
|
+
"main": "dist/index.cjs.js",
|
|
568
|
+
"module": "dist/index.esm.js",
|
|
569
|
+
"types": "dist/types/index.d.ts"
|
|
570
|
+
}
|
|
571
|
+
```
|
|
572
|
+
|
|
573
|
+
### 10.2 子应用集成
|
|
574
|
+
|
|
575
|
+
```typescript
|
|
576
|
+
// 1. 安装
|
|
577
|
+
npm install @hd-front-end/jsbridge-sdk
|
|
578
|
+
|
|
579
|
+
// 2. 初始化
|
|
580
|
+
import { init } from '@hd-front-end/jsbridge-sdk'
|
|
581
|
+
await init({...})
|
|
582
|
+
|
|
583
|
+
// 3. 使用
|
|
584
|
+
import { JSBridge } from '@hd-front-end/jsbridge-sdk'
|
|
585
|
+
await JSBridge.scan()
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
## 11. 设计特点总结
|
|
589
|
+
|
|
590
|
+
### 11.1 v2 关键改进
|
|
591
|
+
|
|
592
|
+
**监控上报机制**:
|
|
593
|
+
- ❌ v1:直接发送 HTTP(错误)
|
|
594
|
+
- ✅ v2:通过 log API 上报(正确)
|
|
595
|
+
|
|
596
|
+
**日志能力**:
|
|
597
|
+
- ❌ v1:没有 log API
|
|
598
|
+
- ✅ v2:提供 log API
|
|
599
|
+
|
|
600
|
+
**统一日志管理**:
|
|
601
|
+
- SDK 监控 + 子应用日志
|
|
602
|
+
- 都通过原生 log handler
|
|
603
|
+
- 原生统一写入和上传
|
|
604
|
+
|
|
605
|
+
### 11.2 设计亮点
|
|
606
|
+
|
|
607
|
+
✅ **职责单一** - SDK 只做原生 API 封装
|
|
608
|
+
✅ **统一日志** - 监控和业务日志统一管理
|
|
609
|
+
✅ **双平台兼容** - 自动兼容 Android/iOS
|
|
610
|
+
✅ **自动监控** - 无感知性能监控
|
|
611
|
+
✅ **易于扩展** - 新增 API 简单
|
|
612
|
+
|
|
613
|
+
## 12. 相关文档
|
|
614
|
+
|
|
615
|
+
- **[00-项目概览.md](./00-项目概览.md)** - 项目概览
|
|
616
|
+
- **[02-技术实现.md](./02-技术实现.md)** - **完整代码实现**
|
|
617
|
+
- **[03-API使用文档.md](./03-API使用文档.md)** - API 详细文档
|
|
618
|
+
- **[06-架构图集.md](./06-架构图集.md)** - 更多架构图
|
|
619
|
+
|
|
620
|
+
---
|
|
621
|
+
|
|
622
|
+
**清晰的架构设计,完整代码见02** 🎯
|
|
623
|
+
|