2009-11-09 6 views

答えて

8

最も簡単な方法は、system_profilerコマンドからの出力を使用することです。出力を自動的に解析しやすくするためのオプションも-xmlです。

+0

を更新してください。これにより、情報量が増えます。ありがとう。 特定の情報を照会するAPIがあるかどうかは不思議です。メモリだけのようにするか、プロセッサーと言うことができます。 – Unicorn

+1

あなたはmanページを読むことをお勧め: 'system_profiler -listDataTypes'、その後、' system_profiler -xmlデータ型1 ... '定義さ –

+0

おかげで、私は私が探していたものを見つけました。私は今これを使うことができると思います。まず最初に – Unicorn

0

あなたがAppleシステム・プロフィールから直接欲しい情報を得るためにLeopardでscripting bridge(またはそれ以降)を使用することができます。

4

System Profilerが(少なくとも収集する情報の一部について)使用していると思われるAPI、および非常に特定の情報が必要な場合に使用する必要があるAPIはsysctlです。これは、CPUの数、CPUの速度、使用可能なRAMなど、システムの個々の属性を照会することができます。

10

システムプロファイラは、ファイルI/Oの速度が遅いためにXMLを出力し、必要な情報を取得する前に完了してください。さて、私はそれをこのように置いて、システムプロファイラは本当に最良の選択肢とこの質問の答えですか?私はそうは思わない(IMO)。ここで

は、私はそれを行う方法です。ヘッダーは、プライベートな読み書きプロパティの読み取り専用のプロパティです。カテゴリメソッドはかなり単純ですが、誰かが質問をしていれば投稿し、私は答えます。

#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 

お楽しみください!

P.S.その安い& &すべての値はかなり静的である必要があるため、複数のシステムを回避するために、私は初期化時にすべてのプロパティ値を読み込む& &を呼び出します。

P.P.S.作成したMachineNames plistもロードしますが、アクセスできるのは自分のプロセスだけで、コメントはその情報がどこにあるのかを記述しています。

+0

、@アービンは素晴らしい人生セーバーです。 エラー1:いくつかの行がエラーを与えているし、それらのラインがあるよう 私はあなたのコードのいくつかのあなたの注意を必要とするself.sysOSName = pi.strOperatingSystem。 エラー2:self.sysPhysicalMemory = [[のNSNumber numberWithUnsignedLongLong:pi.physicalMemory] ​​strBinarySizeMaxFractionDigits:0]。 エラー3:self.sysModelName = [self _modelNameFromID:self.sysModelID]; エラー4:self.sysProcessorSpeed = [[self _numControlEntry:kVarSysInfoKeyCPUFreq] strBaseTenSpeedMaxFractionDigits:2]; –

関連する問題