Existe uma maneira de obter o nome do modelo do dispositivo (iPhone 4S, iPhone 5, iPhone 5S etc.) no Swift?
Sei que existe uma propriedade chamada, UIDevice.currentDevice().model
mas ela retorna apenas o tipo de dispositivo (iPod touch, iPhone, iPad, iPhone Simulator etc.).
Eu também sei que isso pode ser feito facilmente no Objective-C com este método:
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
Mas como estou desenvolvendo meu aplicativo para iPhone no Swift, alguém poderia me ajudar com a maneira equivalente de resolver isso no Swift?
Respostas:
Eu fiz essa extensão "pura Swift"
UIDevice
.Esta versão funciona no Swift 2 ou superior. Se você usa uma versão anterior, use uma versão mais antiga da minha resposta .
Se você está procurando uma solução mais elegante, pode usar minha estrutura µ
DeviceKit
publicada no GitHub (também disponível via CocoaPods, Carthage e Swift Package Manager).Aqui está o código:
Você chama assim:
Para dispositivos reais, ele retorna, por exemplo, "iPad Pro 9,7 polegadas", para simuladores, retorna "Simulator" + identificador de simulador, por exemplo, "Simulator iPad Pro 9,7 polegadas"
fonte
Este exemplo do Swift 3.0 retorna o modelo de dispositivo atual como uma
enum
constante (para evitar comparações diretas com literais de string). O valor bruto da enumeração é umString
contendo o nome do dispositivo iOS legível por humanos. Como é Swift, a lista de dispositivos reconhecidos inclui apenas modelos recentes o suficiente para oferecer suporte a versões do iOS que incluem Swift. O exemplo de uso a seguir utiliza a implementação no final desta resposta:Seu aplicativo deve ser atualizado para lançamentos de novos dispositivos e também quando a Apple adicionar novos modelos para a mesma família de dispositivos. Por exemplo, iPhone3,1 iPhone3,2 iPhone3,4 são todos "iPhone 4". Evite escrever código que não seja responsável por novos modelos, para que seus algoritmos não falhem inesperadamente na configuração ou resposta a um novo dispositivo. Você pode consultar esta lista mantida de modelos de dispositivos iOS para atualizar seu aplicativo em momentos estratégicos.
O iOS inclui interfaces independentes de dispositivo para detectar recursos e parâmetros de hardware, como tamanho da tela. As interfaces generalizadas fornecidas pela Apple são geralmente os mecanismos mais seguros e com melhor suporte para adaptar dinamicamente o comportamento de um aplicativo a diferentes hardwares. No entanto, o código a seguir pode ser útil para prototipagem, depuração, teste ou qualquer código de tempo necessário para atingir uma família de dispositivos específica. Essa técnica também pode ser útil para descrever o dispositivo atual por seu nome comum / reconhecido publicamente.
Swift 3
fonte
modelMap
que fazem o iOS reclamar:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
. A solução alternativa pode decodificar o CString primeiro e depois alimentar a string decodificada comomodelMap
`if let (str, _) = String.decodeCString (modelCode, como: UTF8.self, repairingInvalidCodeUnits: false) {if let model = modelMap [str] {return model} } `if let model = modelMap[String.init(validatingUTF8: deviceModelCode()!)!] { return model }
Swift 5.2.x, dispositivo e simulador atualizados para 2020
e o novo iPad Pro 11 " , iPad Air de 3ª geração e iPad Pro 3 de geração , iPhone 11, 11 Pro e 11 Pro Max e iPhone SE de 2ª geração .
Este método detecta o modelo correto, mesmo que seja um simulador. ( O nome exato do modelo do dispositivo do simulador em execução no seu simulador )
Uso : Você pode simplesmente obter o modelo do dispositivo com:
ou imprima a string exata com:
Outro exemplo com casos :
Para modelos de dispositivos Apple, visite: https://www.theiphonewiki.com/wiki/Models
fonte
UIDevice().type.rawvalue
para obter o nome do dispositivo com espaços.UIDevice().type
, e se eu adicionar.rawvalue
ao final do que, eu recebo um erro dizendo: Valor do tipo 'Modelo' não tem 'valorbruto' membrorawvalue
, este não é mais necessário com o Swift 5 , atualizei essa linha. Testei agora o código e ele funciona corretamente. Que tipo de dispositivo você está tentando testar? Você tem outrasUIDevice
extensões no seu prj?UIDevice
extensão além da sua (alojada em um arquivo rápido dedicado).iPhone12,8
Ainda outra alternativa / simples (referência de identificador de modelo encontrada em https://www.theiphonewiki.com/wiki/Models ):
Resposta atualizada para o Swift 3/4/5, incluindo corte de cordas e suporte ao simulador:
fonte
Fiz outra extensão de exemplo no UIDevice para incluir a base do identificador de modelo do simulador na resposta do @ HAS . Está funcionando bem com o Swift3.2 acima (inclua o Swift 4.x, o Swift 5):
Adicionar novos modelos: iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max
fonte
Para dispositivos e simuladores, crie um novo arquivo rápido com o nome UIDevice.swift
Adicione o código abaixo
Então, no seu viewcontroller,
fonte
Lidar com estruturas c é doloroso rapidamente. Especialmente se eles tiverem algum tipo de matriz c. Aqui está a minha solução: Continue a usar o objetivo-c. Basta criar uma classe de objetivo-c do wrapper que faça esse trabalho e, em seguida, use essa classe rapidamente. Aqui está um exemplo de classe que faz exatamente isso:
No lado rápido:
fonte
x86_64
a partir deutsname
é que o simulador é realmente o computador que tem amachine
propriedadex86_64
. Tente mudar.machine
para.nodename
no seu método o valor de retorno será algo comoMy-iMac.local
.Eu implementei uma biblioteca super leve para detectar o dispositivo usado com base em algumas das respostas fornecidas: https://github.com/schickling/Device.swift
Ele pode ser instalado via Cartago e ser usado assim:
fonte
Eu descobri que muitas dessas respostas usam strings. Decidi alterar a resposta @HAS para usar uma enumeração:
fonte
Usando o Swift 3 (Xcode 8.3)
Nota: De acordo com a resposta oficial do fórum de desenvolvedores, é seguro usar tuplas dessa maneira. O alinhamento de memória para a grande tupla Int8 será o mesmo como se fosse uma grande matriz Int8. ou seja: contíguo e não preenchido.
fonte
Swift 5
fonte
Existem alguns problemas com a resposta aceita quando você está usando o Swift 3! Esta resposta (inspirada em NAZIK) funciona com o Swift 3 e os novos modelos do iPhone:
fonte
Swift 3.0 ou superior
e adicione a seguinte extensão
fonte
Aqui uma modificação sem forçar a desembrulhar e o Swift 3.0:
fonte
Você pode usar a estrutura BDLocalizedDevicesModels para analisar as informações do dispositivo e obter o nome.
Em seguida, basta chamar
UIDevice.currentDevice.productName
seu código.fonte
Abaixo está o código para obter a cadeia de hardware, mas você precisa comparar essas cadeias de hardware para saber qual dispositivo é. Eu criei uma classe para que contém quase todas as strings de dispositivos (estamos mantendo as strings atualizadas com novos dispositivos). É fácil de usar, verifique
Swift : GitHub / DeviceGuru
Objetivo-C : GitHub / DeviceUtil
fonte
Se você não quiser continuar atualizando seu código sempre que a Apple adicionar um novo modelo a uma família de dispositivos, use o método abaixo, retornando apenas o código do modelo.
fonte
SWIFT 3.1
meus dois centavos por simplesmente chamar utsname:
como outros, mas um pouco mais limpo sobre toda a complexidade de C / Swift e vice-versa. ):
Retorna valores como "x86_64"
fonte
Usando um 'switch-case' Swift:
fonte
Minha solução simples agrupada por dispositivo e suporta novos dispositivos
iPhone 8
eiPhone X
emSwift 3
:E use:
fonte
Com base nesta resposta e nesta resposta . Eu criei uma essência pública
Como pode ser usado
Este é o código dentro da essência
fonte
Maneira mais simples de obter o nome do modelo (nome de marketing)
Use a API privada com
-[UIDevice _deviceInfoForKey:]
cuidado, você não será rejeitado pela Apple,Como obtive a chave "marketing-name"?
Executando em um simulador,
NSProcessInfo.processInfo.environment
contém uma chave chamada "SIMULATOR_CAPABILITIES", cujo valor é um arquivo plist. Em seguida, abra o arquivo plist, você receberá a chave "nome do marketing" do nome do modelo.fonte
No Swift 3 seria
fonte
fonte
fonte
Existe uma biblioteca auxiliar para isso.
Swift 5
Swift 4.0 - Swift 4.2
se você apenas deseja determinar o modelo e fazer algo de acordo.
Você pode usar assim:
Em uma função:
fonte
fonte