Identificateur unique D'un Mac?

sur un iPhone je peux utiliser

[[UIDevice currentDevice] uniqueIdentifier];

pour obtenir une chaîne qui identifie ce périphérique. Y a-t-il quelque chose d'égal dans OSX ? Je n'ai pas trouver quoi que ce soit. Je veux juste identifier le Mac qui a lancé l'application. Pouvez-vous m'aider ?

25
demandé sur Paul R 2011-05-03 15:11:01

3 réponses

Apple a un note technique sur l'identification unique d'un mac. Voici une version vaguement modifiée du code Qu'Apple a posté dans cette technote... n'oubliez pas de lier votre projet contre IOKit.framework dans le but de construire ceci:

#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;
}
29
répondu Jarret Hardie 2011-05-03 11:45:25

Réponse Swift 2

Cette réponse augmente Jarret Hardie 2011 réponse. C'est une extension Swift à 2 cordes. J'ai ajouté des commentaires en ligne pour expliquer ce que j'ai fait et pourquoi, car naviguer si oui ou non un objet doit être libéré peut être délicat ici.

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) ?? ""

    }

}

alternativement, la fonction pourrait revenir String? et la dernière ligne pourrait renvoie une chaîne vide. Cela pourrait permettre de reconnaître plus facilement les situations extrêmes dans lesquelles le numéro de série n'a pas pu être retrouvé (comme le scénario réparé-Mac-carte mère harrisg mentionné dans son commentaire à la réponse de Jerret).

j'ai aussi vérifié la bonne gestion de la mémoire avec des Instruments.

j'espère que quelqu'un le trouve utile!

16
répondu Joshua Nozzi 2015-11-21 15:37:16

Merci. Fonctionne parfaitement après avoir changé

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

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

__pont est recommandé par Xcode.

1
répondu Anjaan 2014-06-19 05:49:14