Nic*_*ore 6 macos cocoa core-foundation
每台Mac都有一个型号标识符,例如"Macmini5,1".(这些显示在"系统信息"应用程序中.)
我如何以编程方式获取此模型标识符字符串?
您可以使用 sysctl
#import <Foundation/Foundation.h>
#import <sys/sysctl.h>
NSString *ModelIdentifier()
{
NSString *result=@"Unknown Mac";
size_t len=0;
sysctlbyname("hw.model", NULL, &len, NULL, 0);
if (len) {
NSMutableData *data=[NSMutableData dataWithLength:len];
sysctlbyname("hw.model", [data mutableBytes], &len, NULL, 0);
result=[NSString stringWithUTF8String:[data bytes]];
}
return result;
}
Run Code Online (Sandbox Code Playgroud)
您也可以使用IOKit.framework
. 我认为这是最好的选择。
这个简单的代码示例展示了如何从 I/O Kit 注册表读取模型标识符到NSString
:
- (NSString *)modelIdentifier {
io_service_t service = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"));
CFStringRef model = IORegistryEntryCreateCFProperty(service,
CFSTR("model"),
kCFAllocatorDefault,
0);
NSString *modelIdentifier = [[NSString alloc] initWithData:(__bridge NSData *)model
encoding:NSUTF8StringEncoding];
CFRelease(model);
IOObjectRelease(service);
return modelIdentifier;
}
Run Code Online (Sandbox Code Playgroud)
上面代码中的字符串“IOPlatformExpertDevice”和“model”用于从 I/O Kit 注册表中读取模型标识符。ioreg
当您想从 I/O Kit 注册表中查找信息时,命令行工具是您的朋友。此图像显示ioreg
输出中的这些字符串:
我希望这有助于使用IOKit.framework
.
使用IOKit的Swift 4
public func getMacModel() -> String? {
let service = IOServiceGetMatchingService(kIOMasterPortDefault,
IOServiceMatching("IOPlatformExpertDevice"))
var modelIdentifier: String?
if let modelData = IORegistryEntryCreateCFProperty(service, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data {
modelIdentifier = String(data: modelData, encoding: .utf8)
}
IOObjectRelease(service)
return modelIdentifier
}
Run Code Online (Sandbox Code Playgroud)
Ryan H 的答案是正确的,除了从null-terminated string
到 的转换不正确,最后Swift String
给出带有符号的结果,这是您可能意想不到的,执行完全匹配。\0
这是更正后的版本:
static private func modelIdentifier() -> String? {
let service = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
defer { IOObjectRelease(service) }
if let modelData = IORegistryEntryCreateCFProperty(service, "model" as CFString, kCFAllocatorDefault, 0).takeRetainedValue() as? Data {
return modelData.withUnsafeBytes { (cString: UnsafePointer<UInt8>) -> String in
return String(cString: cString)
}
}
return nil
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
1086 次 |
最近记录: |