- 新增 handleDownloadRequest() 统一下载处理函数 - 导出 download 相关工具函数 - 更新 rn-update 和 rn-xwebview README Co-Authored-By: Claude <noreply@anthropic.com>
143 行
3.8 KiB
Markdown
143 行
3.8 KiB
Markdown
# @xuqm/rn-update
|
||
|
||
XuqmGroup RN SDK 更新模块。提供 App 整包更新检查和 RN 插件热更新能力。
|
||
|
||
## 安装
|
||
|
||
```bash
|
||
yarn add @xuqm/rn-update @react-native-async-storage/async-storage
|
||
```
|
||
|
||
Peer dependencies:`react-native >= 0.76`,`@react-native-async-storage/async-storage >= 1.21.0`
|
||
|
||
## 快速开始
|
||
|
||
```ts
|
||
import { UpdateSDK } from '@xuqm/rn-update'
|
||
|
||
// 注册插件
|
||
UpdateSDK.registerPlugins([
|
||
{ moduleId: 'szyx' },
|
||
{ moduleId: 'miniapp' },
|
||
])
|
||
|
||
// 注入宿主 BundleRuntime
|
||
UpdateSDK.setBundleCallbacks({
|
||
writeBundle: writeBundleFile,
|
||
reloadBundle: loadBundle,
|
||
})
|
||
|
||
// 检查 App 更新
|
||
const info = await UpdateSDK.checkAppUpdate()
|
||
if (info.needsUpdate) {
|
||
await UpdateSDK.downloadAndInstallApk(info.downloadUrl)
|
||
}
|
||
|
||
// 检查插件更新
|
||
const pluginInfo = await UpdateSDK.checkPluginUpdate('szyx')
|
||
if (pluginInfo.needsUpdate) {
|
||
await UpdateSDK.updatePlugin('szyx', { onProgress: setProgress })
|
||
}
|
||
```
|
||
|
||
## API
|
||
|
||
### 插件注册
|
||
|
||
| API | 说明 |
|
||
|-----|------|
|
||
| `UpdateSDK.registerPlugins(plugins)` | 批量注册插件 |
|
||
| `UpdateSDK.registerPlugin(meta)` | 单个注册(向后兼容) |
|
||
| `UpdateSDK.setBundleCallbacks(callbacks)` | 注入宿主写入/重载能力 |
|
||
| `UpdateSDK.getRegisteredPlugins()` | 获取已注册插件列表 |
|
||
|
||
### App 整包更新
|
||
|
||
| API | 说明 |
|
||
|-----|------|
|
||
| `UpdateSDK.checkAppUpdate(bypassIgnore?)` | 检查 App 更新(30 分钟缓存) |
|
||
| `UpdateSDK.downloadApk(info, options?)` | 下载 APK,返回 ArrayBuffer(支持进度回调) |
|
||
| `UpdateSDK.downloadAndInstallApk(url, options?)` | 下载 APK 并调起系统安装器(Android) |
|
||
| `UpdateSDK.openStore(appStoreUrl?, marketUrl?)` | 跳转应用商店 |
|
||
| `UpdateSDK.getAppVersionCode()` | 获取当前 versionCode |
|
||
| `UpdateSDK.getAppVersionName()` | 获取当前 versionName |
|
||
|
||
### 插件热更新
|
||
|
||
| API | 说明 |
|
||
|-----|------|
|
||
| `UpdateSDK.checkPluginUpdate(moduleId)` | 检查插件更新(30 分钟缓存) |
|
||
| `UpdateSDK.downloadPlugin(moduleId, info, options?)` | 下载插件 bundle,返回 JS 源码(支持进度回调) |
|
||
| `UpdateSDK.updatePlugin(moduleId, options?)` | 一步完成:检查 → 下载 → 写文件 → 重载 |
|
||
|
||
### 类型定义
|
||
|
||
```ts
|
||
interface PluginRegistration {
|
||
moduleId: string
|
||
}
|
||
|
||
interface AppUpdateInfo {
|
||
needsUpdate: boolean
|
||
versionName?: string
|
||
versionCode?: number
|
||
downloadUrl?: string
|
||
changeLog?: string
|
||
forceUpdate?: boolean
|
||
appStoreUrl?: string
|
||
marketUrl?: string
|
||
apkHash?: string | null
|
||
}
|
||
|
||
interface PluginUpdateInfo {
|
||
needsUpdate: boolean
|
||
latestVersion: string
|
||
currentVersion: string
|
||
downloadUrl: string
|
||
md5: string
|
||
minCommonVersion: string
|
||
note: string
|
||
forceUpdate?: boolean
|
||
}
|
||
|
||
interface CachedRnBundle {
|
||
moduleId: string
|
||
version: string
|
||
md5: string
|
||
downloadedAt: string
|
||
source: string
|
||
}
|
||
|
||
type UpdateDownloadProgress = {
|
||
bytesDownloaded: number
|
||
totalBytes: number
|
||
/** 0-100 */
|
||
percent: number
|
||
}
|
||
```
|
||
|
||
### 下载进度回调
|
||
|
||
`downloadApk()` 和 `downloadPlugin()` 支持 `onProgress` 回调,使用 `fetch + ReadableStream` 实现流式进度计算:
|
||
|
||
```ts
|
||
// 下载 APK 带进度
|
||
const buffer = await UpdateSDK.downloadApk(info, {
|
||
onProgress: ({ bytesDownloaded, totalBytes, percent }) => {
|
||
console.log(`下载进度: ${percent}% (${bytesDownloaded}/${totalBytes})`)
|
||
},
|
||
})
|
||
|
||
// 下载插件 bundle 带进度
|
||
const source = await UpdateSDK.downloadPlugin('szyx', pluginInfo, {
|
||
onProgress: ({ percent }) => setProgress(percent),
|
||
})
|
||
```
|
||
|
||
## 工作原理
|
||
|
||
- 版本号由 SDK 自动从本地 AsyncStorage 缓存读取,首次为 `0.0.0`
|
||
- 更新检查结果缓存 30 分钟(TTL),避免频繁请求
|
||
- `updatePlugin()` 内部自动完成:`checkPluginUpdate` → `fetch(downloadUrl)` → AsyncStorage 缓存 → `writeBundle` → `reloadBundle`
|
||
- `silent: true` 时跳过 `reloadBundle`,下次启动生效
|