uni-app 远程升级后 android 系统重启 appWgtVersion 版本号被回退

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

uni-app 远程升级后 android 系统重启 appWgtVersion 版本号被回退

操作步骤:

系统预制uniapp开发的APK,默认安装在system/app目录(1.0.0版本),APP远程升级首次启动版本正常,android重启后(appWgtVersion回退到1.0.0版本),经过排查app其中时复制到/data/data/包名/apps下的uniapp资源是/system/app目录下APK的assets资源,app启动的是新版本的apk,导致自定义基站升级成功,但是appWgt版本被回退的现象

预期结果:

appWgtVersion被回退

实际结果:

系统预制uniapp开发的APK,默认安装在system/app目录(1.0.0版本),APP远程升级首次启动版本正常,android重启后(appWgtVersion回退到1.0.0版本),经过排查app其中时复制到/data/data/包名/apps下的uniapp资源是/system/app目录下APK的assets资源,app启动的是新版本的apk,导致自定义基站升级成功,但是appWgt版本被回退的现象

bug描述:

系统预制uniapp开发的APK,默认安装在system/app目录(1.0.0版本),APP远程升级首次启动版本正常,android重启后(appWgtVersion回退到1.0.0版本),经过排查app其中时复制到/data/data/包名/apps下的uniapp资源是/system/app目录下APK的assets资源,app启动的是新版本的apk,导致自定义基站升级成功,但是appWgt版本被回退的现象


5 回复

同样的问题,APP升级+重启后一直提示需要更新


这个问题解决了嘛

我也有类似的问题,但我是覆盖升级,APP 处于前台时重启机器有时会出现 appWgtVersion 回退。但关了APP,再次打开又好了。 我的解决办法是终止APP当前进程,再打开APP App.vue onLaunch 里检查 appWgtVersion
onLaunch: function (options) {
// 有时appWgt会出现回退,即用js的旧代码,原因不明。
// 终止当前进程,再重新启动
let appBaseInfo = uni.getAppBaseInfo();

if (appBaseInfo.appVersion !== appBaseInfo.appWgtVersion) {
coldRestart(argsObject);
return;
}
}

/**

  • APP 冷重启

  • @param {Object} args 启动的Intent 传递的 Extra 参数
    */
    export function coldRestart(args) {
    const Context = plus.android.importClass(‘android.content.Context’);
    const PendingIntent = plus.android.importClass(‘android.app.PendingIntent’);
    const Intent = plus.android.importClass(‘android.content.Intent’);
    const AlarmManager = plus.android.importClass(‘android.app.AlarmManager’);
    const Process = plus.android.importClass(‘android.os.Process’);

    // 延迟启动
    let mainActivity = plus.android.runtimeMainActivity();
    let alarmManager = plus.android.invoke(mainActivity, ‘getSystemService’, Context.ALARM_SERVICE);
    // 构建 Intent
    let restartIntent = new Intent();
    restartIntent.setClassName(mainActivity, ‘io.dcloud.PandoraEntry’);
    restartIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK);
    // 透传参数到重启后的Activity
    if (args) {
    Object.entries(args).forEach(([key, value]) => {
    restartIntent.putExtra(key, value);
    });
    }
    // 延迟触发
    let pendingIntent = PendingIntent.getActivity(
    mainActivity,
    0,
    restartIntent,
    PendingIntent.FLAG_UPDATE_CURRENT | PendingIntent.FLAG_IMMUTABLE // 兼容 Android 12+
    );
    if (alarmManager != null) {
    let currentTimeMillis = new Date().getTime();
    plus.android.invoke(alarmManager, ‘setExact’, AlarmManager.RTC_WAKEUP, currentTimeMillis + 200, pendingIntent);
    } else {
    plus.nativeUI.toast(‘alarmManager == null’);
    }

    // 立即终止当前进程实现强制退出
    Process.killProcess(Process.myPid());
    }

在 uni-app 中,远程升级后 Android 系统重启时 appWgtVersion 版本号被回退的问题,通常与以下原因有关:


1. 升级包未正确安装

  • 在 uni-app 中,远程升级是通过下载 .wgt 包并调用 plus.runtime.install 方法进行安装的。
  • 如果安装过程中出现错误(如文件损坏、权限不足等),可能会导致升级失败,重启后恢复到旧版本。
  • 解决方法
    • 确保下载的 .wgt 包完整且未损坏。
    • 检查安装时的错误日志,确保安装过程成功。
    • 在安装完成后,调用 plus.runtime.restart 重启应用,确保新版本生效。

2. 版本号未正确更新

  • appWgtVersion 是 uni-app 中用于标识当前应用资源包版本号的变量。
  • 如果升级后 appWgtVersion 未正确更新,可能是因为升级逻辑中未正确设置新版本号。
  • 解决方法
    • 在升级成功后,手动更新 appWgtVersion 的值。
    • 例如:
      plus.runtime.install(wgtPath, {
        force: true
      }, function() {
        console.log('安装成功');
        // 更新版本号
        plus.storage.setItem('appWgtVersion', newVersion);
        plus.runtime.restart();
      }, function(e) {
        console.error('安装失败:', e);
      });

3. 缓存问题

  • Android 系统可能会缓存旧版本的应用资源,导致重启后回退到旧版本。
  • 解决方法
    • 在升级时,强制清除缓存或使用 force: true 参数强制安装。
    • 例如:
      plus.runtime.install(wgtPath, {
        force: true
      }, function() {
        console.log('安装成功');
        plus.runtime.restart();
      }, function(e) {
        console.error('安装失败:', e);
      });

4. 升级逻辑问题

  • 如果升级逻辑中未正确处理版本号或未正确重启应用,可能会导致版本号回退。
  • 解决方法
    • 确保升级逻辑中正确处理版本号更新和重启操作。
    • 例如:
      // 检查新版本
      if (newVersion > currentVersion) {
        // 下载新版本
        downloadNewVersion(newVersionUrl, function(wgtPath) {
          // 安装新版本
          plus.runtime.install(wgtPath, {
            force: true
          }, function() {
            console.log('安装成功');
            // 更新版本号
            plus.storage.setItem('appWgtVersion', newVersion);
            // 重启应用
            plus.runtime.restart();
          }, function(e) {
            console.error('安装失败:', e);
          });
        });
      }

5. Android 系统限制

  • 某些 Android 系统(如华为、小米等)可能会限制应用的自更新行为,导致升级失败或回退。
  • 解决方法
    • 确保应用具有必要的权限(如存储权限)。
    • 在升级时,提示用户授予相关权限。
    • 如果问题仍然存在,建议引导用户通过应用商店更新。

6. 调试与日志

  • 如果以上方法无法解决问题,可以通过调试和日志进一步排查。
  • 调试方法
    • 在升级过程中,打印关键步骤的日志,检查是否有异常。
    • 使用 console.logplus.nativeUI.toast 输出调试信息。
    • 例如:
      console.log('当前版本号:', currentVersion);
      console.log('新版本号:', newVersion);
      console.log('下载路径:', wgtPath);
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!