uni-app 远程升级后 android 系统重启 appWgtVersion 版本号被回退
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版本被回退的现象
同样的问题,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.log
或plus.nativeUI.toast
输出调试信息。 - 例如:
console.log('当前版本号:', currentVersion); console.log('新版本号:', newVersion); console.log('下载路径:', wgtPath);