強火で進め

このブログではプログラム関連の記事を中心に書いてます。こちらで( http://blog.livedoor.jp/tsuyobi-outdoor/ ) アウトドア関連の記事も書いてます。

OSのバージョン番号を比較する方法

[[UIDevice currentDevice] systemVersion]

iOSのバージョンを取得出来ますがこちらを

[[[UIDevice currentDevice] systemVersion] floatValue]

こんな感じで float 値に変換して比較する方法を紹介されている海外のブログをいくつか見かけました。

以前にも似たようなのを書きましたが改めてOSのバージョンの比較方法(バージョンx.x以降などの判定方法)を探してる人の検索にかかり易い様に [[UIDevice currentDevice] systemVersion] 付きで書いておきます。

バージョン番号の文字列を比較する方法 - 強火で進め
http://d.hatena.ne.jp/nakamura001/20100905/1283654296

floatValue で問題になるが例えば以下の様な場合です。
こちらはiOSのバージョンが 4.2.1 場合に floatValue の値はどうなるかのシミュレーションです。

	NSString *reqSysVer = @"4.2.1";
	NSLog(@"%f", [reqSysVer floatValue]);

結果はこちら

4.200000

.1の部分が無くなってしまっていますね。3.0などx.xの形式のバージョンしか無かった時は floatValue でも問題無かったですが4.2.1などが登場している今となっては特に floatValue ではダメです。

3番目の値を比較対象としない場合は問題は無さそうですがまぁ、ちゃんとバージョン番号向けのものを使った方がのちのちトラブルになる事が少ないでしょう。

ちゃんとOSのバージョン番号を比較する場合は以下の様にNSString の compare:options: のoptionsに NSNumericSearch を設定して比較します。

	NSString *reqSysVer = @"4.1";
	NSString *currSysVer = [[UIDevice currentDevice] systemVersion];
	if ([currSysVer compare:reqSysVer options:NSNumericSearch] != NSOrderedDescending) {
		// 比較対象のバージョン(reqSysVer)以上のバージョンのときの処理
		NSLog(@"比較対象のiOSのバージョン(%@) >= このアプリの動作しているiOSのバージョン(%@)", reqSysVer, currSysVer);
	} else {
		// 比較対象のバージョン(reqSysVer)が未満のバージョンときの処理
		NSLog(@"比較対象のiOSのバージョン(%@) < このアプリの動作しているiOSのバージョン(%@)", reqSysVer, currSysVer);
	}

このプログラムの場合の「比較対象のバージョン」とその結果は以下の様になります。

比較対象のバージョン 結果
4.1 比較対象のiOSのバージョン(4.1) < このアプリの動作しているiOSのバージョン(4.2.1)
4.2 比較対象のiOSのバージョン(4.2) < このアプリの動作しているiOSのバージョン(4.2.1)
4.2.1 比較対象のiOSのバージョン(4.2.1) >= このアプリの動作しているiOSのバージョン(4.2.1)
4.2.2 比較対象のiOSのバージョン(4.2.2) >= このアプリの動作しているiOSのバージョン(4.2.1)