我正在开发一款Cocoa应用程序,需要检查当前的OS X版本是否为OS X 10.6 Snow Leopard。
如果当前版本是Snow Leopard,我需要关闭应用程序并显示错误提示。
如何查找当前的OS X版本?
NSAppKitVersionNumber
或NSFoundationVersionNumber
。相关框架还声明了许多不同操作系统版本的常量(NSApplication 常量,Foundation 常量)。if (floor(NSAppKitVersionNumber) > NSAppKitVersionNumber10_5) {
// Code for 10.6+ goes here
}
有几种方法可以实现这个。
您可以检查是否存在一个仅适用于10.6的类:
Class snowLeopardOnlyClass = NSClassFromString(@"NSRunningApplication"); if (snowLeopardOnlyClass != nil) { NSLog(@"我正在运行Snow Leopard!"); }
使用系统函数(如Gestalt
)来确定操作系统版本:
#import <CoreServices/CoreServices.h> SInt32 major = 0; SInt32 minor = 0; Gestalt(gestaltSystemVersionMajor, &major); Gestalt(gestaltSystemVersionMinor, &minor); if ((major == 10 && minor >= 6) || major >= 11) { NSLog(@"我正在运行Snow Leopard(至少!)"); }
uname(3)
系统调用。请参见$ man 3 uname
例子:
#include <stdio.h>
#include <sys/utsname.h>
int main()
{
struct utsname un;
uname(&un);
printf("sysname: %s\nnodename: %s\nrelease: %s\nversion: %s\nmachine: %s\n",
un.sysname, un.nodename, un.release, un.version, un.machine);
}
Gestalt
才是正确的方法。uname
不能保证返回任何有用的信息。 - Rob Keniger回答自己,我在main.m中实现了以下警报:
#ifndef NSAppKitVersionNumber10_5
#define NSAppKitVersionNumber10_5 949
#endif
int main(int argc, char *argv[])
{
SInt32 major = 0;
SInt32 minor = 0;
Gestalt(gestaltSystemVersionMajor, &major);
Gestalt(gestaltSystemVersionMinor, &minor);
if ((major == 10 && minor >= 6) || major >= 11) {
CFUserNotificationDisplayNotice(0, kCFUserNotificationCautionAlertLevel,NULL, NULL, NULL, CFSTR("Maestro"), CFSTR("This version is not compatible."), CFSTR("Ok"));
return 0;
}
return NSApplicationMain(argc, (const char **) argv);
}