- 新增 XuqmGroup React Native SDK 使用文档,包含安装、初始化、HTTP客户端、IM模块、推送模块、版本管理等功能说明 - 添加 Android Gradle 发版任务脚本,支持构建发布 APK 并上传到更新服务 - 添加 HarmonyOS hvigorw 发版任务脚本,支持 HAP 包构建和上传功能 - 实现多平台版本检查、自动重连、灰度发布等发版流程自动化 - 集成商店提交、定时发布、Webhook 回调等发布后处理功能
7.4 KiB
7.4 KiB
React Native SDK 接入指南
包名:@xuqm/rn-sdk · 版本:0.3.x(内部基础包,业务方不直接引用)
注意:
rn-sdk作为内部基础包存在,业务方正常接入时使用@xuqm/rn-common和各业务模块即可。
功能模块
| 包 | 功能 |
|---|---|
@xuqm/rn-common |
初始化、网络、设备信息,可独立使用 |
@xuqm/rn-im |
单聊、群聊、消息收发、本地 DB(WatermelonDB) |
@xuqm/rn-push |
推送设备 Token 上报 |
@xuqm/rn-update |
App 版本检查、RN Bundle 热更新 |
@xuqm/rn-sdk |
内部基础包,随 IM / Push / Update 自动安装,不建议业务方直接引用 |
安装
在项目根目录创建 .npmrc:
@xuqm:registry=https://nexus.xuqinmin.com/repository/npm/
只使用基础能力时,直接安装 rn-common,不会带入 IM / Push / Update:
yarn add @xuqm/rn-common
按需安装模块时,rn-im / rn-push / rn-update 都会自动带上 rn-common 和 rn-sdk:
yarn add @xuqm/rn-common @xuqm/rn-im
rn-sdk 不作为业务方直接安装入口;它会随着 rn-im / rn-push / rn-update 自动进入依赖树。
快速接入(当前 v0.3.x)
1. 初始化
初始化只需传入 appKey,平台地址由 SDK 内置,开发者无需额外配置。
import { XuqmSDK } from '@xuqm/rn-common'
// App 入口(如 App.tsx 的顶层)
await XuqmSDK.initialize({
appKey: 'your_app_key', // 在租户平台创建应用后获得
logLevel: __DEV__ ? 'debug' : 'warn', // 可选
})
SDK 内部自动处理服务器地址、WebSocket 连接、文件服务等配置,开发者无需关心。
2. IM 登录
import { ImSDK } from '@xuqm/rn-im'
// 登录(userId + 用户信息)
// v0.3.x:传入用户信息,本地 DB 按 userId 自动隔离
await ImSDK.login('user_001', 'nickname', 'https://avatar.url')
// 推荐提前在您的服务端生成 UserSig(v0.4.0 正式采用)
// const userSig = await yourApi.getUserSig(userId)
// await ImSDK.login('user_001', userSig)
3. 消息收发
// 监听实时消息
ImSDK.addEventListener('message', (msg) => {
console.log('收到消息:', msg.msgType, msg.content)
})
// 发送文本消息
const msg = await ImSDK.sendMessage(
'user_002', // toId
'SINGLE', // chatType: 'SINGLE' | 'GROUP'
'TEXT', // msgType
'Hello!' // content
)
// 发送图片(自动上传到 file-service)
const msg = await ImSDK.sendImageMessage(
'user_002', 'SINGLE',
'/path/to/image.jpg', // 本地 URI
800, 600 // 宽高(可选)
)
// 获取历史消息(单聊)
const history = await ImSDK.fetchHistory('user_002', page, size)
// 获取群历史消息
const groupHistory = await ImSDK.fetchGroupHistory('group_xxx', page, size)
4. 会话列表
// 订阅会话变化
const unsub = ImSDK.subscribeConversations((conversations) => {
// conversations: ConversationData[]
console.log(conversations)
})
// 置顶会话
await ImSDK.setConversationPinned('user_002', 'SINGLE', true)
// 免打扰
await ImSDK.setConversationMuted('group_xxx', 'GROUP', true)
// 标记已读
await ImSDK.markRead('user_002')
5. 群组管理
// 创建群组
const group = await ImSDK.createGroup('项目讨论', ['user_002', 'user_003'])
// 群组列表(仅返回当前用户所在的群)
const groups = await ImSDK.listGroups()
// 添加成员
await ImSDK.addGroupMember('group_xxx', 'user_004')
// 移除成员(需要管理员权限)
await ImSDK.removeGroupMember('group_xxx', 'user_004')
// 退出群聊
await ImSDK.leaveGroup('group_xxx')
6. 好友关系
// 好友列表
const friends = await ImSDK.listFriends()
// 添加好友(双向)
await ImSDK.addFriend('user_002')
// 删除好友(双向)
await ImSDK.removeFriend('user_002')
7. 消息搜索(本地)
import { ImSDK } from '@xuqm/rn-im'
import type { MessageSearchParams } from '@xuqm/rn-im'
const params: MessageSearchParams = {
keyword: '会议', // 关键词搜索
toId: 'user_002', // 限定会话(可选)
chatType: 'SINGLE', // 限定类型(可选)
msgTypes: ['TEXT'], // 限定消息类型(可选)
limit: 20,
}
const results = await ImSDK.searchMessages(params)
8. 推送 SDK
import { PushSDK } from '@xuqm/rn-push'
// 初始化并注册设备(登录后调用)
await PushSDK.initialize({ userId: 'user_001' })
9. 版本更新 SDK
import { UpdateSDK } from '@xuqm/rn-update'
// 检查 App 原生更新
const appUpdate = await UpdateSDK.checkAppUpdate()
if (appUpdate?.needsUpdate) {
console.log('新版本:', appUpdate.versionName)
// Linking.openURL(appUpdate.downloadUrl)
}
// 检查 RN Bundle 热更新
const rnUpdate = await UpdateSDK.checkRnUpdate('your_module_id')
if (rnUpdate?.needsUpdate) {
await UpdateSDK.downloadAndApplyBundle(rnUpdate)
}
10. 断开连接
ImSDK.disconnect()
TypeScript 类型参考
// 消息
interface ImMessage {
id: string
fromId: string
toId: string
chatType: 'SINGLE' | 'GROUP'
msgType: 'TEXT' | 'IMAGE' | 'AUDIO' | 'VIDEO' | 'FILE' |
'LOCATION' | 'NOTIFY' | 'CUSTOM' | 'RICH_TEXT' |
'CALL_AUDIO' | 'CALL_VIDEO' | 'FORWARD' | 'REVOKED'
content: string // JSON 字符串,结构按 msgType 不同
status: 'SENDING' | 'SENT' | 'DELIVERED' | 'READ' | 'FAILED' | 'REVOKED'
createdAt: number // Unix 毫秒
}
// 会话
interface ConversationData {
targetId: string
chatType: 'SINGLE' | 'GROUP'
lastMsgContent: string
lastMsgType: string
lastMsgTime: number
unreadCount: number
isMuted: boolean
isPinned: boolean
}
// 群组
interface ImGroup {
id: string
name: string
creatorId: string
memberIds: string // JSON 数组字符串
adminIds: string
createdAt: number
}
迁移指南(v0.3.x → v0.4.0)
v0.4.0 预计改动(Breaking Changes):
// 初始化
- await XuqmSDK.initialize({ appKey: 'xxx', /* 平台地址参数已移除 */ })
+ await XuqmSDK.initialize({ appKey: 'xxx' }) // 平台地址内置,无需传入
// IM 登录(改为 UserSig 鉴权,密码不再传入 SDK)
- await ImSDK.login(userId, nickname, avatar, dbName)
+ const userSig = await yourServer.getUserSig(userId) // 您的服务端签发
+ await ImSDK.login(userId, userSig, { nickname, avatar })
// dbName 自动由 appKey + userId 派生,无需传入
// loginWithToken 废弃
- await ImSDK.loginWithToken(userId, token, dbName)
+ // 统一使用 login(userId, userSig)
UserSig 生成方式见安全设计文档。
常见问题
Q: 如何获取 appKey? 在 租户平台 注册账号后,创建应用即可获得 AppKey。
Q: 为什么不需要传平台地址参数? XuqmGroup 是托管平台,服务地址统一管理,与腾讯云 IM 等平台的设计一致,开发者只需关心业务逻辑。
Q: UserSig 是什么?(v0.4.0) UserSig 是您的业务服务端用 AppSecret 为用户签发的安全凭证,有效期可配置。AppSecret 绝不下发到客户端。
Q: 本地消息存储在哪里?
使用 WatermelonDB(SQLite),按 appKey + userId 自动隔离,多账号切换安全。