How to know what Mac OS the app is running on?

后端 未结 7 1993
遥遥无期
遥遥无期 2020-12-31 18:30

I\'ve seen in some projects something like:

#if .....
    code...
#endif

but i can\'t find it now...
Let\'s say, for example, if the ap

7条回答
  •  慢半拍i
    慢半拍i (楼主)
    2020-12-31 19:01

    Here is code for how I do it. I love it this way, mainly because I don't have to A) Rely on an NSTask or B) Rely on any File I/O that many processes have access to.

    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];
    }
    

    Enjoy!

提交回复
热议问题