小程序发布后,不能强更的情况下,怎么通知到用户需要去更新?

哈喽,我想和大家分享一下我在开发记账小程序时遇到的一个问题,以及我找到的解决办法。

这个记账小程序从一开始,我就特别在意用户的隐私,所以把记账数据都存到了本地缓存里,还做了个手动备份的功能。但系统嘛,总是要升级的,有时候就得强制更新。这一强制更新,麻烦就来了,缓存没了,用户辛辛苦苦记的账也全没了,这可太糟糕了。

问题来了,我怎么通知用户要去更新呢?

后来我琢磨出了一个办法。每次发布新版本的时候,我就把当前的版本号带上去。等用户打开页面,就让小程序去调后台接口,获取那些落后的版本信息,然后把更新消息告诉用户。

看最终结果:

由于更新前要备份数据,我还专门做了一个视频教程,点击按钮就能跳转到哔哩哔哩查看。

ok,先看看前端代码。我定义了一个 version 常量,用来表示当前版本,现在是 7 。然后有个 getDelayVersion 函数,专门去获取落后版本记录。它用 uni.request 去调后台接口,把当前版本号 version 和用户的 openid 传过去。要是接口调用成功,状态码是 200 ,就把返回的数据存到 delayVersions.value 里;要是失败了,就在控制台打印错误信息,还会给用户弹出一个提示框,说查询最新版本失败。

javascript 复制代码
/** 当前版本 */
const version = 7;
// ------------------------
// 获取落后的版本记录
// ------------------------
const getDelayVersion = async () => {
    try {
        const apiRes = await uni.request({
            url: api + '/getDelayVersion', // 替换为实际接口
            method: 'GET',
            data: { 
                version,
                openid: openId.value
            }
        });
        
        if (apiRes.statusCode === 200) {
            delayVersions.value = apiRes.data.data
        } else {
            throw new Error('查询最新版本失败');
        }
        
    } catch (error) {
        console.error('查询最新版本失败:', error);
        uni.showToast({ title: '查询最新版本失败', icon: 'none' });
    }
}

后台代码也不复杂。用 @RequestMapping 定义了一个 /getDelayVersion 的接口,接收前端传过来的 version 和 openid 。如果 openid 不为空,就去数据库里查对应的用户信息,把用户的版本号更新一下。然后再从 app_info 表里查出版本号大于传过来的 version 的所有记录,封装成响应数据返回给前端。

scss 复制代码
@RequestMapping("/getDelayVersion")
public WxResponse<List<AppInfo>> getDelayVersion(String version,String openid) throws IOException {
    WxResponse<List<AppInfo>> wxResponse = new WxResponse();
    wxResponse.setStatusCode(BusinessStatusEnum.SUCCESS.getCode());
    if(StrUtil.isNotBlank(openid)) {
        UserInfo userInfo = userInfoMapper.selectOne(new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getOpenId, openid));
        userInfo.setVersion(version);
        userInfoMapper.update(userInfo,new LambdaQueryWrapper<UserInfo>().eq(UserInfo::getOpenId,openid));
        log.info(StrUtil.format("{} 当前版本{}记录OK",openid,version));
    }
    List<AppInfo> appInfoList = appInfoMapper.selectList(new LambdaQueryWrapper<AppInfo>().gt(AppInfo::getVersion, version));
    wxResponse.setData(appInfoList);
    return wxResponse;
}

最后说说这个 app_info 表的结构,就两列, version 存版本号, content 存一些相关内容,表的注释写的是"小程序版本表"。

sql 复制代码
CREATE TABLE `app_info` (
  `version` varchar(100) DEFAULT NULL,
  `content` varchar(200) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='小程序版本表';

目前这个办法还挺好用的,能通知到用户去更新,大家要是在开发过程中遇到类似的情况,也可以在评论区一起聊聊是怎么解决的。

相关推荐
lpfasd1237 小时前
node-sass 停止维护!老项目迁移 Dart Sass 完整教程
前端·rust·sass
Data analyse45610 小时前
rnweb 回放数据量太大怎么办?分片存储与断点续传的实现思路
前端·网络·算法·数据分析
xiaogai_gai10 小时前
金蝶收料通知单查询策略实战教程:从源系统拉取到中间层落地的完整路径
java·前端·数据库
环境栈笔记11 小时前
指纹浏览器 WebRTC 怎么设置?从 ICE 候选、代理出口到功能验证
前端·人工智能·后端·自动化
赵大仁11 小时前
官网性能优化实战:LCP 3.2s → 2.1s、CLS 0.107 → 0,以及被我推翻的 6 个判断
前端·性能优化·cls·lcp·core web vitals
xiancai_xianyu11 小时前
Text2SQL落地生产库前,SQL要过哪三道闸
前端·数据库·sql·sql注入·text2sql·ai agent开发·企业级ai框架
小羊没烦恼!11 小时前
T-SQL查询进阶--理解SQL SERVER中的分区表
服务器·开发语言·前端·javascript·html
史瓦辛格12 小时前
给 DeepSeek Harness 写费用插件:把「这次会话花了多少钱」算准
前端·deepseek
星光不问赶路人12 小时前
Vue 3 + TypeScript 中 enum 的使用实践
前端·vue.js
鸥梨菌Honevid12 小时前
UVM 中 REQ 和 RSP 类型详解:从通信模型到 item_done 与 put_response
java·前端·servlet