Подтвердить что ты не робот

Уникальный идентификатор Mac?

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

[[UIDevice currentDevice] uniqueIdentifier];

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

4b9b3361

Ответ 1

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;
}

Ответ 2

Свифт 2 Ответ

Этот ответ дополняет ответ Jarret Hardie 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-материнской платы harrisg, упомянутый в его комментарии к ответу Джерретта).

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

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

Ответ 3

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

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

К

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

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