有没有办法在给出型号的情况下获得Mac的图标?

Tap*_*rms 6 macos cocoa airdrop multipeer-connectivity

我知道你可以使用以下代码从cocoa获取当前机器的图标:

NSImage *machineIcon = [NSImage imageNamed:NSImageNameComputer];
Run Code Online (Sandbox Code Playgroud)

但是只给出型号时是否可以获得图标?如MacBookPro11,3

我需要这个的原因是因为我正在使用MultiPeer Connectivity我想要连接的网络浏览设备.但我想在自定义浏览器视图中显示这些设备中的图标.

我知道OS X几乎包含以下文件夹中所有设备的每个图标:

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/
Run Code Online (Sandbox Code Playgroud)

但我想知道如何从我的应用程序中访问它们:

我想过使用discoveryInfofrom MCNearbyServiceAdvertiser来传输设备广告的图标,但你无法使用传输那么多的数据discoveryInfo.它仅适用于少量文本.所以我决定只传输机器的型号.我希望将机器的型号解析为另一侧的图标.有点像AirDrop它是怎么回事.

Mar*_*k H 5

  1. Mac App Store安全

手动将模型标识符映射到图标名称,然后使用eg

[[NSWorkspace sharedWorkspace] iconForFileType:@"com.apple.macbookair"];
Run Code Online (Sandbox Code Playgroud)

要么

 [NSImage imageNamed:NSImageNameComputer]
Run Code Online (Sandbox Code Playgroud)

如果你需要比imageNamed更高的分辨率提供使用

  OSType code = UTGetOSTypeFromString((CFStringRef)CFSTR("root"));
  NSImage *computer = [[NSWorkspace sharedWorkspace] iconForFileType:NSFileTypeForHFSTypeCode(code)];
Run Code Online (Sandbox Code Playgroud)

其中"root"字符串来自IconsCore.h头文件(kComputer).

复制此plist以获取标识符(不要从app sandbox访问它)

/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist

  1. Mac App Store不安全

链接私有框架SPSupport.Framework与您的二进制添加FrameWork搜索路径变量

$(SYSTEM_LIBRARY_DIR)/ PrivateFrameworks

将以下界面添加到项目中

#import <Cocoa/Cocoa.h>

@interface SPDocument : NSDocument

- (NSImage *)modelIcon;
- (id)computerName;
- (id)serialNumber;
- (id)modelName;

@end
Run Code Online (Sandbox Code Playgroud)

致电您的代码:

  SPDocument *document = [[SPDocument alloc] init];
  NSImage *icon = [document modelIcon];
Run Code Online (Sandbox Code Playgroud)
  1. 最难的方式

通过这个私有函数找出CoreFoundation舞蹈(这段代码是插图,找到正确的类型,params的数量并正确释放)

  output = _LSCreateDeviceTypeIdentifierWithModelCode((CFStringRef)@"MacBookPro6,2");
  NSImage *image = [[NSWorkspace sharedWorkspace] iconForFileType: output];
Run Code Online (Sandbox Code Playgroud)

编辑: 我刚刚意识到您需要选项号1,3(给定型号的图标).GL打这个.

EDIT2 方法3补充说.更改了订单并在数字1下添加.

EDIT3 彩色版本的新UTI com.apple.macbook-retina-silver com.apple.device-model-code MacBook8,1 @ ECOLOR = 225,225,223

com.apple.macbook-retina-gold com.apple.device-model-code MacBook8,1 @ ECOLOR = 235,215,191

com.apple.macbook-retina-space-grey com.apple.device-model-code MacBook8,1 @ ECOLOR = 155,158,159 MacBook8,1 @ ECOLOR = 157,157,160

NSImage*image = [[NSWorkspace sharedWorkspace] iconForFileType:@"com.apple.macbook-retina-gold"];

如何获取型号/标识符(sysctl hw.model被system_profiler替换)?

NSPipe *outputPipe = [NSPipe pipe];
NSTask *task = [[NSTask alloc] init];
[task setLaunchPath:@"/usr/sbin/system_profiler"];
[task setArguments:@[@"SPHardwareDataType"]];
[task setStandardOutput:outputPipe];
[task launch];
[task waitUntilExit];
NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile];
NSString *hardware = [[NSString alloc] initWithData:outputData encoding:NSUTF8StringEncoding];
Run Code Online (Sandbox Code Playgroud)

并解析模型标识符或属性列表序列化