如题:谈一谈APP版本号问题

为什么要谈这个问题,周五晚上11~12点,被微信点名,说APP有错,无效的版本号,商城无法下单。
我正在准备收拾东西,周末回老家,结果看到这样问题,菊花一紧。
我擦,我刚加的版本号检查,在加版本号检查前,我还跟统计的妹妹仔细核对了近半年来所有的版本号,怎么还会有问题。
赶紧查,原来结果,看到了一个g1_2.5.5_65,在我的一再追问下说这个就是2.5.5的版本号。
然后咱们来说一说为什么要加版本号检查,然后再说,为什么会加出问题来,最后在讨论一下版本号规则。
题外话跟大家探讨一下version这样的参数怎么传递比较合理。

首先在APP发版过程中,由于新的版本上有新的功能,有些需要和老的版本做兼容,所以非常有可能服务器端需要知道APP的版本号,
而服务器在升级服务和自己的API也一定有版本号的概念,虽然很多时候我们可能注意不到,但是版本号这个一定是双方互相都存在的。
我就是在这样的一个情景下,我们的新的功能要同时需要兼容新的老的APP,所以服务器需要知道所有APP的版本号,这是需要APP传给服务的参数。
同时服务器也需要在基于某个版本号比如2.8.5做版本号大小的判断。
比如说小于2.8.5的版本号,那么就是老的逻辑,而大于等于2.8.5的版本就是新的逻辑。这可能是基于版本号的最简单的兼容逻辑了。

到这里有心的读者一定看出了说为什么加个版本号也会加出问题来了,对这就是加个版本号检查也加出问题的原因。
我在加检查前,不确定我们的版本号的规则,然后我找统计妹妹仔细统计了近半年的所有的版本号,得到的结果是我们的版本号是x.x.x这样的号码,
x一定是数字,那这么看来没有问题,我就按这个规则解析比较,结果当遇到上边看到的g1_2.5.5_65这个版本号时,直接numberformatexception.
还好,我们的处理非常之果断,在版本检查时出里任何异常,都提示用户版本过低,让用户升级。
但同样暴露出了我们很多的问题,我们的APP经过两年多的发版竟然从来没有统一过版本号,甚至规则都没有统一过。
再次追问下去,说由于不同的下载渠道和推送渠道,我们会写上不同的版本号,这个答案的结果我当然不满意。
心中多是无奈也没有办法,于是乎推进版本号赶紧统一,至少在规则上能有一个可以统一解析的规则。
这里的一个事情做得好的就是至少我们还有版本号,无论当时服务器使用没有使用版本号,至少APP是传了的。
需要注意的是,版本号这个东西不能随意写,也不能随意规划,这个需要统一规划,而且越快越早规划越好。

那么这里就引出了第三个问题,版本号的规则问题,关于这个问题,我不想深入探讨和研究。
百度“软件开发版本号规则”或者“软件开发版本号命名规范”讲的非常之详细,非常明白,很容易理解。
我想说的无论怎么样一定要指定一个自己可以统一解析的规则和规范,只要按照规则和规范一定能很好的处理版本号。
我比较推荐的使用的版本号有两种,
1是:主版本号.次版本号.修订版本号.日期版本号
2是:主版本号.次版本号.修订版本号.构建版本号
这样的一组号码,清晰明了,足够用了。

最后谈一谈版本号怎么传递比较合适,首先我们不说APP,我们做服务器端开发特别是RESTAPI时一定也遇到过说一个API的version问题,
网上不同的人有不同的见解,不同的网站有不同的实现方式,我说一下我知道的常见的几种方式:
1、在http header中传递,例如:header.set("version","2.8.5")
2、在使用url path的方式,例如:/www.xxx.com/order/v2.8.5/create
3、使用url query paramter的方式传递,例如:/www.xxx.com/order/create?v=2.8.5
4、使用form表单提交version,(这个貌似极其少见)例如:<form method="post|get" action="/order/create"><hiden name="version" value="2.8.5"/>...</form>
这个明白了之后那么APP给服务器传参,也无外乎这几种方式,具体使用哪种中方式可以根据自己的喜好而定。
貌似我在某一篇文章中看到说虽然使用url path的方式比较直观,有些大型的网站也在使用,但是REStful的规范说要在header中使用version才算正统。
这个就无所谓了,我感觉都行,之前老大还跟我争执过这个,我说要加在url path中就是使用第二种方式,结果老大不同意,说你这样将来要维护一堆的url,v1,v2会很麻烦。
说推荐第一种,我比较固执的按第二种方式做了,后来另一个同事也讨论起这事,所就按第二种方式比较好,这里老大的态度变了,说啥啥啥公司都是第二种,咱们也第二种吧,
我心里那个委屈,特么,我早跟你说,你跟我还争个毛线,我做都做了,还在我伤口上撒盐。我跟老大争这些是不是将来做不了老大,悲催。
现在想想第三种也非常棒,真的也非常不错的。

