我在一些项目中看到过类似于以下代码:
#if .....
code...
#endif
但是我现在找不到了...
例如,假设应用程序正在运行于10.8系统上,则应用程序执行一项操作,否则执行另一项操作。
用什么代码来检查它是否在10.8版本上运行?
谢谢。
我在一些项目中看到过类似于以下代码:
#if .....
code...
#endif
但是我现在找不到了...
例如,假设应用程序正在运行于10.8系统上,则应用程序执行一项操作,否则执行另一项操作。
用什么代码来检查它是否在10.8版本上运行?
谢谢。
operatingSystemVersionString
,该属性被明确列为不安全的解析。参考/更多信息:
一个快速的方法是:
if ( NSAppKitVersionNumber >= NSAppKitVersionNumber10_7 ) {
// Do stuff for Lion or later
}
更多信息 在此。
您可以通过在Xcode中使用“快速打开”(Cmd-Shift O)访问NSApplication.h中提供的所有常量。
如果您有兴趣,头文件为一些令人惊讶的有趣阅读材料提供了支持。
正如其他人所说(我选择Steven Fisher的答案),您通常实际上不需要获取版本号。
如果您只需要对当前使用的SDK版本进行与主要OS X版本的比较,则NSAppKitVersionNumber (如Monolo的答案中所示)是正确的方法。
如果您确实需要出于某些原因获取版本号(例如,记录有关用户的分析数据,以便您可以决定何时停止支持10.6.0-10.6.5),则可按以下方式执行:
#import <CoreServices/CoreServices.h>
SInt32 majorVersion, minorVersion, bugFixVersion;
Gestalt(gestaltSystemVersionMajor, &majorVersion);
Gestalt(gestaltSystemVersionMinor, &minorVersion);
Gestalt(gestaltSystemVersionBugFix, &bugFixVersion);
对于10.7.3版本,这将会得到主要版本号=10,次要版本号=7,错误修复版本号=3。
10.7文档已经删除了直接建议使用Gestalt获取OS版本的段落,但它仍未被弃用或过时,并且没有其他建议。事实上,每一种获取此信息的方法(解析-[NSProcessInfo operatingSystemVersionString],调用“kern.osrelease”上的sysctlbyname并将Darwin内核版本转换为OS X版本等)都在某处明确反对。因此,如果您真的想要这样做,这就是方法。
只需记住,正如1989年System 6.0.4的发布说明所说的那样,这个新API可能不是永久的,并且可能会在将来的操作系统版本中被删除。
uname -r
命令(实际上是内核版本,但很容易映射到Mac OS X版本),通过sw_vers
命令获取发布名称、版本和构建标识符,或者在当前版本的Mac OS X上使用Gestalt()
函数来获取当前版本。最安全的方法可能是读取sw_vers
的输出,这是一种稳定的格式,易于解析。if ([NSHologram class]) {
// Create an instance of the class and use it.
} else {
// The Hologram class is not available.
}
NSString* hologramText = @"Hologram";
if ([hologramText respondsToSelector:@selector(convertHologram)]) {
[hologramText convertHologram];
}
然而,在进行方法检查时,该方法必须在您构建应用程序的系统上可用,否则您将会收到编译错误。
static NSString* const kVarSysInfoVersionFormat = @"%@.%@.%@ (%@)";
static NSString* const kVarSysInfoKeyOSVersion = @"kern.osrelease";
static NSString* const kVarSysInfoKeyOSBuild = @"kern.osversion";
- (NSString *) _strControlEntry:(NSString *)ctlKey {
size_t size = 0;
if ( sysctlbyname([ctlKey UTF8String], NULL, &size, NULL, 0) == -1 ) return nil;
char *machine = calloc( 1, size );
sysctlbyname([ctlKey UTF8String], machine, &size, NULL, 0);
NSString *ctlValue = [NSString stringWithCString:machine encoding:[NSString defaultCStringEncoding]];
free(machine); return ctlValue;
}
- (NSString *) getOSVersionInfo {
NSString *darwinVer = [self _strControlEntry:kVarSysInfoKeyOSVersion];
NSString *buildNo = [self _strControlEntry:kVarSysInfoKeyOSBuild];
if ( !darwinVer || !buildNo ) return nil;
NSString *majorVer = @"10", *minorVer = @"x", *bugFix = @"x";
NSArray *darwinChunks = [darwinVer componentsSeparatedByCharactersInSet:[NSCharacterSet punctuationCharacterSet]];
if ( [darwinChunks count] > 0 ) {
NSInteger firstChunk = [(NSString *)[darwinChunks objectAtIndex:0] integerValue];
minorVer = [NSString stringWithFormat:@"%ld", (firstChunk - 4)];
bugFix = [darwinChunks objectAtIndex:1];
} return [NSString stringWithFormat:kVarSysInfoVersionFormat, majorVer, minorVer, bugFix, buildNo];
}
享受吧!
您可以像这样获取操作系统版本:
NSString *version = [[NSProcessInfo processInfo] operatingSystemVersionString];
NSLog(version);
输出:
NSString *version = [[NSProcessInfo processInfo] operatingSystemVersionString];
NSRange range = NSMakeRange(8, 4);
NSString *justVersion = [version substringWithRange: range];
NSLog(@"%@", justVersion);
结果:
而且用于检查:
if ([justVersion isEqualToString:@"10.7"]) {
code...
}
else {
...
}