2009-11-09 1 views

Odpowiedz

8

Najprostszym sposobem jest użycie wyjście z komendy system_profiler. Posiada również opcję -xml, aby wydruk był łatwy do automatycznego analizowania.

+0

Daje to dobrą ilość informacji. Dzięki za to. Zastanawiasz się, czy istnieje jakieś API do zapytania o określone informacje. Jak tylko dla pamięci lub powiedzmy procesory. – Unicorn

+1

Sugerujemy przeczytanie strony man: 'system_profiler -listDataTypes', następnie' system_profiler -xml dataType1 ... ' –

+0

Dzięki ned, znalazłem to, czego szukałem. Myślę, że teraz można zacząć używać tego. – Unicorn

0

Możesz użyć scripting bridge w systemie Leopard (lub nowszym), aby uzyskać żądane informacje bezpośrednio z programu Apple System Profiler.

4

Podstawowy interfejs API, który według mnie używa Profiler Systemowy (przynajmniej dla niektórych informacji, które gromadzi) i który powinien być użyty, jeśli chcesz uzyskać bardzo szczegółowe informacje, to sysctl. Pozwala zapytać o poszczególne atrybuty systemu, w tym liczbę procesorów, szybkość procesora, dostępną pamięć RAM itp.

10

Profil systemu jest niezły i będzie wyświetlał kod XML dla niektórych wolnych plików I/O, a także polegajmy na innym proces należy wykonać przed uzyskaniem żądanych informacji. Cóż, jeśli tak to ujęłam, czy profilowanie systemu jest najlepszą opcją i odpowiedzią na to pytanie? Myślę, że nie (IMO).

Oto jak to robię. Nagłówek jest tylko do odczytu właściwości prywatnych właściwości Readwrite. Metody kategorii są dość proste, ale jeśli ktoś ma pytanie, to opublikuj, a ja odpowiem.

#import <IOKit/IOKitLib.h> 
#import <sys/sysctl.h> 

@interface VarSystemInfo() 
@property (readwrite, strong, nonatomic) NSString *sysName; 
@property (readwrite, strong, nonatomic) NSString *sysUserName; 
@property (readwrite, strong, nonatomic) NSString *sysFullUserName; 
@property (readwrite, strong, nonatomic) NSString *sysOSName; 
@property (readwrite, strong, nonatomic) NSString *sysOSVersion; 
@property (readwrite, strong, nonatomic) NSString *sysPhysicalMemory; 
@property (readwrite, strong, nonatomic) NSString *sysSerialNumber; 
@property (readwrite, strong, nonatomic) NSString *sysUUID; 
@property (readwrite, strong, nonatomic) NSString *sysModelID; 
@property (readwrite, strong, nonatomic) NSString *sysModelName; 
@property (readwrite, strong, nonatomic) NSString *sysProcessorName; 
@property (readwrite, strong, nonatomic) NSString *sysProcessorSpeed; 
@property (readwrite, strong, nonatomic) NSNumber *sysProcessorCount; 
@property (readonly, strong, nonatomic) NSString *getOSVersionInfo; 

- (NSString *) _strIORegistryEntry:(NSString *)registryKey; 
- (NSString *) _strControlEntry:(NSString *)ctlKey; 
- (NSNumber *) _numControlEntry:(NSString *)ctlKey; 
- (NSString *) _modelNameFromID:(NSString *)modelID; 
- (NSString *) _parseBrandName:(NSString *)brandName; 
@end 

static NSString* const kVarSysInfoVersionFormat = @"%@.%@.%@ (%@)"; 
static NSString* const kVarSysInfoPlatformExpert = @"IOPlatformExpertDevice"; 

static NSString* const kVarSysInfoKeyOSVersion = @"kern.osrelease"; 
static NSString* const kVarSysInfoKeyOSBuild = @"kern.osversion"; 
static NSString* const kVarSysInfoKeyModel  = @"hw.model"; 
static NSString* const kVarSysInfoKeyCPUCount = @"hw.physicalcpu"; 
static NSString* const kVarSysInfoKeyCPUFreq = @"hw.cpufrequency"; 
static NSString* const kVarSysInfoKeyCPUBrand = @"machdep.cpu.brand_string"; 

