ver una saber pro mini macbook mac fecha fabricacion cuando compro como año a1181 macos cocoa multipeer-connectivity airdrop

macos - saber - ¿Hay alguna forma de obtener el ícono de Mac dado su número de modelo?



saber fecha fabricacion macbook (3)

Sé que puedes obtener el icono de la máquina actual del cacao usando el siguiente código:

NSImage *machineIcon = [NSImage imageNamed:NSImageNameComputer];

Pero, ¿es posible obtener el ícono cuando se le da solo un número de modelo? Como MacBookPro11,3 ?

La razón por la que necesito esto es porque estoy usando la MultiPeer Connectivity para navegar por los dispositivos en la red a la que me gustaría conectarme. Pero quiero mostrar los iconos de esos dispositivos en una vista de navegador personalizada.

Sé que OS X tiene casi todos los iconos para todos los dispositivos en la siguiente carpeta:

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

pero quiero saber cómo acceder a ellos desde mi aplicación:

Pensé en usar el discoveryInfo de MCNearbyServiceAdvertiser para transmitir un ícono de la publicidad del dispositivo, pero no puedes transmitir esa cantidad de datos usando discoveryInfo . Está diseñado solo para pequeñas cantidades de texto. Así que decidí simplemente transmitir el número de modelo de la máquina. Espero resolver el número de modelo de la máquina a un icono en el otro lado. AirDrop así como cómo lo hace AirDrop .


  1. Tienda de aplicaciones de Mac segura

Manualmente mapee el identificador del modelo al nombre del icono y luego use, por ejemplo

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

o

[NSImage imageNamed:NSImageNameComputer]

Si necesita una resolución más alta que imageNamed proporciona uso

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

donde la cadena "raíz" es del archivo de encabezado IconsCore.h (kComputer).

Copie este plist para obtener los identificadores (no acceda desde la zona de pruebas de la aplicación)

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

  1. Mac App Store no es seguro

Enlace al marco de trabajo privado SPSupport.Framework con su variable binaria Add FrameWork Search path

$ (SYSTEM_LIBRARY_DIR) / PrivateFrameworks

Agrega la siguiente interfaz en tu proyecto

#import <Cocoa/Cocoa.h> @interface SPDocument : NSDocument - (NSImage *)modelIcon; - (id)computerName; - (id)serialNumber; - (id)modelName; @end

Llame a su código:

SPDocument *document = [[SPDocument alloc] init]; NSImage *icon = [document modelIcon];

  1. La forma más difícil

Calcula la danza CoreFoundation con esta función privada (este código es una ilustración, busca los tipos correctos, el número de params y suelta correctamente)

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

EDITAR: Me acabo de dar cuenta de que necesita la opción número 1,3 (icono para el modelo dado). GL luchando contra esto.

EDIT2 Método 3 agregado. Cambió el orden y se agregó debajo del número 1.

EDIT3 Nuevas UTI para la versión en color 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-gray 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"];

¿Cómo obtener el número de modelo / identificador (sysctl hw.model fue reemplazado por 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];

Y analizar el identificador del modelo o la propiedad de su lista de servidores


Esta es una solución en Swift, pero usa una API privada, así que recuerda que podría estar sujeta a cambios no documentados y al rechazo de 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 } }

Si no conoce el modelo:

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

Si conoce el modelo o quiere usar otro:

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


Es posible convertir programáticamente identificadores de modelo a imágenes sin utilizar marcos privados. Este código funciona al menos en OS X 10.4 y versiones posteriores.

+ (NSImage*)imageForMachineModel:(NSString*)machineModel { NSImage* image = nil; NSString* uti = NULL; if ((machineModel != nil) && ([machineModel length] > 0)) { NSString* fixedModel = [NSString stringWithUTF8String:machineModel.UTF8String]; uti = (__bridge_transfer NSString*) UTTypeCreatePreferredIdentifierForTag(CFSTR("com.apple.device-model-code"),(__bridge CFStringRef)fixedModel,NULL); } else { // Default to a generic Mac image for null uti = (__bridge_transfer NSString*) CFStringCreateCopy(kCFAllocatorDefault,CFSTR("com.apple.mac")); } if (uti != NULL) { CFDictionaryRef utiDecl = UTTypeCopyDeclaration((__bridge CFStringRef)(uti)); if (utiDecl != NULL) { CFStringRef iconFileName = CFDictionaryGetValue(utiDecl,CFSTR("UTTypeIconFile")); if (iconFileName == NULL) { while((iconFileName == NULL) && (utiDecl != NULL) && (uti != NULL)) { // BUG: macOS 10.12 may return string or array of strings; unchecked in this implementation! uti = NULL; uti = CFDictionaryGetValue(utiDecl,CFSTR("UTTypeConformsTo")); if (uti != NULL) { CFRelease(utiDecl); utiDecl = NULL; utiDecl = UTTypeCopyDeclaration((__bridge CFStringRef)(uti)); if (utiDecl != NULL) { iconFileName = CFDictionaryGetValue(utiDecl,CFSTR("UTTypeIconFile")); } } } } if (iconFileName != NULL) { CFURLRef bundleURL = UTTypeCopyDeclaringBundleURL((__bridge CFStringRef)(uti)); if (bundleURL != NULL) { NSBundle* bundle = [NSBundle bundleWithPath:[(__bridge NSURL*)bundleURL path]]; if (bundle != nil) { NSString* iconPath = [bundle pathForResource:(__bridge NSString*)iconFileName ofType:nil]; if (iconPath != nil) { image = [[NSImage alloc] initWithContentsOfFile:iconPath]; } } CFRelease(bundleURL); } } if (utiDecl != NULL) { CFRelease(utiDecl); } } } if (image == nil) { // Do something sensible if no image found } return image; }

Tenga en cuenta que actualmente hay un error rdr://27883672 en macOS 10.12 beta 6 que se bloquea dentro de UTTypeCopyDeclaration . Esto se debe a que UTTypeConformsTo puede devolver un CFStringRef o CFArrayRef de CFStringRef . El fragmento de código asume que solo se CFStringRef una CFStringRef .

Adaptarse para Sandboxing

Para usar este código con sandboxing, evite cargar directamente el archivo de icono. En su lugar, obtenga el UTTypeIdentifier de utiDecl y páselo a NSWorkspace ''s iconForFileType .