iOS 애플리케이션을 개발하다 보면 앱이 설치된 기기가 어떤 것인지 파악해야 하는 경우가 종종 있습니다. 예를 들어, 특정 기능은 iPhone X에서는 제공하지만 iPhone 7에서는 제공하고 싶지 않은 상황이 있을 수 있습니다. 이 글에서는 iOS 앱 내부에서 현재 사용 중인 기기를 식별하는 방법을 단계별로 알아보겠습니다.
기기 식별에 필요한 핵심 개념
원하는 결과를 얻기 위해 먼저 알아두어야 할 용어들이 있습니다.
utsname — iOS의 Darwin 모듈에 포함된 구조체(structure)로, 시스템 정보를 담고 있습니다.
uname — utsname 구조체를 입력으로 받아 Int32 값을 반환하는 함수입니다.
간단한 방법: UIDevice 활용하기
iOS SDK에서 사용 중인 기기를 찾는 것은 생각보다 간단합니다. 만약 기기의 모델명이나 이름만 필요하다면 아래 코드 중 하나를 사용하면 문자열 형태의 결과를 얻을 수 있습니다.
- UIDevice.current.localizedModel
- UIDevice.current.model
- UIDevice.current.name
하지만 위 코드들은 정확한 기기 모델을 알려주지 않는다는 한계가 있습니다. 예를 들어 "iPhone"이라는 사실만 알려줄 뿐, iPhone 7인지 iPhone X인지는 구분해주지 않습니다. 정확한 기기 정보를 얻으려면 추가적인 과정이 필요합니다.
Objective-C에서 기기 모델 확인하기
Objective-C에서는 다음과 같이 구현할 수 있습니다.
NSString* deviceName() {
struct utsname systemInfo;
uname(&systemInfo);
return [NSString stringWithCString:systemInfo.machine encoding:NSUTF8StringEncoding];
}Swift에서 기기 모델 확인하기
Swift에서는 Mirror라는 개념을 활용합니다. Mirror는 임의 타입 인스턴스의 하위 구조와 표시 스타일을 나타내는 객체로, 구조체 내부 값을 동적으로 읽어올 때 유용하게 사용됩니다.
앞서 설명한 utsname, uname, Mirror를 모두 활용하여 기기 식별자(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,2")를 반환하지만, 사람이 읽기 쉬운 기기 이름 자체를 반환하지는 않습니다. 따라서 반환된 identifier 변수를 여러 값과 비교하여 실제 모델명으로 변환하는 작업이 필요합니다.
다음은 iPhone 7 Plus 시뮬레이터에서 위 코드를 실행했을 때의 결과 화면입니다.

Apple 기기 모델 코드 대조표
아래는 주요 Apple 기기들의 모델 코드와 그에 해당하는 실제 기기명 목록입니다. 반환받은 identifier와 비교할 때 참고하세요.
| 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 |
| iPhone7,2 | iPhone 6 |
| iPhone7,1 | iPhone 6 Plus |
| iPhone8,1 | iPhone 6s |
| iPhone8,2 | iPhone 6s Plus |
| iPhone8,4 | iPhone SE (1세대) |
| iPhone9,1 / iPhone9,3 | iPhone 7 |
| iPhone9,2 / iPhone9,4 | iPhone 7 Plus |
| iPad2,1 ~ iPad2,4 | iPad 2 |
| iPad3,1 ~ iPad3,3 | iPad 3 |
| iPad3,4 ~ iPad3,6 | iPad 4 |
| iPad4,1 ~ iPad4,3 | iPad Air |
| iPad5,3 / iPad5,4 | iPad Air 2 |
| iPad2,5 ~ iPad2,7 | iPad Mini |
| iPad4,4 ~ iPad4,6 | iPad Mini 2 |
| iPad4,7 ~ 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인치) |
마무리
정리하면, UIDevice의 model 속성만으로는 대략적인 기기 종류(iPhone, iPad, iPod)만 알 수 있지만, uname 함수와 utsname 구조체를 통해 얻은 machine 값을 해석하면 세부 모델까지 정확하게 식별할 수 있습니다. 이렇게 얻은 모델 코드를 위 표와 매핑하면 기기별 맞춤 기능을 손쉽게 구현할 수 있습니다.