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]; }
対策
- 文字列の比較メソッドを使う
+ (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]; }