static NSString* const kVarSysInfoMachineNames  = @"MachineNames"; 
static NSString* const kVarSysInfoMachineiMac  = @"iMac"; 
static NSString* const kVarSysInfoMachineMacmini  = @"Mac mini"; 
static NSString* const kVarSysInfoMachineMacBookAir = @"MacBook Air"; 
static NSString* const kVarSysInfoMachineMacBookPro = @"MacBook Pro"; 
static NSString* const kVarSysInfoMachineMacPro  = @"Mac Pro"; 

#pragma mark - Implementation: 
#pragma mark - 

@implementation VarSystemInfo 

@synthesize sysName, sysUserName, sysFullUserName; 
@synthesize sysOSName, sysOSVersion; 
@synthesize sysPhysicalMemory; 
@synthesize sysSerialNumber, sysUUID; 
@synthesize sysModelID, sysModelName; 
@synthesize sysProcessorName, sysProcessorSpeed, sysProcessorCount; 

#pragma mark - Helper Methods: 

- (NSString *) _strIORegistryEntry:(NSString *)registryKey { 

    NSString *retString; 

    io_service_t service = 
    IOServiceGetMatchingService(kIOMasterPortDefault, 
           IOServiceMatching([kVarSysInfoPlatformExpert UTF8String])); 
    if (service) { 

     CFTypeRef cfRefString = 
     IORegistryEntryCreateCFProperty(service, 
             (__bridge CFStringRef)registryKey, 
             kCFAllocatorDefault, kNilOptions); 
     if (cfRefString) { 

      retString = [NSString stringWithString:(__bridge NSString *)cfRefString]; 
      CFRelease(cfRefString); 

     } IOObjectRelease(service); 

    } return retString; 
} 

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

- (NSNumber *) _numControlEntry:(NSString *)ctlKey { 

    size_t size = sizeof(uint64_t); uint64_t ctlValue = 0; 
    if (sysctlbyname([ctlKey UTF8String], &ctlValue, &size, NULL, 0) == -1) return nil; 
    return [NSNumber numberWithUnsignedLongLong:ctlValue]; 
} 

- (NSString *) _modelNameFromID:(NSString *)modelID { 

    /*! 
    * @discussion Maintain Machine Names plist from the following site 
    * @abstract ref: http://www.everymac.com/systems/by_capability/mac-specs-by-machine-model-machine-id.html 
    * 
    * @discussion Also info found in SPMachineTypes.plist @ /System/Library/PrivateFrameworks/... 
    *    ...AppleSystemInfo.framework/Versions/A/Resources 
    *    Information here is private and can not be linked into the code. 
    */ 

    NSDictionary *modelDict = [[NSBundle mainBundle] URLForResource:kVarSysInfoMachineNames withExtension:@"plist"].serialPList; 
    NSString *modelName = [modelDict objectForKey:modelID]; 

    if (!modelName) { 

     if ([modelID.lowercaseString hasPrefix:kVarSysInfoMachineiMac.lowercaseString]) return kVarSysInfoMachineiMac; 
     else if ([modelID.lowercaseString hasPrefix:kVarSysInfoMachineMacmini.noWhitespaceAndLowerCaseString]) return kVarSysInfoMachineMacmini; 
     else if ([modelID.lowercaseString hasPrefix:kVarSysInfoMachineMacBookAir.noWhitespaceAndLowerCaseString]) return kVarSysInfoMachineMacBookAir; 
     else if ([modelID.lowercaseString hasPrefix:kVarSysInfoMachineMacBookPro.noWhitespaceAndLowerCaseString]) return kVarSysInfoMachineMacBookPro; 
     else if ([modelID.lowercaseString hasPrefix:kVarSysInfoMachineMacPro.noWhitespaceAndLowerCaseString])  return kVarSysInfoMachineMacPro; 
     else return modelID; 

    } return modelName; 
} 

