Уникальный идентификатор Mac?
На iPhone я могу использовать
[[UIDevice currentDevice] uniqueIdentifier];
чтобы получить строку, которая идентифицирует это устройство. Есть ли что-то равное в OSX? Я ничего не нашел. Я просто хочу определить Mac, который начал приложение. Можете ли вы мне помочь?
Ответы
Ответ 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.