Computer >> 컴퓨터 >  >> 프로그래밍 >> iOS

iOS SDK에서 iPhone, iPod Touch 등 기기 모델을 정확히 확인하는 방법

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 시뮬레이터에서 위 코드를 실행했을 때의 결과 화면입니다.

iOS SDK에서 iPhone, iPod Touch 등 기기 모델을 정확히 확인하는 방법

Apple 기기 모델 코드 대조표

아래는 주요 Apple 기기들의 모델 코드와 그에 해당하는 실제 기기명 목록입니다. 반환받은 identifier와 비교할 때 참고하세요.

iPod4,1iPod Touch 4G
iPod5,1iPod Touch 5G
iPod7,1iPod Touch 6G
iPhone3,1 / iPhone3,2 / iPhone3,3iPhone 4
iPhone4,1iPhone 4s
iPhone7,2iPhone 6
iPhone7,1iPhone 6 Plus
iPhone8,1iPhone 6s
iPhone8,2iPhone 6s Plus
iPhone8,4iPhone SE (1세대)
iPhone9,1 / iPhone9,3iPhone 7
iPhone9,2 / iPhone9,4iPhone 7 Plus
iPad2,1 ~ iPad2,4iPad 2
iPad3,1 ~ iPad3,3iPad 3
iPad3,4 ~ iPad3,6iPad 4
iPad4,1 ~ iPad4,3iPad Air
iPad5,3 / iPad5,4iPad Air 2
iPad2,5 ~ iPad2,7iPad Mini
iPad4,4 ~ iPad4,6iPad Mini 2
iPad4,7 ~ iPad4,9iPad Mini 3
iPad5,1 / iPad5,2iPad Mini 4
iPad6,3 / iPad6,4iPad Pro (9.7인치)
iPad6,7 / iPad6,8iPad Pro (12.9인치)

마무리

정리하면, UIDevice의 model 속성만으로는 대략적인 기기 종류(iPhone, iPad, iPod)만 알 수 있지만, uname 함수와 utsname 구조체를 통해 얻은 machine 값을 해석하면 세부 모델까지 정확하게 식별할 수 있습니다. 이렇게 얻은 모델 코드를 위 표와 매핑하면 기기별 맞춤 기능을 손쉽게 구현할 수 있습니다.