子小7934
子小7934
  • 发布:2021-05-11 13:49
  • 更新:2021-05-17 15:59
  • 阅读:161

【已废弃】已废弃

分类:uni-app

产品分类: uniapp/App

PC开发环境操作系统: Windows

PC开发环境操作系统版本号: win10

HBuilderX类型: 正式

HBuilderX版本号: 3.1.14

手机系统: Android

手机系统版本号: Android 10

手机厂商: 小米

手机机型: 红米手机

页面类型: vue

nvue编译模式: fast

打包方式: 云端

项目创建方式: HBuilderX

操作步骤:

之前检测版本是通过版本号进行版本升级,比如我 版本 1.1.1 版本号 11100, 那么我的 wgt 升级包就是 11101

3.14的编辑器,如果我要进行版本升级,需要把我的 版本 1.1.1 变为 1.1.2,版本号仍为 11100 才可以升级 ,造成的问题就是,版本名称是不能变得,版本名称的改变用来判断 apk升级的,而不是用来判断 wgt 升级的,

bug:新更新规则的相关文档 https://ask.dcloud.net.cn/article/35667
https://ask.dcloud.net.cn/article/182

如果是从 3.14 开始都要实行此新规则?请给个明确回复,谢谢。我这边好更改自己的升级判断,或者采用官方的升级平台。

预期结果:

如果是从 3.14 开始都要实行此新规则?请给个明确回复,谢谢。我这边好更改自己的升级判断,或者采用官方的升级平台。

实际结果:

之前检测版本是通过版本号进行版本升级,比如我 版本 1.1.1 版本号 11100, 那么我的 wgt 升级包就是 11101

3.14的编辑器,如果我要进行版本升级,需要把我的 版本 1.1.1 变为 1.1.2,版本号仍为 11100 才可以升级 ,造成的问题就是,版本名称是不能变得,版本名称的改变用来判断 apk升级的,而不是用来判断 wgt 升级的,

bug描述:

之前检测版本是通过版本号进行版本升级,比如我 版本 1.1.1 版本号 11100, 那么我的 wgt 升级包就是 11101

3.14的编辑器,如果我要进行版本升级,需要把我的 版本 1.1.1 变为 1.1.2,版本号仍为 11100 才可以升级 ,造成的问题就是,版本名称是不能变得,版本名称的改变用来判断 apk升级的,而不是用来判断 wgt 升级的,

bug:出现的相关文档 https://ask.dcloud.net.cn/article/35667

如果是从 3.14 开始都要实行此新规则?请给个明确回复,谢谢。我这边好更改自己的升级判断,或者采用官方的升级平台。

2021-05-11 13:49 负责人:DCloud_Android_DQQ 分享
已邀请:

最佳回复

DCloud_Android_DQQ

DCloud_Android_DQQ

首先,我不是很清楚你描述的问题在哪里。 你一直表述的都是你的后台升级代码在3.1.4之后不符合你的预期。

第二,我明确一下 wgt只有同时更新 versionCode和 versionName 才能产生更新行为。 这个是android的线上更新逻辑,且最近版本没有变更。

  • 子小7934 (作者)

    好的,那就是我实现的有问题,只是歪打正着,更新成功了。

    2021-05-17 16:44

  • 子小7934 (作者)

    第二,我明确一下 wgt只有同时更新 versionCode和 versionName 才能产生更新行为。 这个是android的线上更新逻辑,且最近版本没有变更。


    https://ext.dcloud.net.cn/plugin?id=1643 前台升级代码,我用的这个插件,然后自己修改的。


    3.07 之前做的如果是 wgt 更新,应用版本名称不变,只更新了应用版本号就产生了wgt更新行为,如果是 应用版本名称改变,版本号也改变产生的是apk 更新行为。


    3.14 上面的逻辑走不通了,现在的如果是wgt更新,应用版本名称需要改变,应用版本号不变就可以产生wgt更新行为,改变成这样的逻辑是可以更新成功的,


    如果按照我3.07的代码 走 会出现 2005的错误异常。所以确认下是否有进行升级逻辑的修改。


    你回复的是必须二者同时更新,那么才能产生 wgt 更新行为,这个是android的线上更新逻辑,且最近版本没有变更。


    那么就是我之前就实现升级逻辑就是有问题的,如果没其他人反馈同样的问题,那肯定就是我写错了,歪打正着实现了。我再去读读文档。

    2021-05-17 16:58

  • 子小7934 (作者)

    感谢回复昂!辛苦了

    2021-05-17 16:59

