155 行
3.3 KiB
Markdown
155 行
3.3 KiB
Markdown
|
|
# React Native 版本更新接入指南
|
|||
|
|
|
|||
|
|
**包名**:`@xuqm/rn-update` · **功能**:App 版本检查、RN Bundle 热更新、打开商店
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 1. 安装
|
|||
|
|
|
|||
|
|
```bash
|
|||
|
|
yarn add @xuqm/rn-update
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`rn-update` 会自动依赖 `@xuqm/rn-common` 和 `@xuqm/rn-sdk`。
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 2. App 版本检查
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
import { UpdateSDK } from '@xuqm/rn-update'
|
|||
|
|
|
|||
|
|
const appUpdate = await UpdateSDK.checkAppUpdate()
|
|||
|
|
if (appUpdate.needsUpdate) {
|
|||
|
|
console.log('新版本:', appUpdate.versionName)
|
|||
|
|
console.log('更新日志:', appUpdate.changeLog)
|
|||
|
|
console.log('下载地址:', appUpdate.downloadUrl)
|
|||
|
|
|
|||
|
|
if (appUpdate.forceUpdate) {
|
|||
|
|
// 强制更新
|
|||
|
|
showForceUpdateModal(appUpdate)
|
|||
|
|
} else {
|
|||
|
|
// 可选更新
|
|||
|
|
showOptionalUpdateModal(appUpdate)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
App 版本号自动从原生模块读取,无需手动传入。开发/模拟器环境可调用 `_devSetAppVersion` 覆盖:
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
// 仅限开发环境使用
|
|||
|
|
UpdateSDK._devSetAppVersion(100, '1.0.0')
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 3. 打开商店
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
await UpdateSDK.openStore(appUpdate.appStoreUrl, appUpdate.marketUrl)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
- iOS:打开 `appStoreUrl`
|
|||
|
|
- Android:打开 `marketUrl`
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 4. RN Bundle 热更新
|
|||
|
|
|
|||
|
|
### 4.1 注册插件
|
|||
|
|
|
|||
|
|
在插件 Bundle 的入口文件顶部注册插件元数据:
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
// plugin/index.ts
|
|||
|
|
import { UpdateSDK } from '@xuqm/rn-update'
|
|||
|
|
import meta from './plugin.json'
|
|||
|
|
|
|||
|
|
UpdateSDK.registerPlugin(meta)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
`plugin.json` 示例:
|
|||
|
|
|
|||
|
|
```json
|
|||
|
|
{
|
|||
|
|
"moduleId": "home",
|
|||
|
|
"version": "1.2.3"
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.2 检查热更新
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
const rnUpdate = await UpdateSDK.checkRnUpdate('home')
|
|||
|
|
if (rnUpdate.needsUpdate) {
|
|||
|
|
console.log('最新版本:', rnUpdate.latestVersion)
|
|||
|
|
console.log('下载地址:', rnUpdate.downloadUrl)
|
|||
|
|
console.log('更新说明:', rnUpdate.note)
|
|||
|
|
console.log('最低依赖版本:', rnUpdate.minCommonVersion)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.3 下载并缓存 Bundle
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
// 下载 Bundle 源码
|
|||
|
|
const source = await UpdateSDK.downloadRnBundle(rnUpdate.downloadUrl)
|
|||
|
|
|
|||
|
|
// 缓存到本地
|
|||
|
|
await UpdateSDK.cacheRnBundle('home', rnUpdate.latestVersion, rnUpdate.md5, source)
|
|||
|
|
|
|||
|
|
// 读取已缓存的 Bundle
|
|||
|
|
const cached = await UpdateSDK.getCachedRnBundle('home')
|
|||
|
|
if (cached) {
|
|||
|
|
console.log('缓存版本:', cached.version)
|
|||
|
|
console.log('缓存时间:', cached.downloadedAt)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
### 4.4 获取已注册插件版本
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
const version = UpdateSDK.getRegisteredPluginVersion('home')
|
|||
|
|
console.log('当前运行版本:', version)
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 5. 强制更新处理
|
|||
|
|
|
|||
|
|
当 `appUpdate.forceUpdate` 为 `true` 时,建议业务层:
|
|||
|
|
|
|||
|
|
1. 弹出不可关闭的 Modal
|
|||
|
|
2. 只允许用户点击「立即更新」
|
|||
|
|
3. 调用 `UpdateSDK.openStore()` 跳转商店
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
function showForceUpdateModal(update: AppUpdateInfo) {
|
|||
|
|
// 使用 RN Modal 组件,设置不可取消
|
|||
|
|
Alert.alert(
|
|||
|
|
'发现重要更新',
|
|||
|
|
`当前版本已不可用,请升级至 ${update.versionName}`,
|
|||
|
|
[
|
|||
|
|
{
|
|||
|
|
text: '立即更新',
|
|||
|
|
onPress: () => UpdateSDK.openStore(update.appStoreUrl, update.marketUrl),
|
|||
|
|
},
|
|||
|
|
],
|
|||
|
|
{ cancelable: false }
|
|||
|
|
)
|
|||
|
|
}
|
|||
|
|
```
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
## 6. 多模块统一登录
|
|||
|
|
|
|||
|
|
Update 模块与 IM、Push 模块共享同一套登录态:
|
|||
|
|
|
|||
|
|
```ts
|
|||
|
|
await XuqmSDK.initialize({ appKey: 'your_app_key' })
|
|||
|
|
await XuqmSDK.login({ userId: 'user_001', userSig: 'your_user_sig_jwt' })
|
|||
|
|
// UpdateSDK 在 checkAppUpdate 时自动携带 appId,无需额外登录操作
|
|||
|
|
```
|