Tiger と Leopard では動作が少し異なるプログラムがあります。実行中の Mac OS XI のバージョンを正確に判断できるシステム コールを知っている人はいますか? ビルド マシンの OS を特定するためのマクロ定義をいくつか見つけましたが、実行中のマシンの OS を特定するのに適したものは何もありません。
ありがとう、ジョー
Tiger と Leopard では動作が少し異なるプログラムがあります。実行中の Mac OS XI のバージョンを正確に判断できるシステム コールを知っている人はいますか? ビルド マシンの OS を特定するためのマクロ定義をいくつか見つけましたが、実行中のマシンの OS を特定するのに適したものは何もありません。
ありがとう、ジョー
要するに、カーボンを使用している場合は Gestalt() 呼び出しを使用し、ココアを使用している場合は、単にチェックできる NSAppKitVersionNumber という定数があります。
編集: Mac OSX 10.8 以降では、Gestalt() を使用しないでください。詳細については、この回答を参照してください: OS X または iOS (Gestalt を使用せずに) で実行時に OS バージョンを確認するにはどうすればよいですか?
機能の存在を確認していただけますか? 例えば:
if (NSClassFromString(@"NSKeyedArchiver") != Nil)
また
if ([arrayController respondsToSelector: @selector(selectedIndexes)])
そうすれば、Apple の製品マーケティング グループがオペレーティング システムに特定の番号を付けたわけではなく、オペレーティング システムが必要なことを実行することがわかります ;-)
API は Gestalt Manager を介して行われます。
CocoaDev サイトの「 Determining OS Version 」を参照してください。
ターミナルで:
system_profiler SPSoftwareDataType
与えます:
Software:
System Software Overview:
System Version: Mac OS X 10.5.5 (9F33)
Kernel Version: Darwin 9.5.0
Boot Volume: Main
Boot Mode: Normal
Computer Name: phoenix
User Name: Douglas F Shearer (dougal)
Time since boot: 2 days 16:55
または:
sw_vers
与えます:
ProductName: Mac OS X
ProductVersion: 10.5.5
BuildVersion: 9F33
OSのバージョンは本当にあなたが望むものですか?特定のフレームワークの存在やバージョン番号など、テストするより適切なものがあるかもしれません。
プログラム内で Gestalt を使用できます。OSバージョンを取得するためにプログラムで使用しているコードは次のとおりです。
long version = 0;
OSStatus rc0 = Gestalt(gestaltSystemVersion, &version);
if((rc0 == 0) && (version >= 0x1039)) {
// will work with version 10.3.9
// works best with version 10.4.9
return; // version is good
}
if(rc0) {
printf("gestalt rc=%i\n", (int)rc0);
} else {
printf("gestalt version=%08x\n", version);
}
コマンドラインでこれを実行します。
system_profiler SPSoftwareDataType | grep Mac
respondsToSelector:
ほぼ確実に、特定のリリースで実装されているものと実装されていないものの表を維持するよりも優れています。
怠け者になりなさい。何かを実行できるかどうかをランタイムに知らせ、必要に応じて古いメソッドにフォールバックします。コードの残りの部分がチェックし続けなければならない独自のグローバル データを維持する必要がないため、コードの脆弱性が大幅に軽減されます。