DCloud_UNI_LXH

DCloud_UNI_LXH

你是怎么判断版本的?

plus.runtime.version            // 获取版本名称  
plus.runtime.versionCode   // 获取版本号  
plus.runtime.getProperty(plus.runtime.appid, wgtInfo => {  
                    wgtInfo.version  // 获取wgt版本号  
                })
  • 子小7934 (作者)

    'use strict';  
    exports.main = async (event, context) => {
    //event为客户端上传的参数
    // console.log('event : ' + event)
    let result = {
    isUpdate: false
    }
    let appid = event.appid
    let clientVersion = event.version
    let clientVersionCode = event.versionCode
    let wgtInfo = event.wgtInfo
    //这是通过HTTP接口访问的
    if (event.headers) {
    appid = event.queryStringParameters.appid
    clientVersion = event.queryStringParameters.version
    clientVersionCode = event.queryStringParameters.versionCode
    wgtInfo = event.queryStringParameters.wgtInfo
    }
    let axiosType = event.axiosType;
    console.log(axiosType)
    let apkDataBase = ''; // apk 数据库
    let wgtDateBase = ''; // wgt 数据库
    switch (axiosType) {
    case 'dev': // 开发
    apkDataBase = "dev-apk-version";
    wgtDateBase = "dev-wgt-version";
    break;
    case 'test': //测试
    apkDataBase = "test-apk-version";
    wgtDateBase = "test-wgt-version";
    break;
    case 'pre': //预发布
    apkDataBase = "pre-apk-version";
    wgtDateBase = "pre-wgt-version";
    break;
    case 'real': //生产
    apkDataBase = "real-apk-version";
    wgtDateBase = "real-wgt-version";
    break;
    default: // 测试
    apkDataBase = "test-apk-version";
    wgtDateBase = "test-wgt-version";
    }
    //根据UA判断系统平台
    const os = /iPhone|iPad/.test(context.CLIENTUA) ? 'ios' : 'android'
    if (appid && clientVersion) {
    const db = uniCloud.database();
    // 先判断 apk版本环境 是否存在 更新
    const apkCollection = db.collection(apkDataBase).orderBy('id', 'desc')

    const record = await apkCollection.where({
    appid: appid
    }).limit(1).get()
    if (record && record.data && record.data.length > 0) {
    let versionInDb = record.data[0][os]
    if (compare(versionInDb.version, clientVersion) == 1) {
    console.log('apk:检查出来有大版本apk的更新了')
    let res = {
    version: versionInDb.version,
    versionCode: versionInDb.versionCode,
    versionName: clientVersion,
    versionInfo: versionInDb.note,
    forceUpdate: versionInDb.forceUpdate, // 是否自动强制更新
    update: true, // 更新
    downloadUrl: versionInDb.url,
    os: os,
    }
    result = res;
    } else {
    console.log('wgt:准备检查是否有wgt更新')
    // 判断是否有新的 wgt 安装包
    const collection = db.collection(wgtDateBase).orderBy('id', 'desc')
    const record = await collection.where({
    appid: appid
    }).limit(1).get()
    if (record && record.data && record.data.length > 0) {
    let versionInDb = record.data[0][os]

    let res = {
    version: versionInDb.version,
    versionCode: versionInDb.versionCode,
    versionName: clientVersion,
    versionInfo: versionInDb.note,
    forceUpdate: versionInDb.forceUpdate, // 是否自动强制更新
    update: true, // 更新
    downloadUrl: versionInDb.url,
    os: os,
    }
    if( wgtInfo ){
    // 如果存在wgt
    result.msg = 'wgt:当前用户已经升级过wgt';
    console.log(`wgt:当前用户已经升级过wgt===versionInDb.versionCode${versionInDb.versionCode}===wgtInfo.versionCode${wgtInfo.versionCode}`);
    if ( versionInDb.versionCode > wgtInfo.versionCode) {
    result = res;
    } else {
    result.msg = 'wgt:当前用户已经是最新的wgt';
    console.log(`wgt:当前用户已经是最新的wgt`);
    }
    }else{
    result.msg = 'wgt:当前用户未升级过wgt';
    console.log(`wgt:当前用户未升级过wgt===versionInDb.versionCode${versionInDb.versionCode}===clientVersionCode${clientVersionCode}`);
    if (versionInDb.version == clientVersion) {
    if ( versionInDb.versionCode > clientVersionCode) {
    result = res;
    } else {
    result.msg = 'wgt:不存在新的wgt升级包';
    console.log(`wgt:不存在新的wgt升级包`)
    }
    } else {
    result.msg = 'wgt:检测发现版本不符合'
    console.log(`wgt:检测发现版本不符合`)
    }
    }
    }
    }
    } else {
    result.msg = 'apk:列表为空,或者,AppId不匹配'
    console.log('apk:列表为空,或者,AppId不匹配')
    }
    }
    console.log('检查结果:', result);
    //返回数据给客户端
    return result
    };
    /**
    * 对比版本号
    * @param {Object} v1
    * @param {Object} v2
    */
    function compare(v1, v2) {
    let version_1 = Number(v1.replace(/\./g, ''));
    let version_2 = Number(v2.replace(/\./g, ''));
    // console.log('version_1', version_1);
    // console.log('version_2', version_2);
    if ( version_1 > version_2) {
    return 1
    } else if ( version_1 < version_2) {
    return -1
    }
    // let arr_1 = v1.split('.')
    // let arr_2 = v2.split('.')
    // for (var i = 0; i < arr_1.length; i++) {
    // if (parseInt(arr_1[i]) > parseInt(arr_2[i])) {
    // return 1
    // } else if (parseInt(arr_1[i]) < parseInt(arr_2[i])) {
    // return -1
    // }
    // }
    return 0
    }

    2021-05-12 13:25

  • 子小7934 (作者)

    我之前是这么判断的,参考的社区的文档,大概是2月份时候,用 3.07 编辑器还是可以的, 升级版本号,而不是升级名称来进行升级的。

    3.14的编辑器必须版本号,相同,版本名称+1才可以升级了。

    2021-05-12 13:26

  • 子小7934 (作者)

    3.14的 我昨天根据新规则先实现了 wgt 升级的

    新版本


    'use strict';  
    exports.main = async (event, context) => {
    //event为客户端上传的参数
    // console.log('event : ' + event)
    let result = {
    isUpdate: false
    }
    let appid = event.appid
    let clientVersion = event.version
    let clientVersionCode = event.versionCode
    let wgtInfo = event.wgtInfo
    //这是通过HTTP接口访问的
    if (event.headers) {
    appid = event.queryStringParameters.appid
    clientVersion = event.queryStringParameters.version
    clientVersionCode = event.queryStringParameters.versionCode
    wgtInfo = event.queryStringParameters.wgtInfo
    }
    let axiosType = event.axiosType;
    console.log(axiosType)
    let apkDataBase = ''; // apk 数据库
    let wgtDateBase = ''; // wgt 数据库
    switch (axiosType) {
    case 'dev': // 开发
    apkDataBase = "dev-apk-version";
    wgtDateBase = "dev-wgt-version";
    break;
    case 'test': //测试
    apkDataBase = "test-apk-version";
    wgtDateBase = "test-wgt-version";
    break;
    case 'pre': //预发布
    apkDataBase = "pre-apk-version";
    wgtDateBase = "pre-wgt-version";
    break;
    case 'real': //生产
    apkDataBase = "real-apk-version";
    wgtDateBase = "real-wgt-version";
    break;
    default: // 测试
    apkDataBase = "test-apk-version";
    wgtDateBase = "test-wgt-version";
    }
    //根据UA判断系统平台
    const os = /iPhone|iPad/.test(context.CLIENTUA) ? 'ios' : 'android'
    if (appid && clientVersion) {
    const db = uniCloud.database();
    console.log('wgt:准备检查是否有wgt更新')
    // 判断是否有新的 wgt 安装包
    const collection = db.collection(wgtDateBase).orderBy('id', 'desc')
    const record = await collection.where({
    appid: appid
    }).limit(1).get()
    if (record && record.data && record.data.length > 0) {
    let versionInDb = record.data[0][os]
    let res = {
    version: versionInDb.version,
    versionCode: versionInDb.versionCode,
    versionName: clientVersion,
    versionInfo: versionInDb.note,
    forceUpdate: versionInDb.forceUpdate, // 是否自动强制更新
    update: true, // 更新
    downloadUrl: versionInDb.url,
    os: os,
    }
    if( wgtInfo ){
    // 如果存在wgt
    result.msg = 'wgt:当前用户已经升级过wgt';
    console.log(`wgt:当前用户已经升级过wgt===versionInDb.versionCode${versionInDb.versionCode}===wgtInfo.versionCode${wgtInfo.versionCode}`);
    if ( versionInDb.version != wgtInfo.version ) {
    result = res;
    } else {
    result.msg = 'wgt:当前用户已经是最新的wgt';
    console.log(`wgt:当前用户已经是最新的wgt`);
    }
    }else{
    result.msg = 'wgt:当前用户未升级过wgt';
    console.log(`wgt:当前用户未升级过wgt===versionInDb.versionCode${versionInDb.versionCode}===clientVersionCode${clientVersionCode}`);
    if (versionInDb.version == clientVersion) {
    if ( versionInDb.version != version) {
    result = res;
    } else {
    result.msg = 'wgt:不存在新的wgt升级包';
    console.log(`wgt:不存在新的wgt升级包`)
    }
    } else {
    result.msg = 'wgt:检测发现版本不符合'
    console.log(`wgt:检测发现版本不符合`)
    }
    }
    }

    }
    console.log('检查结果:', result);
    //返回数据给客户端
    return result
    };
    /**
    * 对比版本号
    * @param {Object} v1
    * @param {Object} v2
    */
    function compare(v1, v2) {
    let version_1 = Number(v1.replace(/\./g, ''));
    let version_2 = Number(v2.replace(/\./g, ''));
    // console.log('version_1', version_1);
    // console.log('version_2', version_2);
    if ( version_1 > version_2) {
    return 1
    } else if ( version_1 < version_2) {
    return -1
    }
    // let arr_1 = v1.split('.')
    // let arr_2 = v2.split('.')
    // for (var i = 0; i < arr_1.length; i++) {
    // if (parseInt(arr_1[i]) > parseInt(arr_2[i])) {
    // return 1
    // } else if (parseInt(arr_1[i]) < parseInt(arr_2[i])) {
    // return -1
    // }
    // }
    return 0
    }

    2021-05-12 13:28

  • 子小7934 (作者)

    是不是因为我之前就实现的有问题,然后歪打正着实现了?

    2021-05-12 13:30

  • DCloud_UNI_LXH

    回复 子小7934: 版本号和版本名称,不是由你自己控制吗?具体是有什么问题?除了你自己的判断逻辑之外的。

    2021-05-13 18:58

  • 子小7934 (作者)

    回复 DCloud_UNI_LXH: 之前3.07版本的时候我app下载好了wgt升级包以后,因为版本号变动可以直接安装升级的,3.14以后,我的wgt升级包如果版本号变动了,提醒升级失败了,2005版本信息不符合。3.14以后升级包必须是版本名称改变才可以安装升级,之前的是版本号变动就可以升级。

    2021-05-16 17:23

  • DCloud_Android_DQQ

    回复 子小7934: 你加一下我 qq 643833712

    2021-05-17 15:09

DCloud_Android_DQQ

DCloud_Android_DQQ

你贴出来的代码 是你自己的后台云函数实现。

你前端用什么代码获取的应用版本。 有什么异常,贴一下

要回复问题请先登录注册