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-материнской платой, упомянутый в его комментарии к ответу Джеррета).
Я также проверил правильное управление памятьюс инструментами.
Я надеюсь, что кто-то найдет это полезным!