谈一谈APP版本号问题
如题:谈一谈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版本号问题的更多相关文章
- [原创]浅谈移动互联网App兼容性测试
[原创]浅谈移动互联网App兼容性测试 今天要谈的话题,估计各位测试都有感受,移动互联网App兼容性测试,我们到底测试覆盖如何去挑选机型?具体移动App兼容性测试如何开展?是不是应引进像testin这 ...
- 从一张图开始,谈一谈.NET Core和前后端技术的演进之路
从一张图开始,谈一谈.NET Core和前后端技术的演进之路 邹溪源,李文强,来自长沙.NET技术社区 一张图 2019年3月10日,在长沙.NET 技术社区组织的技术沙龙<.NET Core和 ...
- iOS获取设备型号和App版本号等信息(OC+Swift)
iOS获取设备型号和App版本号等信息(OC+Swift) 字数1687 阅读382 评论3 喜欢10 好久没有写过博客了,因为中间工作比较忙,然后有些个人事情所以耽误了.但是之前写的博客还一直有人来 ...
- 谈一谈Java8的函数式编程(二) --Java8中的流
流与集合 众所周知,日常开发与操作中涉及到集合的操作相当频繁,而java中对于集合的操作又是相当麻烦.这里你可能就有疑问了,我感觉平常开发的时候操作集合时不麻烦呀?那下面我们从一个例子说起. 计 ...
- 谈一谈泛型(Generic)
谈一谈泛型 首先,泛型是C#2出现的.这也是C#2一个重要的新特性.泛型的好处之一就是在编译时执行更多的检查. 泛型类型和类型参数 泛型的两种形式:泛型类型( 包括类.接口.委托和结构 没有泛型枚 ...
- 谈一谈Elasticsearch的集群部署
Elasticsearch天生就支持分布式部署,通过集群部署可以提高系统的可用性.本文重点谈一谈Elasticsearch的集群节点相关问题,搞清楚这些是进行Elasticsearch集群部署和拓 ...
- 谈一谈iOS事件的产生和传递
谈一谈iOS事件的产生和传递 1.事件的产生 发生触摸事件后,系统会将该事件加入到一个由UIApplication管理的事件队列中. UIApplication会从事件队列中取出最前面的事件,并将事件 ...
- 谈一谈对MySQL InnoDB的认识及数据库事物处理的隔离级别
介绍: InnoDB引擎是MySQL数据库的一个重要的存储引擎,和其他存储引擎相比,InnoDB引擎的优点是支持兼容ACID的事务(类似于PostgreSQL),以及参数完整性(有外键)等.现在Inn ...
- 谈一谈深度学习之semantic Segmentation
上一次发博客已经是9月份的事了....这段时间公司的事实在是多,有写博客的时间都拿去看paper了..正好春节回来写点东西,也正好对这段时间做一个总结. 首先当然还是好好说点这段时间的主要工作:语义分 ...
随机推荐
- static_cast ,reinterpret_cast
用法:static_cast < type-id > ( expression ) 该运算符把expression转换为type-id类型,但没有运行时类型检查来保证转换的安全性.它主要有 ...
- [转]SQL Server 创建数据库邮件
本文转自:http://www.cnblogs.com/gaizai/p/3358958.html 一. 背景 数据库发邮件通知数据库的运行状态(状态可以通过JOB形式获取)和信息,达到预警的效果. ...
- iOS:详解MJRefresh刷新加载更多数据的第三方库
原文链接:http://www.ios122.com/2015/08/mjrefresh/ 简介 MJRefresh这个第三方库是李明杰老师的杰作,这个框架帮助我们程序员减轻了超级多的麻烦,节约了开发 ...
- iOS:菜单控制器和菜单项:UIMenuController和UIMenuItem
菜单控制器和菜单项:弹出自定义的菜单栏窗口 提示: 1. Menu所处的View必须实现 – (BOOL)canBecomeFirstResponder, 且返回YES2. Menu所处的View必须 ...
- go语言基础之匿名变量和多重赋
1.匿名变量 package main //必须有一个main包 import "fmt" func test() (a, b, c int) { return 1, 2, 3 } ...
- python命令行添加自动补全和命令历史功能
# python startup file import readline import rlcompleter import atexit import os # tab completion re ...
- 深度增强学习--DDPG
DDPG DDPG介绍2 ddpg输出的不是行为的概率, 而是具体的行为, 用于连续动作 (continuous action) 的预测 公式推导 推导 代码实现的gym的pendulum游戏,这个游 ...
- Android Studio之基本设置与运行
项目结构 当我们新建一个项目的目录结构默认是这样的 可以看到和Eclipse的目录结构有很大区别,Studio一个窗口只能有一个项目,而Eclipse则可以同时存在很多项目,如果你看着不习惯可以点击左 ...
- 关于HTML、js加密、混淆、源码保护、代码安全,防止解压直接看源码
一直有人问HTML加密混淆怎么做,其实这在业内是早已很多人研究过的课题.假日期间整理一篇文章分享给大家. 我们先理下需求,加密的目的是什么?加密到什么级别?为此我们可以牺牲什么?我们知道这个世界不存在 ...
- v-for设置键值 key
总是用 key 配合 v-for.在组件上_总是_必须用 key 配合 v-for,以便维护内部组件及其子树的状态. <ul> <li v-for="todo in tod ...