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

Swift로 iOS 기기 종류 확인하기: iPhone, iPad, iPod Touch 모델 식별 방법

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 시뮬레이터에서 위 코드를 실행하면 아래와 같은 결과가 출력됩니다.

Swift로 iOS 기기 종류 확인하기: iPhone, iPad, iPod Touch 모델 식별 방법

Apple 기기 모델 코드 대조표

주요 Apple 기기들의 모델 코드와 그에 해당하는 실제 기기명은 다음과 같습니다.

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

마무리

이렇게 utsname 구조체와 uname 함수, Mirror를 조합하면 앱이 실행 중인 기기의 정확한 모델 코드를 얻을 수 있고, 이를 대조표와 비교해 실제 기기명으로 변환할 수 있습니다. 참고로 최신 Swift 버전에서는 UIDevice.current.modelName 확장이나 서드파티 라이브러리(예: DeviceKit)를 활용하면 더욱 간편하게 처리할 수도 있습니다. 기기별 맞춤 기능을 제공해야 하는 앱을 개발할 때 이 방법을 유용하게 활용해 보세요.