español apple cocoa macos uniqueidentifier

cocoa - apple - Identificador único de una Mac?



cocoa touch español (3)

En un iPhone puedo usar

[[UIDevice currentDevice] uniqueIdentifier];

para obtener una cadena que identifica este dispositivo. ¿Hay algo igual en OSX? No encontré nada. Solo quiero identificar la Mac que inició la aplicación. Me puedes ayudar ?


Apple tiene una technote sobre la identificación única de un mac. Aquí hay una versión modificada del código que Apple ha publicado en esa IOKit.framework ... no olvide vincular su proyecto con IOKit.framework para construir esto:

#import <IOKit/IOKitLib.h> - (NSString *)serialNumber { io_service_t platformExpert = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")); CFStringRef serialNumberAsCFString = NULL; if (platformExpert) { serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert, CFSTR(kIOPlatformSerialNumberKey), kCFAllocatorDefault, 0); IOObjectRelease(platformExpert); } NSString *serialNumberAsNSString = nil; if (serialNumberAsCFString) { serialNumberAsNSString = [NSString stringWithString:(NSString *)serialNumberAsCFString]; CFRelease(serialNumberAsCFString); } return serialNumberAsNSString; }


Gracias. Funciona perfectamente después de cambiar

serialNumberAsNSString = [NSString stringWithString:(NSString *)serialNumberAsCFString];

A

serialNumberAsNSString = [NSString stringWithString:(__bridge NSString *)serialNumberAsCFString];

El __bridge es recomendado por el propio Xcode.


Respuesta rápida 2

Esta respuesta aumenta la respuesta de 2011 de Jarret Hardie. Es una extensión Swift 2 String. He agregado comentarios en línea para explicar lo que hice y por qué, ya que navegar por la necesidad de liberar o no un objeto puede ser complicado aquí.

extension String { static func macSerialNumber() -> String { // Get the platform expert let platformExpert: io_service_t = IOServiceGetMatchingService(kIOMasterPortDefault, IOServiceMatching("IOPlatformExpertDevice")); // Get the serial number as a CFString ( actually as Unmanaged<AnyObject>! ) let serialNumberAsCFString = IORegistryEntryCreateCFProperty(platformExpert, kIOPlatformSerialNumberKey, kCFAllocatorDefault, 0); // Release the platform expert (we''re responsible) IOObjectRelease(platformExpert); // Take the unretained value of the unmanaged-any-object // (so we''re not responsible for releasing it) // and pass it back as a String or, if it fails, an empty string return (serialNumberAsCFString.takeUnretainedValue() as? String) ?? "" } }

Alternativamente, la función podría devolver String? y la última línea no pudo devolver una cadena vacía. Eso podría hacer que sea más fácil reconocer las situaciones extremas en las que no se pudo recuperar el número de serie (como el escenario de harrisg de la placa madre reparado mencionado en su comentario a la respuesta de Jerret).

También verifiqué la correcta gestión de la memoria con los instrumentos.

¡Espero que alguien lo encuentre útil!