showUpdateDialog() {
uni.showModal({
title: "发现新版本",
content: this.updateDescription || "修复已知问题,推荐更新。",
confirmText: "立即更新",
showCancel: !this.isForceUpdate,
cancelText: this.isForceUpdate ? "退出应用" : "取消",
success: res => {
if (res.confirm) {
this.startUpdate();
} else if (this.isForceUpdate) {
plus.runtime.quit();
}
}
});
}
startUpdate() {
if (this.platform === "android") {
this.downloadAndInstallApk();
} else {
uni.showToast({ title: '仅支持 Android', icon: 'none' });
}
}
downloadAndInstallApk() {
// 使用系统浏览器或下载管理器下载
plus.runtime.openURL(this.downloadUrl);
// 或者使用 plus.downloader 创建系统下载任务
const dtask = plus.downloader.createDownload(
this.downloadUrl,
{ filename: '_downloads/app_update.apk' },
(download, status) => {
if (status === 200) {
console.log("下载完成",download.filename,download);
// 系统会自动提示安装
plus.runtime.install(plus.io.convertLocalFileSystemURL(download.filename),{},{},function(error){
uni.showToast({
title: '安装失败',
mask: false,
duration: 1500
});
})
} else {
uni.showToast({
title: '更新失败',
mask: false,
duration: 1500
});
}
}
);
dtask.start();
}
``` simpleDemo/manifests/AndroidManifest.xml 中已经添加
<!-- 应用安装权限(低版本兼容)-->
<uses-permission android:name="android.permission.INSTALL_PACKAGES" />
<!-- 安装未知来源应用权限(高版本必需)-->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
在HBuilder X的manifest.js 的安卓/IOS权限配置中也添加了
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
请问一下这是什么问题 为什么会这样.
k***@126.com
- 发布:2025-11-25 15:22
- 更新:2025-11-25 20:15
- 阅读:19
2 个回复
Ask小助手
根据您描述的问题,云打包能正常更新而离线打包不能,主要原因在于离线打包时权限配置未完全生效及Android系统限制。
关键点分析:
权限配置差异:云端打包会自动添加
INSTALL_PACKAGES和REQUEST_INSTALL_PACKAGES权限,但离线打包需要手动在原生工程中确认权限是否真正写入APK。您在manifest.json添加的权限可能未被离线打包流程正确处理。Android系统限制:从Android 8.0开始,
INSTALL_PACKAGES权限仅限系统应用使用。普通应用只能使用REQUEST_INSTALL_PACKAGES权限触发系统安装界面,无法完全静默安装。您的代码直接调用plus.runtime.install()在离线环境下可能因权限不足失败。离线打包特殊性:离线打包需在原生工程环境中配置(见Android平台离线打包参考),仅修改manifest.json不够,还需检查:
解决方案:
plus.runtime.install()调用,下载完成后通过plus.runtime.openURL("file://"+download.filename)触发系统安装界面AndroidManifest.xml最终包含这两个权限注意:完全自动安装(无需用户确认)在非系统应用中无法实现,这是Android系统安全策略决定的。
k***@126.com (作者)
我返编译了 自己打的apk 结果在AndroidManifest.xml中看到了
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES"/>
<uses-permission android:name="android.permission.INSTALL_PACKAGES"/>
这两个权限 然后我就又迷茫了 还是无法自动安装 plus.runtime.openURL("file://"+download.filename)也不触发触发系统安装界面
要回复问题请先登录或注册
公告
更多>相关问题