2014-02-18 22 views
0

在問自己爲什麼:我正在編寫一個擴展程序,該程序遵守應用程序的CFBundleVersion &然後將其與擴展程序不支持的舊版本進行比較。將CFBundleVersion轉換爲NSNumber並與之比較

這是我做的比較。

CFStringRef _version = CFURLCreateStringByAddingPercentEscapes(NULL, 
                   (__bridge CFStringRef)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"], 
                   NULL, 
                   (CFStringRef)@" !*'();:@&=+$,/?%#[]", 
                   kCFStringEncodingUTF8); 

NSString *versionString = (NSString *)CFBridgingRelease(_version); 

NSNumberFormatter * nsFormatter = [[NSNumberFormatter alloc] init]; 
[nsFormatter setNumberStyle:NSNumberFormatterDecimalStyle]; 

NSNumber * installedVersion = [nsFormatter numberFromString:versionString]; 
NSNumber * incompatibleVersion = [nsFormatter numberFromString:@"6.1.0"]; 


if (installedVersion <= incompatibleVersion) { 

    NSLog(@"This was triggered"); 

} 

該代碼工程很好,但只有當有兩位小數。例如,如果我將CFBundleVersion設置爲6.05.0代碼未被觸發。有比較好的方法嗎?我不明白爲什麼它的想法5.0大於6.1.0

對此有何建議?

+0

謝謝,我搜查了但沒有任何東西。 – CokePokes

回答

2

你顯然不能把它當作一個數字,所以把它當作一組帶分隔符的數字。然後,您可以使用componentsSeparatedByString:@"."並分別處理每個號碼。

一定要檢查組件的數量。如果一個數字比另一個數字多,您應該回退到默認值(0),如果您尚未得到算法的結果。

遍歷組件並比較每個部件。

2

格式爲major.minor.patch的版本通常不能表示爲單個數字。最好比較使用的字符串...

[version1 compare:version2 options:NSNumericSearch]; 

這隻適用於組件數量始終相同的情況。