Skip to content

应用更新 ​

H5安卓苹果鸿蒙微信小程序其它小程序
-√√√--

只支持 uni-app x 蒸汽模式 的 App。非蒸汽模式调用会直接报错。

平台热更新(wgt)整包说明
Android√√整包安装 apk。非强制更新可在通知栏看下载进度
iOS√√整包跳转 App Store
鸿蒙-√不支持 wgt,整包跳转华为应用市场

安装 ​

终端在项目根目录下执行(创建项目时已选择该模块可跳过)

bash
fc-uniapp-x i update

装好后即可使用,不用再手动初始化。

1. 配置检查地址 ​

打开 modules/update/index.ts,填自己的检查接口:

ts
import type { FCTypeUpdateConfig } from '@/fcuni/types'

export const updateConfig : FCTypeUpdateConfig = {
	checkURL: 'https://your-server.com/api/check-update',
	headers: { 'Authorization': 'Bearer xxx' },
	method: 'GET'
}

method 默认 GET。改成 POST 时,下面这些参数会放进 body,否则放在 query 上:

参数说明
appId应用 appid
appVersion当前应用版本(manifest 的 versionName)
appWgtVersion已安装的 wgt 版本;没装过则与 appVersion 相同

有没有更新由服务端判断。无更新时接口体返回 null(或经下面的解析后得到 null)。

后端包了一层 { code, data } 时,在同一份配置里加上:

ts
responseSuccess: (response) => {
	const body = response.data as { code?: number } | null
	return response.statusCode == 200 && (body?.code == null || body.code == 0)
},
responseParser: (raw) => {
	const body = raw as { data?: any }
	return body?.data ?? null
}

responseSuccess 返回 false 表示检查失败。responseParser 返回 null 表示已是最新;返回了 version 但没有 url 也会当成失败。

2. 服务端返回 ​

有更新时返回:

json
{
  "version": "1.2.3",
  "url": "https://cdn.example.com/app.wgt",
  "type": "wgt",
  "title": "v1.2.3 上线啦",
  "contents": "更新说明,用 \\n 或 | 分行",
  "isMandatory": false,
  "isSilent": false,
  "sha256": "abc123...",
  "size": "30 MB"
}
字段必填说明
version是这次要更新到的版本号
url是下载地址,或商店跳转地址。不能为空
type是wgt 热更新,native_app 整包
isMandatory否true 时不能关弹窗,也不能稍后再说
isSilent否true 时下载完自动安装并重启
title否弹窗标题,默认「更新日志」
contents否更新说明
sha256wgt 必填安装前校验,不一致会拒绝安装
size否展示用,例如 30 MB

url 以 .wgt 结尾走热更新;Android 上以 .apk 结尾走安装包。iOS、鸿蒙整包把 url 设成商店地址(如 itms-apps://、华为应用市场链接),弹窗里点按钮会跳过去。

字段用驼峰或下划线都可以,例如 isMandatory 和 is_mandatory。

3. 在页面里调用 ​

在需要提示更新的地方调用,例如设置页,或启动后的首页:

ts
FC.Update.checkAndShow().catch((err) => {
	uni.showModal({ title: '更新失败', content: `${err}`, showCancel: false })
})

只检查、先不弹窗:

ts
FC.Update.check().then((event) => {
	if (event.hasUpdate) {
		FC.Update.showDialog()
	}
}).catch((err) => {
	uni.showModal({ title: '检查更新失败', content: `${err}`, showCancel: false })
})

没有更新不会进 catch,hasUpdate 为 false。catch 只表示检查失败,例如网络错误或返回内容不对。

调试页:pages/base/update.uvue。

4. 改弹窗 ​

文案和样式改 components/fc-dialog/update.uvue。

  • 文案在文件里的 DEFAULT_TEXTS,或用 FC.i18n.t()
  • 这个页面已经写进 pages.json,不要删、不要改路径
  • isMandatory 为 true 时,点蒙层和「稍后再说」都关不掉

wgt 热更新需要自定义基座或云端打包。标准基座只能看 Android 整包安装。