Уникальный идентификатор Mac? - PullRequest
25 голосов
/ 03 мая 2011

На iPhone я могу использовать

[[UIDevice currentDevice] uniqueIdentifier];

чтобы получить строку, которая идентифицирует это устройство. Есть ли что-нибудь равное в OSX? Я ничего не нашел. Я просто хочу определить Mac, который запустил приложение. Вы можете мне помочь?

Ответы [ 3 ]

31 голосов
/ 03 мая 2011

У Apple есть technote для уникальной идентификации Mac. Вот слегка измененная версия кода, который Apple опубликовала в этом техническом замечании ... не забудьте связать свой проект с IOKit.framework, чтобы построить это:

#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;
}
17 голосов
/ 21 ноября 2015

Swift 2 Answer

Этот ответ дополняет ответ Джаррет Харди 2011 года.Это расширение Swift 2 String.Я добавил встроенные комментарии, чтобы объяснить, что я сделал и почему, поскольку навигация о том, нужно ли освобождать объект, может быть сложной здесь.

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

    }

}

В качестве альтернативы, функция может возвращать String? ипоследняя строка может не возвращать пустую строку.Это может упростить распознавание экстремальных ситуаций, когда серийный номер не может быть восстановлен (например, сценарий с отремонтированным Mac-материнской платой, упомянутый в его комментарии к ответу Джеррета).

Я также проверил правильное управление памятьюс инструментами.

Я надеюсь, что кто-то найдет это полезным!

1 голос
/ 19 июня 2014

Спасибо.Прекрасно работает после изменения

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

TO

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

__bridge рекомендуется самой Xcode.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...