2014-02-18 2 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"); 

} 

코드는 두 개의 소수가있을 때만 훌륭하게 작동합니다. 예를 들어 CFBundleVersion6.0 또는 5.0으로 설정하면 코드가 실행되지 않습니다. 비교할 수있는 더 좋은 방법이 있습니까? 왜 생각하고 있는지 이해할 수 없다. 은 6.1.0

제안보다 큽니까?

+0

감사합니다. 검색했지만 아무 것도 생각 나지 않았습니다. – CokePokes

답변

2

분명히 하나의 숫자로 처리 할 수 ​​없기 때문에 분리 기호로 숫자 세트로 취급하십시오. 그런 다음 componentsSeparatedByString:@"."을 사용하고 각 숫자를 별도로 처리 할 수 ​​있습니다.

구성 요소의 수를 확인하십시오. 하나의 숫자가 다른 숫자보다 많은 구성 요소를 가지고있는 경우 알고리즘의 결과가 아직 없으면 기본값 (0)으로 되돌아 가야합니다.

구성 요소를 반복하고 각 부분을 비교하십시오.

2

major.minor.patch 형식의 버전은 일반적으로 단일 숫자로 표시 할 수 없습니다. 사용하는 문자열을 비교하는 것이 가장 좋습니다 ...

[version1 compare:version2 options:NSNumericSearch]; 

이것은 구성 요소의 수가 항상 같은 경우에만 작동합니다.

관련 문제