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;
}
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 轉自:http://blog.csdn.net/highning0007/article/details/3799...
    某人在閱讀 1,740評論 0 0
  • 在進行版本更新的時候,需要對當前版本和接口數據版本號就行判斷比較,發現有多種的比較方式。 最簡單的比較方式,采用字...
    我是要成為大神的男人閱讀 2,572評論 0 1
  • 思路 首先通過正則表達式驗證版本號格式是否正確 再對兩個版本號進行比較 正則分析 首先開頭是一個組合,該組合是開頭...
    世界的一縷曙光閱讀 579評論 0 0
  • 拿下這些,英語說起來更加溜溜噠! 句型1:There+be +主語+地點狀語/ 時間狀語 There’s a bo...
    春喜外語閱讀 515評論 0 2
  • 我出生的村子名字叫做海田,鄰近還有一個村子,叫桑田。每每想起老家,總是覺得有“滄海桑田”之意。然而家鄉好像沒有如此...
    山人閱讀 1,673評論 0 3