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 ?
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;
}
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!
Merci. Fonctionne parfaitement après avoir changé
serialNumberAsNSString = [NSString stringWithString:(NSString *)serialNumberAsCFString];
serialNumberAsNSString = [NSString stringWithString:(__bridge NSString *)serialNumberAsCFString];
__pont est recommandé par Xcode.