Как определить модель iPhone в Swift: полный гайд для новичков

Онлайн-тренажер Python для начинающих

Изучайте Python легко и без перегрузки теорией. Решайте практические задачи с автоматической проверкой, получайте подсказки на русском языке и пишите код прямо в браузере — без необходимости что-либо устанавливать.

Начать курс

Как определить модель iPhone в Swift: разбор для начинающих

Вы когда-нибудь задумывались, почему ваше приложение на Swift работает идеально на iPhone 13, но на iPhone SE (второго поколения) выглядит так, будто его рисовали второпях? Или почему некоторые функции, которые вы добавили, вдруг недоступны на старых моделях? Ответ прост: разные iPhone имеют разные возможности — от размера экрана до наличия Face ID и тактильной обратной связи.

В этой статье мы разберём, как определить модель iPhone в Swift — от простого способа с UIDevice до профессионального подхода с sysctlbyname. Вы научитесь не просто получать "iPhone", а точно узнавать, стоит ли перед вами iPhone 14 Pro Max или iPhone 8. Поехали!

Почему это важно?

Каждый iOS-разработчик рано или поздно сталкивается с необходимостью адаптировать интерфейс или логику под конкретное устройство. Вот несколько реальных сценариев:

  • Адаптивный дизайн: на iPhone с "чёлочкой" (iPhone X и новее) нужно иначе располагать элементы, чем на старых моделях с кнопкой Home.
  • Оптимизация производительности: на старых устройствах (iPhone 6s, iPhone 7) стоит отключать тяжёлые анимации или эффекты.
  • Функциональные ограничения: не все модели поддерживают ARKit, LiDAR, 120 Гц дисплей или MagSafe.
  • Аналитика: понимание, какие модели используют ваши пользователи, помогает принимать продуктовые решения.

Уровень 1: UIDevice (простой, но ограниченный)

Самый простой способ — использовать встроенный класс UIDevice. Он возвращает общую информацию об устройстве, но, к сожалению, не показывает точную модель.

import UIKit

let device = UIDevice.current
print("Имя устройства: \(device.name)")
print("Модель: \(device.model)")           // "iPhone" или "iPad"
print("Система: \(device.systemName)")     // "iOS"
print("Версия: \(device.systemVersion)")   // "17.0"

Что вы получите: device.model вернёт просто "iPhone" или "iPad". Это полезно, чтобы понять, что это вообще мобильное устройство, но не для точной идентификации.

Когда использовать: если вам нужно только проверить, что приложение запущено на iPhone, а не на iPad или iPod touch. Например, для скрытия iPad-специфичных функций.

Уровень 2: sysctlbyname (профессиональный подход)

Чтобы получить точную модель iPhone, нужно обратиться к системному вызову sysctlbyname. Он возвращает строку вида "iPhone14,2" (это iPhone 13 Pro). Зная эти идентификаторы, можно сопоставить их с человекочитаемыми названиями.

Вот рабочий код на Swift:

import UIKit

func getDeviceModelCode() -> String {
    var size = 0
    sysctlbyname("hw.machine", nil, &size, nil, 0)
    var machine = [CChar](repeating: 0, count: size)
    sysctlbyname("hw.machine", &machine, &size, nil, 0)
    return String(cString: machine)
}

// Использование
let modelCode = getDeviceModelCode()
print("Код модели: \(modelCode)") // Например: "iPhone14,2"

Теперь у вас есть "iPhone14,2". Но что это за модель? Вам понадобится словарь соответствий.

Словарь моделей iPhone (актуально на 2024 год)

Ниже приведён неполный, но достаточный для большинства задач список. Полный можно найти в открытых источниках или поддерживать в виде отдельного файла.

func getDeviceModelName() -> String {
    let modelCode = getDeviceModelCode()
    
    let modelMap: [String: String] = [
        // iPhone 15 серия
        "iPhone15,4": "iPhone 15",
        "iPhone15,5": "iPhone 15 Plus",
        "iPhone16,1": "iPhone 15 Pro",
        "iPhone16,2": "iPhone 15 Pro Max",
        
        // iPhone 14 серия
        "iPhone14,7": "iPhone 14",
        "iPhone14,8": "iPhone 14 Plus",
        "iPhone15,2": "iPhone 14 Pro",
        "iPhone15,3": "iPhone 14 Pro Max",
        
        // iPhone 13 серия
        "iPhone14,4": "iPhone 13 mini",
        "iPhone14,5": "iPhone 13",
        "iPhone14,2": "iPhone 13 Pro",
        "iPhone14,3": "iPhone 13 Pro Max",
        
        // iPhone 12 серия
        "iPhone13,1": "iPhone 12 mini",
        "iPhone13,2": "iPhone 12",
        "iPhone13,3": "iPhone 12 Pro",
        "iPhone13,4": "iPhone 12 Pro Max",
        
        // iPhone 11 серия
        "iPhone12,1": "iPhone 11",
        "iPhone12,3": "iPhone 11 Pro",
        "iPhone12,5": "iPhone 11 Pro Max",
        
        // iPhone XS, XR, X
        "iPhone11,2": "iPhone XS",
        "iPhone11,4": "iPhone XS Max",
        "iPhone11,6": "iPhone XS Max (China)",
        "iPhone11,8": "iPhone XR",
        "iPhone10,3": "iPhone X",
        "iPhone10,6": "iPhone X (China)",
        
        // iPhone 8, 8 Plus, SE (2nd gen)
        "iPhone10,1": "iPhone 8",
        "iPhone10,4": "iPhone 8",
        "iPhone10,2": "iPhone 8 Plus",
        "iPhone10,5": "iPhone 8 Plus",
        "iPhone12,8": "iPhone SE (2nd generation)",
        
        // iPhone 7, 7 Plus
        "iPhone9,1": "iPhone 7",
        "iPhone9,3": "iPhone 7",
        "iPhone9,2": "iPhone 7 Plus",
        "iPhone9,4": "iPhone 7 Plus",
        
        // iPhone 6s, 6s Plus, SE (1st gen)
        "iPhone8,1": "iPhone 6s",
        "iPhone8,2": "iPhone 6s Plus",
        "iPhone8,4": "iPhone SE (1st generation)"
    ]
    
    return modelMap[modelCode] ?? "Неизвестная модель (\(modelCode))"
}

// Получаем человекочитаемое имя
let deviceName = getDeviceModelName()
print("Ваше устройство: \(deviceName)")

Уровень 3: Расширение для UIDevice (удобство и переиспользование)

Чтобы не писать одну и ту же логику каждый раз, создадим расширение для UIDevice. Это best practice в Swift-сообществе.

extension UIDevice {
    var modelCode: String {
        var size = 0
        sysctlbyname("hw.machine", nil, &size, nil, 0)
        var machine = [CChar](repeating: 0, count: size)
        sysctlbyname("hw.machine", &machine, &size, nil, 0)
        return String(cString: machine)
    }
    
    var modelName: String {
        let modelMap: [String: String] = [
            "iPhone15,4": "iPhone 15",
            "iPhone15,5": "iPhone 15 Plus",
            "iPhone16,1": "iPhone 15 Pro",
            "iPhone16,2": "iPhone 15 Pro Max",
            "iPhone14,7": "iPhone 14",
            "iPhone14,8": "iPhone 14 Plus",
            "iPhone15,2": "iPhone 14 Pro",
            "iPhone15,3": "iPhone 14 Pro Max",
            //                

Блоги

Рекомендаций по книгам