uni-app 在 hbuilderx 3.8.5及以后的版本中,plus.runtime.install无法安装apk文件

发布于 1周前 作者 sinazl 来自 Uni-App

uni-app 在 hbuilderx 3.8.5及以后的版本中,plus.runtime.install无法安装apk文件

示例代码:

plus.runtime.install(
path, {},
function() {
plus.nativeUI.closeWaiting();
console.log("安装文件成功!");
plus.nativeUI.alert('更新完成,即将重启应用', function() {
plus.runtime.restart();
});
},
function(e) {
console.log('失败',e)
plus.nativeUI.closeWaiting();
plus.nativeUI.alert('应用配置更新失败了~建议重启应用');
if(e && e.message){
plus.nativeUI.alert('更新失败:'+e.message);
}
}
);//都是输出:失败

操作步骤:

  • 下载apk成功后,plus.runtime.install无法安装apk

预期结果:

  • 下载apk成功后,plus.runtime.install正常安装apk更新app

实际结果:

  • 下载apk成功后,plus.runtime.install无法安装apk,app无法更新

bug描述:

hbuilderx 3.8.5及以后的版本,plus.runtime.install都无法安装apk文件,无法做app更新功能。


4 回复

希望官方解决一下这个问题,难受呀,升级了,反而不能安装apk


蹲,同样遇到了问题

uni-app 中,plus.runtime.install 是用于安装 APK 文件的方法。如果你在 HBuilderX 3.8.5 及以后的版本中遇到 plus.runtime.install 无法安装 APK 文件的问题,可能是由于以下几个原因导致的:

1. 权限问题

  • 问题描述: Android 6.0 及以上版本需要动态申请安装未知来源应用的权限。
  • 解决方案: 在调用 plus.runtime.install 之前,确保已经获取了安装未知来源应用的权限。
plus.android.requestPermissions(['android.permission.REQUEST_INSTALL_PACKAGES'], function(result) {
    if (result.deniedAlways.length > 0 || result.deniedPresent.length > 0) {
        console.log('用户拒绝了权限请求');
    } else {
        // 权限已授予,继续安装 APK
        plus.runtime.install(apkPath, {}, function() {
            console.log('安装成功');
        }, function(e) {
            console.log('安装失败: ' + JSON.stringify(e));
        });
    }
});

2. 文件路径问题

  • 问题描述: apkPath 路径不正确,导致无法找到 APK 文件。
  • 解决方案: 确保 apkPath 是正确的文件路径。通常,APK 文件可以存储在应用的 _www 目录下,或者通过下载的方式获取。
const apkPath = '_www/your_app.apk'; // 确保路径正确
plus.runtime.install(apkPath, {}, function() {
    console.log('安装成功');
}, function(e) {
    console.log('安装失败: ' + JSON.stringify(e));
});

3. HBuilderX 版本问题

  • 问题描述: HBuilderX 3.8.5 及以后的版本可能对 plus.runtime.install 方法进行了更改或限制。
  • 解决方案: 确保你使用的是最新版本的 HBuilderX,并检查官方文档或更新日志,确认是否有相关变更。如果有必要,可以尝试降级到之前的版本进行测试。

4. Android 系统限制

  • 问题描述: Android 8.0 及以上版本对安装 APK 文件有更严格的限制,可能需要额外的配置。
  • 解决方案: 在 AndroidManifest.xml 中添加以下配置:
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />
<application
    android:requestLegacyExternalStorage="true"
    ... >
    ...
</application>

5. 调试与日志

  • 问题描述: 无法确定具体问题的原因。
  • 解决方案: 在调用 plus.runtime.install 时,添加详细的日志输出,以便调试。
plus.runtime.install(apkPath, {}, function() {
    console.log('安装成功');
}, function(e) {
    console.log('安装失败: ' + JSON.stringify(e));
});

6. 使用 uni.downloadFile 下载 APK

  • 问题描述: 如果 APK 文件是通过网络下载的,可能需要先下载到本地再安装。
  • 解决方案: 使用 uni.downloadFile 下载 APK 文件,然后在成功回调中调用 plus.runtime.install
uni.downloadFile({
    url: 'https://example.com/your_app.apk',
    success: (res) => {
        if (res.statusCode === 200) {
            const apkPath = res.tempFilePath;
            plus.runtime.install(apkPath, {}, function() {
                console.log('安装成功');
            }, function(e) {
                console.log('安装失败: ' + JSON.stringify(e));
            });
        }
    },
    fail: (err) => {
        console.log('下载失败: ' + JSON.stringify(err));
    }
});

7. 检查 plus.runtime 的可用性

  • 问题描述: plus.runtime 对象可能未正确初始化。
  • 解决方案: 在调用 plus.runtime.install 之前,确保 plus 对象已初始化。
document.addEventListener('plusready', function() {
    // plus 对象已初始化,可以安全调用 plus.runtime.install
    plus.runtime.install(apkPath, {}, function() {
        console.log('安装成功');
    }, function(e) {
        console.log('安装失败: ' + JSON.stringify(e));
    });
});
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!