Android调用plus.runtime.install安装APK失败的常见原因包括:versionCode非纯数字或未严格升序;下载路径非本地绝对路径或tempFilePath被回收;缺少REQUEST_INSTALL_PACKAGES权限或用户未开启未知来源安装;APK签名不完整(缺v1);iOS不支持应用内安装IPA。

Android 调用 plus.runtime.install 安装 APK 失败的常见原因
直接调用 plus.runtime.install 报错“Install failed: invalid version”或静默无反应,大概率不是代码写错了,而是几个硬性条件没满足:
-
manifest.json中的versionCode必须是纯数字(如105),且新包的versionCode严格大于当前已安装版本;字符串比较(如"1.0.5")会导致校验失败 - 下载路径必须是本地绝对路径,不能传 HTTP 链接 ——
uni.downloadFile返回的tempFilePath是临时路径,需确保它在安装前仍有效(Android 10+ 下临时目录可能被系统回收) - 未申请
android.permission.REQUEST_INSTALL_PACKAGES权限,或用户未手动开启「允许此应用安装未知来源应用」开关(尤其 Android 8.0+) - APK 文件本身签名异常:调试版若只勾选 v2 签名、漏掉 v1,Android 9 及以下会拒绝安装
下载路径必须用 uni.env.USER_DATA_PATH 而非 tempFilePath
uni.downloadFile 的 tempFilePath 在部分 Android 厂商 ROM(如华为、小米)上生命周期极短,下载完成几秒后就可能被清理,导致 plus.runtime.install 找不到文件。稳妥做法是显式指定可持久化路径:
- 推荐保存路径:
uni.env.USER_DATA_PATH + '/update/app-release.apk'—— 该路径始终可读写,且不会被系统自动清理 - 下载时需传
filename参数,否则默认保存到临时目录:uni.downloadFile({<br> url: 'https://xxx.com/app-release.apk',<br> filename: uni.env.USER_DATA_PATH + '/update/app-release.apk',<br> success: res => {<br> if (res.statusCode === 200) {<br> plus.runtime.install(res.filename, {}, () => {<br> console.log('安装启动');<br> }, e => {<br> console.error('安装失败', e);<br> });<br> }<br> }<br>}); - 首次使用前建议先用
plus.io.resolveLocalFileSystemURL检查目录是否存在,不存在则用plus.io.mkdir创建update子目录
iOS 上根本无法调用 uni.installApp 或 plus.runtime.install
iOS 不支持任何意义上的“应用内安装 IPA”,这是系统级限制,跟代码无关。所谓“整包更新”在 iOS 上实际只有两条路:
- 企业签名分发:上传
.ipa+ 对应的.plist到 HTTPS 服务器,跳转itms-services://?action=download-manifest&url=https://xxx.com/app.plist;但要求plist中CFBundleIdentifier与当前 App 完全一致,且域名必须启用 TLS 1.2+、证书由可信 CA 签发 - TestFlight 或 App Store:绝大多数情况只能跳转到
https://apps.apple.com/app/id{your-app-id};注意 Apple 会审核跳转逻辑,禁止诱导用户离开 App 或隐藏跳转意图 - 千万别传
https://xxx.com/app.ipa给uni.installApp—— iOS 会直接忽略,不报错也不提示,连日志都看不到
plus.runtime.install 的 force 参数怎么设才安全
force: true 看似能绕过版本校验,但它会让用户从 1.2.0 降级安装 1.1.0,而后者可能缺失关键 API 或存在崩溃 bug。真实场景中应由服务端控制策略:
- 后端接口返回字段明确带
mustForce: true(例如紧急热修复补丁),客户端才传{ force: true } - 普通升级一律用默认
force: false,靠versionCode严格升序保障一致性 - 安装成功后必须立即调用
plus.runtime.restart(),否则 iOS 可能卡白屏、Android 部分机型不刷新界面 - 安装回调里的
e错误对象内容极简,常见值只有"Install failed: invalid version"或"Install failed: parse package",无法区分是签名问题还是路径问题,务必前置校验


















