iOS 앱을 개발하다 보면 앱이 설치된 기기가 어떤 것인지 파악해야 하는 경우가 종종 있습니다. 기기에 따라 서로 다른 기능을 제공해야 하기 때문인데요. 예를 들어 iPhone X에서는 특정 기능을 제공하지만 iPhone 7에서는 제공하고 싶지 않을 수 있습니다. 이번 글에서는 iOS 애플리케이션 내에서 현재 사용 중인 기기를 식별하는 방법을 알아보겠습니다.
기기 정보를 얻기 위해 알아야 할 핵심 개념
원하는 결과를 얻으려면 먼저 몇 가지 용어를 이해해야 합니다.
utsname
iOS의 Darwin 모듈에 위치한 구조체(structure)로, 시스템 관련 정보를 담고 있습니다.
uname
utsname을 입력으로 받아 Int32를 반환하는 함수입니다. 시스템 정보를 조회할 때 사용됩니다.
Mirror
Swift의 리플렉션 도구로, 임의의 타입 인스턴스의 하위 구조와 표시 스타일을 나타냅니다.
간단한 기기 이름 확인 방법
iOS SDK에서 현재 사용 중인 기기를 찾는 것은 어렵지 않습니다. 단순히 모델명이나 기기 이름만 필요하다면 아래 코드만으로도 문자열을 반환받을 수 있습니다.
UIDevice.current.model // "iPhone", "iPad" 등 UIDevice.current.name // "홍길동의 iPhone" 등
하지만 위 코드는 정확한 기기 모델을 알려주지 않습니다. 단지 iPhone이 사용 중이라는 사실만 알려줄 뿐입니다. iPhone 7인지 iPhone X인지 등 정확한 기기를 확인하려면 추가적인 과정이 필요합니다.
정확한 기기 모델 코드 얻기
Swift에서는 앞서 소개한 개념들을 활용해 기기 고유 번호(identifier)를 출력으로 얻을 수 있습니다.
func getDevice() -> String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}
return identifier
}이 함수는 기기의 모델 코드(예: "iPhone9,1")를 반환합니다. 다만 이것 자체가 사람이 읽기 쉬운 기기 이름은 아니므로, 반환된 identifier 값을 여러 값과 비교하여 실제 모델명으로 변환해야 합니다.
예를 들어 iOS 12.0이 설치된 iPhone 7 Plus 시뮬레이터에서 위 코드를 실행하면 아래와 같은 결과가 출력됩니다.

Apple 기기 모델 코드 대조표
주요 Apple 기기들의 모델 코드와 그에 해당하는 실제 기기명은 다음과 같습니다.
| iPod4,1 | iPod Touch 4G |
| iPod5,1 | iPod Touch 5G |
| iPod7,1 | iPod Touch 6G |
| iPhone3,1 / iPhone3,2 / iPhone3,3 | iPhone 4 |
| iPhone4,1 | iPhone 4s |
| iPhone5,1 / iPhone5,2 | iPhone 5 |
| iPhone5,3 / iPhone5,4 | iPhone 5c |
| iPhone6,1 / iPhone6,2 | iPhone 5s |
| iPhone7,2 | iPhone 6 |
| iPhone7,1 | iPhone 6 Plus |
| iPhone8,1 | iPhone 6s |
| iPhone8,2 | iPhone 6s Plus |
| iPhone8,4 | iPhone SE |
| iPhone9,1 / iPhone9,3 | iPhone 7 |
| iPhone9,2 / iPhone9,4 | iPhone 7 Plus |
| iPad2,1 / iPad2,2 / iPad2,3 / iPad2,4 | iPad 2 |
| iPad3,1 / iPad3,2 / iPad3,3 | iPad 3 |
| iPad3,4 / iPad3,5 / iPad3,6 | iPad 4 |
| iPad4,1 / iPad4,2 / iPad4,3 | iPad Air |
| iPad5,3 / iPad5,4 | iPad Air 2 |
| iPad2,5 / iPad2,6 / iPad2,7 | iPad Mini |
| iPad4,4 / iPad4,5 / iPad4,6 | iPad Mini 2 |
| iPad4,7 / iPad4,8 / iPad4,9 | iPad Mini 3 |
| iPad5,1 / iPad5,2 | iPad Mini 4 |
| iPad6,3 / iPad6,4 | iPad Pro (9.7인치) |
| iPad6,7 / iPad6,8 | iPad Pro (12.9인치) |
마무리
이렇게 utsname 구조체와 uname 함수, Mirror를 조합하면 앱이 실행 중인 기기의 정확한 모델 코드를 얻을 수 있고, 이를 대조표와 비교해 실제 기기명으로 변환할 수 있습니다. 참고로 최신 Swift 버전에서는 UIDevice.current.modelName 확장이나 서드파티 라이브러리(예: DeviceKit)를 활용하면 더욱 간편하게 처리할 수도 있습니다. 기기별 맞춤 기능을 제공해야 하는 앱을 개발할 때 이 방법을 유용하게 활용해 보세요.