- (NSString *) _parseBrandName:(NSString *)brandName { 

    if (!brandName) return nil; 

    NSMutableArray *newWords = [NSMutableArray array]; 
    NSString *strCopyRight = @"r", *strTradeMark = @"tm", *strCPU = @"CPU"; 

    NSArray *words = [brandName componentsSeparatedByCharactersInSet:[[NSCharacterSet alphanumericCharacterSet] invertedSet]]; 

    for (NSString *word in words) { 

     if ([word isEqualToString:strCPU])  break; 
     if ([word isEqualToString:@""])   continue; 
     if ([word.lowercaseString isEqualToString:strCopyRight]) continue; 
     if ([word.lowercaseString isEqualToString:strTradeMark]) continue; 

     if ([word length] > 0) { 

      NSString *firstChar = [word substringToIndex:1]; 
      if (NSNotFound != [firstChar rangeOfCharacterFromSet:[NSCharacterSet decimalDigitCharacterSet]].location) continue; 

      [newWords addObject:word]; 

    } } return [newWords componentsJoinedByString:@" "]; 
} 

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

    } return nil; 
} 

#pragma mark - Initalization: 

- (void) setupSystemInformation { 

    NSProcessInfo *pi = [NSProcessInfo processInfo]; 

    self.sysName = [[NSHost currentHost] localizedName]; 
    self.sysUserName = NSUserName(); 
    self.sysFullUserName = NSFullUserName(); 
    self.sysOSName = pi.strOperatingSystem; 
    self.sysOSVersion = self.getOSVersionInfo; 
    self.sysPhysicalMemory = [[NSNumber numberWithUnsignedLongLong:pi.physicalMemory] strBinarySizeMaxFractionDigits:0]; 
    self.sysSerialNumber = [self _strIORegistryEntry:(__bridge NSString *)CFSTR(kIOPlatformSerialNumberKey)]; 
    self.sysUUID = [self _strIORegistryEntry:(__bridge NSString *)CFSTR(kIOPlatformUUIDKey)]; 
    self.sysModelID = [self _strControlEntry:kVarSysInfoKeyModel]; 
    self.sysModelName = [self _modelNameFromID:self.sysModelID]; 
    self.sysProcessorName = [self _parseBrandName:[self _strControlEntry:kVarSysInfoKeyCPUBrand]]; 
    self.sysProcessorSpeed = [[self _numControlEntry:kVarSysInfoKeyCPUFreq] strBaseTenSpeedMaxFractionDigits:2]; 
    self.sysProcessorCount = [self _numControlEntry:kVarSysInfoKeyCPUCount]; 
} 

- (id) init { 

    if ((self = [super init])) { 

     [self setupSystemInformation]; 

    } return self; 
} 

@end 

Ciesz się!

P.S. Ładuję wszystkie wartości właściwości podczas init, aby uniknąć wielu wywołań systemowych & &, ponieważ wszystkie te tanie wartości powinny być dość statyczne.

P.P.S. Ładuję również plik plisty MachineNames, który utworzyłem, ale wiem, że jest to mój własny proces, który ma do niego dostęp, a komentarz opisuje, skąd czerpię te informacje.

+0

Po pierwsze, @Arvin jesteś niesamowity i ratujesz życie. Potrzebuję twojej uwagi na niektórych kodach, ponieważ niektóre linie zawierają błędy, a te linie to: Błąd 1: self.sysOSName = pi.strOperatingSystem; Błąd 2: self.sysPhysicalMemory = [[NSNumber numberWithUnsignedLongLong: pi.physicalMemory] strBinarySizeMaxFractionDigits: 0]; Błąd 3: self.sysModelName = [self _modelNameFromID: self.sysModelID]; Błąd 4: self.sysProcessorSpeed ​​= [[self _numControlEntry: kVarSysInfoKeyCPUFreq] strBaseTenSpeedMaxFractionDigits: 2]; –