iOS版本号比较

首先,先了解一下iOS版本号的规则

版本号

CFBundleShortVersionString(Version)

Specifies the release version number of the bundle, which identifies a released iteration of the app.
指定包的发布版本号,标识应用程序的发布迭代版本。

该版本的版本号是三个时期分离整数组成的字符串。例如1.0.0
第一个整数表示应用程序的主版本号,表示实现新功能或重大变化。第二个整数代表次版本号,表示实现不太突出的功能。第三个整数代表修正版本号,表示维护已发行版本。

CFBundleVersion(Build)

Specifies the build version number of the bundle, which identifies an iteration (released or unreleased) of the bundle.
指定包的构建版本号,标识包的迭代版本(发布或未发布)。

由于我们在提交版本的过程中,可能对程序还有修改,所以通常一个发布版本可能会对应多个构建版本,但真正上线的只有一个构建版本。所以程序在做更新提示时,只需要比较发布版本号即可。另外,在实际开发中两位的版本号也使用也比较频繁,所以,在比较时,需要考虑。

/**
 比较两个版本号的大小

 @param v1 第一个版本号
 @param v2 第二个版本号
 @return 版本号相等,返回0; v1小于v2,返回-1; 否则返回1.
 */
+ (NSInteger)compareVersion:(NSString *)v1 to:(NSString *)v2 {
    // 都为空,相等,返回0
    if (!v1 && !v2) {
        return 0;
    }
    
    // v1为空,v2不为空,返回-1
    if (!v1 && v2) {
        return -1;
    }
    
    // v2为空,v1不为空,返回1
    if (v1 && !v2) {
        return 1;
    }
    
    // 获取版本号字段
    NSArray *v1Array = [v1 componentsSeparatedByString:@"."];
    NSArray *v2Array = [v2 componentsSeparatedByString:@"."];
    // 取字段最少的,进行循环比较
    NSInteger smallCount = (v1Array.count > v2Array.count) ? v2Array.count : v1Array.count;
    
    for (int i = 0; i < smallCount; i++) {
        NSInteger value1 = [[v1Array objectAtIndex:i] integerValue];
        NSInteger value2 = [[v2Array objectAtIndex:i] integerValue];
        if (value1 > value2) {
            // v1版本字段大于v2版本字段,返回1
            return 1;
        } else if (value1 < value2) {
            // v2版本字段大于v1版本字段,返回-1
            return -1;
        }
        
        // 版本相等,继续循环。
    }
    
    // 版本可比较字段相等,则字段多的版本高于字段少的版本。
    if (v1Array.count > v2Array.count) {
        return 1;
    } else if (v1Array.count < v2Array.count) {
        return -1;
    } else {
        return 0;
    }
    
    return 0;
}

追加优化

感谢2、3楼兄弟的评论,算法确实存在2.0和2.0.0比较结果是大于的BUG,对此我进行了优化,优化后的算法如下:

/**
 比较两个版本号的大小(2.0)
 
 @param v1 第一个版本号
 @param v2 第二个版本号
 @return 版本号相等,返回0; v1小于v2,返回-1; 否则返回1.
 */
+ (NSInteger)compareVersion2:(NSString *)v1 to:(NSString *)v2 {
    // 都为空,相等,返回0
    if (!v1 && !v2) {
        return 0;
    }
    
    // v1为空,v2不为空,返回-1
    if (!v1 && v2) {
        return -1;
    }
    
    // v2为空,v1不为空,返回1
    if (v1 && !v2) {
        return 1;
    }
    
    // 获取版本号字段
    NSArray *v1Array = [v1 componentsSeparatedByString:@"."];
    NSArray *v2Array = [v2 componentsSeparatedByString:@"."];
    // 取字段最大的,进行循环比较
    NSInteger bigCount = (v1Array.count > v2Array.count) ? v1Array.count : v2Array.count;
    
    for (int i = 0; i < bigCount; i++) {
        // 字段有值,取值;字段无值,置0。
        NSInteger value1 = (v1Array.count > i) ? [[v1Array objectAtIndex:i] integerValue] : 0;
        NSInteger value2 = (v2Array.count > i) ? [[v2Array objectAtIndex:i] integerValue] : 0;
        if (value1 > value2) {
            // v1版本字段大于v2版本字段,返回1
            return 1;
        } else if (value1 < value2) {
            // v2版本字段大于v1版本字段,返回-1
            return -1;
        }
        
        // 版本相等,继续循环。
    }

    // 版本号相等
    return 0;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转自:http://blog.csdn.net/highning0007/article/details/3799...
    某人在阅读 5,744评论 0 0
  • 在进行版本更新的时候,需要对当前版本和接口数据版本号就行判断比较,发现有多种的比较方式。 最简单的比较方式,采用字...
    我是要成为大神的男人阅读 7,376评论 0 1
  • 思路 首先通过正则表达式验证版本号格式是否正确 再对两个版本号进行比较 正则分析 首先开头是一个组合,该组合是开头...
    世界的一缕曙光阅读 3,599评论 0 0
  • 拿下这些,英语说起来更加溜溜哒! 句型1:There+be +主语+地点状语/ 时间状语 There’s a bo...
    春喜外语阅读 3,382评论 0 2
  • 我出生的村子名字叫做海田,邻近还有一个村子,叫桑田。每每想起老家,总是觉得有“沧海桑田”之意。然而家乡好像没有如此...
    山人阅读 5,594评论 0 3