将CFBundleVersion转换为NSNumber&比较一下

时间:2014-02-18 12:12:51

标签: objective-c nsnumber nsnumberformatter info.plist

在问为什么之前:我正在编写一个扩展程序来观察应用程序的CFBundleVersion和然后将其与扩展程序不支持的旧版本进行比较。

这是我要做的比较。

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

建议?

2 个答案:

答案 0 :(得分:2)

您显然无法将其视为一个数字,因此请将其视为一组带分隔符的数字。然后,您可以使用componentsSeparatedByString:@"."并分别处理每个号码。

务必检查组件的数量。如果一个数字的组件数多于另一个数字,那么如果您还没有从算法中得到结果,则应该回退到默认值(0)。

循环组件并比较每个部分。

答案 1 :(得分:2)

major.minor.patch格式的版本通常不能表示为单个数字。最好使用...

比较字符串
[version1 compare:version2 options:NSNumericSearch];

这仅在组件数量始终相同时才有效。