У меня есть программа, которая должна вести себя немного по-другому на Tiger, чем на Leopard. Кто-нибудь знает системный вызов, который позволит мне точно определить, какую версию Mac OS X я запускаю. Я нашел несколько макроопределений, чтобы определить ОС сборки, но ничего действительно нехорошо определить ОС текущей машины.
Спасибо,
Джо
Ответ 1
См. эту статью здесь
Но, если вы используете углерод, используйте вызов Gestalt(), и если вы используете cocoa, существует константа под названием NSAppKitVersionNumber, которую вы можете просто проверить.
Изменить: для Mac OSX 10.8 и выше не используйте Gestalt(). См. Этот ответ для получения дополнительной информации: Как определить версию ОС во время выполнения в OS X или iOS (без использования Gestalt)?
Ответ 2
Не могли бы вы просто проверить наличие возможности? Например:
if (NSClassFromString(@"NSKeyedArchiver") != Nil)
или
if ([arrayController respondsToSelector: @selector(selectedIndexes)])
то вы знаете, что операционная система делает то, что вам нужно, но не то, что группа маркетинга продукта Apple дала ему определенное число; -)
Ответ 3
API через Gestalt Manager.
См. " Определение версии ОС" на сайте CocoaDev.
Ответ 4
В терминале:
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
Ответ 5
Действительно ли версия ОС действительно нужна? Возможно, более подходящая вещь для проверки, например, наличие или номер версии конкретной структуры.
Ответ 6
в вашей программе вы можете использовать Gestalt. Вот код, который я использую для своей программы, чтобы получить версию ОС.
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);
}
Ответ 7
respondsToSelector:
почти наверняка лучше, чем вы поддерживаете таблицу того, что эти выпуски делают и не реализуют.
Будьте ленивы. Пусть среда выполнения сообщит вам, может ли она что-то сделать или нет, и когда вам нужно, вернитесь к более старым методам. Ваш код будет намного менее хрупким, потому что вам не нужно поддерживать свои собственные глобальные данные, которые остальная часть вашего кода должна проверять с помощью.
Ответ 8
Запустите это в командной строке:
system_profiler SPSoftwareDataType | grep Mac