【问题标题】:How to get actual name of Mac Operating System instead of version?如何获取 Mac 操作系统的实际名称而不是版本?
【发布时间】:2015-10-17 21:16:22
【问题描述】:

我可以使用下面给出的代码获取 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];

【问题讨论】:

  • 嗯,如果不对从版本号到名称的映射进行硬编码(并在新版本发布时保持最新)或查看某些系统文件(不太可能得到保证),可能无法解决跨版本工作)。

标签: objective-c c xcode macos cocoa


【解决方案1】:

据我所知,没有任何 API 会生成当前操作系统版本的产品名称。即使是grepping 系统位置中的产品名称也很少产生结果,而且大多数是在私有框架中。我发现的唯一有希望的非私人匹配是在Setup Assistant.app 中,并且需要从更长的字符串中提取一个可怕的kludge:

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 字符串包含不可破坏的空格……

除此之外(或使用其他不打算以这种方式使用的文件的类似组合),当然可以获取数字版本并将其与已知产品名称列表进行匹配,这可能是我推荐的解决方案以上述 kludge 作为后备。

【讨论】:

    【解决方案2】:

    愚蠢,但这应该可行。

    public extension ProcessInfo {
    func osName() -> String? {
        let version = self.operatingSystemVersion
        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 "Kodiak"
            default: return nil
        }
    }
    

    【讨论】:

    • 是的,这很愚蠢,因为您必须每年更新。
    【解决方案3】:

    为了找出 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;
    

    }

    【讨论】:

    • 嗯,你为什么要先将整数转换为 getMajorVersiongetMinorVersion 中的字符串,然后你最终不得不做一堆过于冗长和低效的 isEqualTo: 比较而不是能够switch 整数?此外,您反复与@"10" 进行比较;因为这几乎涵盖了您的所有情况,您只需检查一次并将次要版本检查嵌套在 then-branch 中。
    • 现在你已经弄错了,以防多个版本具有相同的次要版本(目前他们没有,但如果主要版本被碰撞,他们很可能会这样做)。而且您仍然在不必要地比较字符串而不是整数。
    • (另外,一个无法识别的操作系统版本的默认值可能应该是nil而不是空字符串,所以调用者可以很容易地检查它,Objective-C的命名约定是没有“get”前缀,即operatingSystemReleaseNameoperatingSystemMinorVersionString 会更一致,尽管如前所述,后者是不必要的,因为您已经从processInfo 获得了更有用的operatingSystemVersion .)
    • operatingSystemVersion 是 10.10+,所以这段代码的大部分是无用的......但是,我和 @Arkku 在一起,这段代码不需要它就可以从整数传递到字符串,a switch 声明会做得更好!
    猜你喜欢
    • 2019-01-19
    • 1970-01-01
    • 2021-03-06
    • 2020-08-25
    • 2010-10-09
    • 1970-01-01
    • 2011-09-13
    相关资源
    最近更新 更多