在问为什么之前:我正在编写一个扩展程序来观察应用程序的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.0
或5.0
,则不会触发代码。有比较好的方法吗?我不明白为什么它认为5.0
大于6.1.0
建议?
答案 0 :(得分:2)
您显然无法将其视为一个数字,因此请将其视为一组带分隔符的数字。然后,您可以使用componentsSeparatedByString:@"."
并分别处理每个号码。
务必检查组件的数量。如果一个数字的组件数多于另一个数字,那么如果您还没有从算法中得到结果,则应该回退到默认值(0
)。
循环组件并比较每个部分。
答案 1 :(得分:2)
major.minor.patch格式的版本通常不能表示为单个数字。最好使用...
比较字符串[version1 compare:version2 options:NSNumericSearch];
这仅在组件数量始终相同时才有效。