好了今天,关于版本号讨论就说这么些吧。

欢迎大家评论发表意见或提出问题

谈一谈APP版本号问题的更多相关文章

  1. [原创]浅谈移动互联网App兼容性测试

    [原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...

  2. 从一张图开始,谈一谈.NET Core和前后端技术的演进之路

    从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...

  3. iOS获取设备型号和App版本号等信息(OC+Swift)

    iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...

  4. 谈一谈Java8的函数式编程(二) --Java8中的流

    流与集合    众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...

  5. 谈一谈泛型(Generic)

    谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 ​ 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...

  6. 谈一谈Elasticsearch的集群部署

      Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...

  7. 谈一谈iOS事件的产生和传递

    谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...

  8. 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别

    介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...

  9. 谈一谈深度学习之semantic Segmentation

    上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...

随机推荐

  1. 逻辑回归Logistic Regression 之基础知识准备

    0. 前言   这学期 Pattern Recognition 课程的 project 之一是手写数字识别,之二是做一个网站验证码的识别(鸭梨不小哇).面包要一口一口吃,先尝试把模式识别的经典问题—— ...

  2. SEO之巴莱多定律

    SEO这个词在2007.2008年好像特别的火,尤其在2007年下半年至今,众多SEO爱好者发起了最大的一轮搜索引擎优化研究风暴,甚至最终逼迫百度等大型搜索引擎公司改变算法. SEO,确实能带来一些经 ...

  3. 怎样在Ubuntu手机应用中得到全部的环境变量值

    我们在先前的例程中已经通过一些方法得到我们应用的一些环境变量值.这些值有的很实用.比方我们能够得到我们应用所仅仅能訪问的文件夹.在今天的例程中,我们来展示一种方法能够得到应用全部的环境变量.在我们的实 ...

  4. POJ 1275-Cashier Employment(差分约束系统)

    题目地址:id=1275">POJ 1275 题意: 给出一个超市24小时各须要R[i]个雇员工作,有N个雇员能够雇佣.他们開始工作时间分别为A[i],求须要的最少的雇员人数. 思路: ...

  5. Android-标题状态栏的隐藏

    以下有两种方法,建议使用第一种方法:使用第一种方法,仅仅只需要在Manifest.xml文件中进行一行的配置就行了而且Activity在启动的时候也不会看到那个Title栏第一种方法:在配置文件中进行 ...

  6. linux 遇见错误Could not get lock /var/lib/dpkg/lock

    通过终端安装程序sudo apt-get install xxx时出错:E: Could not get lock /var/lib/dpkg/lock - open (11: Resource te ...

  7. The WebSocket Protocol

      [Docs] [txt|pdf] [draft-ietf-hybi-t...] [Diff1] [Diff2] [Errata] Updated by: 7936 PROPOSED STANDAR ...

  8. eclipse缺省的Server没有weblogic

    转自:http://www.javakfz.com/index.php/08/06/471.html eclipse缺省的Server没有weblogic,因此要下载个weblogic的插件.这个过程 ...

  9. 算法笔记_073:哈密顿回路问题(Java)

    目录 1 问题描述 2 解决方案   1 问题描述 什么是哈密顿回路? 引用自百度百科: 哈密顿图(哈密尔顿图)(英语:Hamiltonian path,或Traceable path)是一个无向图, ...

  10. LoadRunner监控Tomcat的几种方法

    通过JConsole监控Tomcat 1.打开tomcat5的bin目录中的catalina.bat文件,在头部注释部分的后面加上: set JAVA_OPTS=%JAVA_OPTS% -Dcom.s ...