热更新与整包更新需按场景区分:仅改name等基础字段且未动原生配置可热更新;新增权限、改android:name、升级SDK或uni-app编译器、修改uni_modules原生插件则必须整包更新。
热更新和整包更新不是二选一,而是必须按场景分开走;错用 wgt 更新原生模块或权限,App 会白屏或闪退,且无法回滚。
怎么判断该走热更新还是整包更新
关键看
里改了什么:
只改了
、
、
、
,且没动原生相关配置 → 可走热更新(
)
新增了
权限(如定位、后台运行)、改了
、升级了 SDK 或 uni-app 编译器版本 → 必须整包更新(
/ App Store URL)
改了
里的原生插件(比如集成极光推送、微信登录 SDK)→ 整包更新,热更新不生效
注意:
是纯数字(如
),用于比大小;
(如
)仅作展示,不能直接字符串比较。后端接口返回的也必须是
数值,否则 iOS 侧可能因类型转换失败跳过检测。
热更新 wgt 包生成与校验要点
不要依赖 HBuilderX “发行 → 制作资源升级包” 一键生成——它默认打包根路径不对,容易漏
或错压子目录。
先执行
(或
),输出目录如
进入该目录,确认存在
且其
已更新;再用 zip 命令从该目录**平级打包所有文件**:
重命名为
后,用
检查:第一行必须是
,不是
上传前手动解压校验:打开
,确认
和你期望一致;否则 plus.runtime.install 会静默失败
plus.runtime.install 的 force 参数陷阱
看似省事,但它是双刃剑:
设为
:跳过
校验,哪怕新包
更低也会强行覆盖 → 用户可能降级到有严重 bug 的版本
设为
(默认):要求新包
,否则回调直接进 error → 但错误信息是
,不提示具体原因
真实建议:服务端返回时就带
字段,客户端根据它动态传
;强制更新场景(如旧版 API 已下线)才设
,且必须配合弹窗强提示
另外,
成功后不会自动重启,必须显式调用
;iOS 上若未在
后调用,可能卡在白屏。
整包更新在 iOS 上的实际限制
iOS 无法直接下载安装
,只能跳转 App Store;但 Apple 对跳转链接审核极严:
已被弃用,真机上会 404;必须用
如果 App 还没上架(测试阶段),
为空或无效,
会静默失败,无任何回调
安卓侧不要硬写
,华为、小米、OPPO 等厂商市场 scheme 不统一;稳妥做法是后端返回一个通用跳转页 URL,由 H5 页面做 UA 判断后跳对应商店
最后提醒一句:热更新包体积超过 10MB 就该警觉——说明你误把大图、视频、字体等静态资源打进去了,这会导致低端机安装失败或内存溢出;这些资源该走 CDN 按需加载,而不是塞进 wgt。
manifest.jsonnamedescriptionversionNameversionCode.wgtAndroidandroid:name.apkuni_modulesversionCode102versionName"1.0.2"versionCodemanifest.jsonyarn build:app-plusnpm run build:app-plusdist/build/app-plusmanifest.jsonversionCodezip -r app.wgt . -x "*.DS_Store".wgtunzip -l app.wgt | head -10manifest.jsondist/build/app-plus/manifest.jsonmanifest.jsonversionCodeforce: truetrueversionCodeversionCodefalseversionCode > 当前 versionCode"Install failed: invalid version"mustForce: falseforcetrueplus.runtime.installplus.runtime.restart()plusready.ipaitms-apps://itunes.apple.com/cn/app/id{appleId}https://apps.apple.com/cn/app/id{appleId}appleIdplus.runtime.launchApplicationmarket://