Objective-Cにおけるバージョンチェック

今作ってるアプリにバージョンチェックを行う処理が実装されているが、上手く動いていないので、修正することに。

発生するバグ

例えば、ver1.0.3 や ver1.0.5 という値を 1.0とみなしてしまう

原因

取得したバージョン(文字列)をfloatにキャストしているため、2つ目のドット以下が無視されている。 以下バグってるコード

// dictionaryからversion情報を取得してfloatに
float latestVersion = [[results objectForKey:@"version"] floatValue];

if ([[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"] floatValue] < latestVersion) {
        UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"最新版が公開されました" message:@"最新版へのアップデートをお願いします。" delegate:self cancelButtonTitle:@"アップデート" otherButtonTitles:nil];
        [alert show];
}

対策

  1. 文字列の比較メソッドを使う
+ (BOOL)appVersionGreaterThanOr:(NSString *)version
{
    NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"];
    NSComparisonResult result = [version compare:currentVersion options:NSNumericSearch];
    return (result == NSOrderedAscending || result == NSOrderedSame) ? YES : NO;
}
// dictionaryからversion情報を取得
NSString *latestVersion = [results objectForKey:@"version"];
if (![self appVersionGreaterThanOr:latestVersion]) {
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"最新版が公開されました" message:@"最新版へのアップデートをお願いします。" delegate:self cancelButtonTitle:@"アップデート" otherButtonTitles:nil];
    [alert show];
}

参考

バージョン番号の文字列を比較する方法

バージョンアップの判定