XuqmGroup-RNSDK/docs/架构总览.md

106 行
3.2 KiB
Markdown

# XuqmGroup RN SDK 架构总览
## 整体架构
```
宿主 AppYiwangxinApp4 等)
└── 初始化方式A: 配置文件自动 / 方式B: 手动 initialize
@xuqm/rn-common (核心层 v0.4.0
├── XuqmSDK.initialize() → 拉取 /api/sdk/config
├── XuqmSDK.setUserInfo() → 通知所有子 SDK订阅者模式
├── api/useApi / usePageApi / apiRequest
├── device设备信息 / 厂商检测)
├── xwebviewJSBridge 桥接控制)
├── ui/toast / alert / confirm
└── logApiUrl / logEnabled从平台配置获取
↓ peerDep / 依赖
子 SDK各自独立
├── @xuqm/rn-update → OTA 热更新 / APK 更新
├── @xuqm/rn-push → 厂商推送peerDep: rn-common
├── @xuqm/rn-im → IM 会话 / 消息peerDep: rn-common
├── @xuqm/rn-xwebview → WebView UI 组件peerDep: rn-common
├── @xuqm/rn-license → 证书授权peerDep: rn-common
└── @xuqm/rn-log → 日志 / 追踪peerDep: rn-common
```
## 依赖关系
```
rn-common (核心,无 SDK 内部依赖)
↑ peerDep
├── rn-update (直接依赖 rn-common
├── rn-push peerDep rn-common
├── rn-im peerDep rn-common + watermelondb
├── rn-xwebview peerDep rn-common + webview + navigation
├── rn-license peerDep rn-common + quick-crypto
└── rn-log peerDep rn-common
```
## 用户状态分发机制
```
XuqmSDK.setUserInfo(info)
├── PushSDK: 检测厂商 → 获取厂商配置 → 注册 token
├── ImSDK: 若 userSig 存在且 imEnabled → 自动登录 WebSocket
├── UpdateSDK: 更新 userId用于定向更新
└── LicenseSDK: 更新用户上下文
XuqmSDK.setUserInfo(null)
├── PushSDK: 解绑 token
├── ImSDK: 断开 WebSocket
└── 其他子 SDK: 清理用户状态
```
各子 SDK 在模块加载时通过 `_registerUserInfoHandler()` 注册处理器,无需 App 手动协调。
## 初始化流程
### 方式 A自动
```
Metro alias → @xuqm/autoinit-config → encrypted .xuqmconfig
↓ import 时触发
autoInit.ts → require('@xuqm/autoinit-config')
↓ 解密PBKDF2 + AES-256-GCM
initWithConfigFile() → initialize({ appKey, platformUrl })
↓ HTTP GET
/api/sdk/config → 返回 { apiUrl, imWsUrl, fileServiceUrl, ... }
```
### 方式 B手动
```
App 代码调用 XuqmSDK.initialize({ appKey })
↓ HTTP GET
/api/sdk/config → 解析平台配置
各子 SDK 就绪(等待 setUserInfo 触发具体功能)
```
## 数据流
```
App 代码
↓ 调用 API
子 SDKupdate/push/im/license/log
↓ 使用 apiRequest()
rn-common http.ts
↓ 附加 Bearer Token + 处理响应
平台服务tenant-service / im-service / push-service / update-service / log-service
```
## 包发布
所有包发布到 Nexus npm 私有仓库:`https://nexus.xuqinmin.com/repository/npm-hosted/`
```bash
# 发布单个包
cd packages/common && npm publish
# 发布所有包
for pkg in common update push im xwebview license log; do
cd packages/$pkg && npm publish && cd ../..
done
```