我可以使用下面给出的代码获取 OSX 的版本,但我想要的是操作系统的名称(使用 Objective C)。
提前致谢!
NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
NSString* major = [NSString stringWithFormat:@"%d", version.majorVersion];
NSString* minor = [NSString stringWithFormat:@"%d", version.minorVersion];
NSString* patch = [NSString stringWithFormat:@"%d", version.patchVersion];
据我所知,没有任何 API 可以生成当前操作系统版本的产品名称。即使在系统位置中对产品名称进行
grep
ping 也只能产生很少的结果,而且大多数结果都在私有框架中。我发现的唯一有希望的非私人匹配是在 Setup Assistant.app
中,并且需要可怕的拼凑才能从较长的字符串中提取:
NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:@"/System/Library/CoreServices/Setup Assistant.app/Contents/Resources/en.lproj/Localizable.strings"];
NSString *productName = [dict objectForKey:@"INSTALLATION_COMPLETE"];
if (productName) {
NSRange r = [productName rangeOfString:@" has been"];
if (r.location != NSNotFound) {
productName = [productName substringToIndex:r.location];
} else {
productName = nil;
}
}
这恰好适用于 Yosemite 和 El Capitan,并生成“OS X Yosemite”和“OS X El Capitan”。但即使有这两个版本,其拙劣的本质也暴露无遗。 El Capitan 字符串包含不可破坏的空格...
除此之外(或使用其他不打算以这种方式使用的文件的类似拼凑),当然可以获取数字版本并将其与已知产品名称列表进行匹配,这将是我推荐的解决方案,也许可以使用上面的拼凑作为后备。
愚蠢,但这应该可行。
public extension ProcessInfo {
func osName() -> String? {
let version = self.operatingSystemVersion
switch version.majorVersion {
case 14: return "Sonoma"
case 13: return "Ventura"
case 12: return "Monterey"
case 11: return "Big Sur"
case 10: break
default: return "macOS \(version.majorVersion)"
}
switch version.minorVersion {
case 15: return "Catalina"
case 14: return "Mojave"
case 13: return "High Sierra"
case 12: return "Sierra"
case 11: return "El Capitan"
case 10: return "Yosemite"
case 9: return "Mavericks"
case 8: return "Mountain Lion"
case 7: return "Lion"
case 6: return "Snow Leopard"
case 5: return "Leopard"
case 4: return "Tiger"
case 3: return "Panther"
case 2: return "Jaguar"
case 1: return "Puma"
case 0: return "Cheetah"
default: return nil
}
}
为了多一个选项来找出 OSX 名称,我在下面提供了一种解决方法:
//此函数将返回操作系统名称
-(NSString *)getOSName{
// get major version
NSString* majorVersion = [self getMajorVersion];
// get minor version
NSString* minorVersion= [self getMinorVersion];
NSString* OSName = @"";
// figure out the name using versions
if([minorVersion isEqualTo:@"11"])
{
OSName = @"El Capitan";
}
else if([minorVersion isEqualTo:@"10"])
{
OSName = @"Yosemite";
}
else if([minorVersion isEqualTo:@"9"])
{
OSName = @"Mavericks";
}
else if([minorVersion isEqualTo:@"8"])
{
OSName = @"Mountain Lion";
}
else if([minorVersion isEqualTo:@"7"])
{
OSName = @"Lion";
}
else if([minorVersion isEqualTo:@"6"])
{
OSName = @"Snow Leopard";
}
else if([minorVersion isEqualTo:@"5"])
{
OSName = @"Leopard";
}
else if([minorVersion isEqualTo:@"4"])
{
OSName = @"Tiger";
}
else if([minorVersion isEqualTo:@"3"])
{
OSName = @"Panther";
}
else if([minorVersion isEqualTo:@"2"])
{
OSName = @"Jaguar";
}
else if([minorVersion isEqualTo:@"1"])
{
OSName = @"Puma";
}
else if([minorVersion isEqualTo:@"0"])
{
OSName = @"Kodiak";
}
return OSName;
}
-(NSString*)getMajorVersion{
NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
NSString* ver = [NSString stringWithFormat:@"%d", version.majorVersion];
return ver;
}
-(NSString*)getMinorVersion{
NSOperatingSystemVersion version = [[NSProcessInfo processInfo] operatingSystemVersion];
NSString* ver = [NSString stringWithFormat:@"%d", version.minorVersion];
return ver;
}