macos - mac被认可的开发者 - mac连接投影仪没反应




根据型号获取Mac的图标有没有办法? (2)

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

NSImage *machineIcon = [NSImage imageNamed:NSImageNameComputer];

但只有给出一个型号,是否有可能获得图标? 比如MacBookPro11,3

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

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

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/

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

我想过使用MCNearbyServiceAdvertiser来传输设备广告的图标,但不能使用discoveryInfo传输那么多的数据。 它只为少量文本设计。 所以我决定只传送机器的型号。 我希望将机器的型号解析为另一边的图标。 有点像AirDrop如何做。


  1. Mac App Store安全

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

[[NSWorkspace sharedWorkspace] iconForFileType:@"com.apple.macbookair"];

要么

 [NSImage imageNamed:NSImageNameComputer]

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

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

其中“根”字符串来自IconsCore.h头文件(kComputer)。

复制此plist以获取标识符(不要从应用程序沙箱访问它)

/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

调用你的代码:

  SPDocument *document = [[SPDocument alloc] init];
  NSImage *icon = [document modelIcon];
  1. 最难的方法

找出这个私有函数的CoreFoundation舞蹈(这个代码是例证,找到正确的类型,参数的数量和正确的释放)

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

编辑:我只是意识到,你需要选项号码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];

并解析模型标识符或您的属性列表


这是Swift中的一个解决方案,但它使用私有API,所以请记住它可能会受到无证更改和App Store拒绝。

struct MachineAttributes {

    let privateFrameworksURL = "/System/Library/PrivateFrameworks/ServerInformation.framework/Versions/A/Resources/English.lproj/SIMachineAttributes.plist"

    var model: String?

    var attributes: [String:AnyObject]?

    var iconPath: String?

    init() {
        self.model = getModel()
        self.attributes = getAttributes()
        self.iconPath = getIconPath()
    }

    init(model: String) {
        self.model = model
        self.attributes = getAttributes()
        self.iconPath = getIconPath()
    }

    private func getModel() -> String? {
        let service: io_service_t = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice"))
        let cfstr = "model" as CFString
        if let model = IORegistryEntryCreateCFProperty(service, cfstr, kCFAllocatorDefault, 0).takeUnretainedValue() as? NSData {
            if let nsstr = NSString(CString: UnsafePointer<Int8>(model.bytes), encoding: NSUTF8StringEncoding) {
                return String(nsstr)
            }
        }
        return nil
    }

    private func getAttributes() -> [String:AnyObject]? {
        if let dict = NSDictionary(contentsOfFile: privateFrameworksURL) as? [String:AnyObject],
            let id = model,
            let result = dict[id] as? [String:AnyObject] {
                return result
        }
        return nil
    }

    private func getIconPath() -> String? {
        if let attr = self.attributes, let path = attr["hardwareImageName"] as? String {
            return path
        }
        return nil
    }

}

如果你不知道这个模型:

let myMachine = MachineAttributes()
if let model = myMachine.model {
    print(model)
}
if let iconPath = myMachine.iconPath {
    print(iconPath)
}

MacBookPro9,2

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/com.apple.macbookpro-15-unibody.icns

如果您知道该模型或想使用另一个:

let myNamedMachine = MachineAttributes(model: "iMac14,2")
if let iconPath = myNamedMachine.iconPath {
    print(iconPath)
}

/System/Library/CoreServices/CoreTypes.bundle/Contents/Resources/com.apple.imac-unibody-27-no-optical.icns







airdrop