Como identificar o modelo do iPhone em Swift: análise para iniciantes
\n\nVocê já se perguntou por que seu aplicativo em Swift funciona perfeitamente no iPhone 13, mas no iPhone SE (segunda geração) parece que foi desenhado às pressas? Ou por que alguns recursos que você adicionou de repente não estão disponíveis em modelos antigos? A resposta é simples: diferentes iPhones têm capacidades diferentes — desde o tamanho da tela até a presença de Face ID e feedback tátil.
\n\nNeste artigo, vamos analisar como identificar o modelo do iPhone em Swift — desde a maneira simples com UIDevice até a abordagem profissional com sysctlbyname. Você aprenderá não apenas a obter "iPhone", mas a saber exatamente se está diante de um iPhone 14 Pro Max ou um iPhone 8. Vamos lá!
\n\nPor que isso é importante?
\nTodo desenvolvedor iOS, mais cedo ou mais tarde, enfrenta a necessidade de adaptar a interface ou a lógica para um dispositivo específico. Aqui estão alguns cenários reais:
\n- \n
- Design adaptativo: no iPhone com "notch" (iPhone X e mais recentes), os elementos precisam ser posicionados de forma diferente do que em modelos antigos com botão Home. \n
- Otimização de desempenho: em dispositivos antigos (iPhone 6s, iPhone 7), vale a pena desativar animações ou efeitos pesados. \n
- Limitações funcionais: nem todos os modelos suportam ARKit, LiDAR, tela de 120 Hz ou MagSafe. \n
- Analytics: entender quais modelos seus usuários estão usando ajuda a tomar decisões de produto. \n
Nível 1: UIDevice (simples, mas limitado)
\nA maneira mais simples é usar a classe embutida UIDevice. Ela retorna informações gerais sobre o dispositivo, mas, infelizmente, não mostra o modelo exato.
import UIKit\n\nlet device = UIDevice.current\nprint("Nome do dispositivo: \\(device.name)")\nprint("Modelo: \\(device.model)") // "iPhone" ou "iPad"\nprint("Sistema: \\(device.systemName)") // "iOS"\nprint("Versão: \\(device.systemVersion)") // "17.0"\n\n\nO que você obtém: device.model retornará apenas "iPhone" ou "iPad". Isso é útil para saber que é um dispositivo móvel, mas não para identificação precisa.
Quando usar: se você só precisa verificar se o aplicativo está sendo executado em um iPhone, e não em um iPad ou iPod touch. Por exemplo, para ocultar funcionalidades específicas do iPad.
\n\nNível 2: sysctlbyname (abordagem profissional)
\nPara obter o modelo exato do iPhone, você precisa usar a chamada de sistema sysctlbyname. Ela retorna uma string no formato "iPhone14,2" (que é o iPhone 13 Pro). Conhecendo esses identificadores, você pode mapeá-los para nomes legíveis por humanos.
Aqui está o código funcional em Swift:
\n\nimport UIKit\n\nfunc getDeviceModelCode() -> String {\n var size = 0\n sysctlbyname("hw.machine", nil, &size, nil, 0)\n var machine = [CChar](repeating: 0, count: size)\n sysctlbyname("hw.machine", &machine, &size, nil, 0)\n return String(cString: machine)\n}\n\n// Uso\nlet modelCode = getDeviceModelCode()\nprint("Código do modelo: \\(modelCode)") // Exemplo: "iPhone14,2"\n\n\nAgora você tem "iPhone14,2". Mas que modelo é esse? Você precisará de um dicionário de correspondências.
Dicionário de modelos de iPhone (atualizado para 2024)
\nAbaixo está uma lista incompleta, mas suficiente para a maioria das tarefas. A lista completa pode ser encontrada em fontes abertas ou mantida como um arquivo separado.
\n\nfunc getDeviceModelName() -> String {\n let modelCode = getDeviceModelCode()\n \n let modelMap: [String: String] = [\n // Série iPhone 15\n "iPhone15,4": "iPhone 15",\n "iPhone15,5": "iPhone 15 Plus",\n "iPhone16,1": "iPhone 15 Pro",\n "iPhone16,2": "iPhone 15 Pro Max",\n \n // Série iPhone 14\n "iPhone14,7": "iPhone 14