2011-05-03 23 views
25

En un iPhone puedo usarIdentificador único de una Mac?

[[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 ?

+1

Marque esta pregunta: http://stackoverflow.com/questions/933460/unique-hardware-id-in-mac-os-x – Vladimir

+0

Tenga una votación actualizada y una respuesta actualizada de Swift 2. ;-) –

Respuesta

29

Apple tiene un technote en la identificación única de un mac. Aquí hay una versión ligeramente modificada del código de Apple ha publicado en la nota técnica que ... no se olvide de vincular su proyecto contra IOKit.framework con el fin de construir esta:

#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; 
} 
+0

Gracias por su respuesta, lo intentaré. No trabajé con el IOKit todavía. Pero lo echaré un vistazo. –

+0

¡Eso es genial! Realmente no entiendo el código todavía. Pero me da un número de serie. ¡Gracias! –

+1

Desafortunadamente, esta solución no funciona en el modo de 64 bits. ¿Tal vez sabes algo sobre este tema? – xyz

1

Gracias. Esta aplicación funciona perfectamente después de cambiar

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

A

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

la __bridge se recomienda por sí mismo Xcode.

16

Swift 2 Respuesta

Esta respuesta propugne 2011 la respuesta de Jarret Hardie. Es una extensión de Swift 2 String. Agregué comentarios en línea para explicar lo que hice y por qué, ya que navegar aquí para ver si un objeto necesita o no ser lanzado 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 volver String? y la última línea podría no 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 reparado de Mac-motherboard harrisg mencionado en su comentario a la respuesta de Jerret).

También verifiqué una gestión de memoria adecuada con Instruments.

¡Espero que alguien lo encuentre útil!

+0

¡Gran respuesta, gracias! –

Cuestiones relacionadas