Existe-t-il un moyen d'obtenir le nom du modèle de l'appareil (iPhone 4S, iPhone 5, iPhone 5S, etc.) dans Swift?
Je sais qu'il existe une propriété nommée, UIDevice.currentDevice().model
mais elle ne renvoie que le type d'appareil (iPod touch, iPhone, iPad, iPhone Simulator, etc.).
Je sais aussi que cela peut être fait facilement en Objective-C avec cette méthode:
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
Mais je développe mon application iPhone dans Swift, alors quelqu'un pourrait-il m'aider avec la manière équivalente de résoudre ce problème dans Swift?
Réponses:
J'ai fait cette extension "pure Swift" sur
UIDevice
.Cette version fonctionne dans Swift 2 ou supérieur Si vous utilisez une version antérieure, veuillez utiliser une version plus ancienne de ma réponse .
Si vous cherchez une solution plus élégante, vous pouvez utiliser mon µ-framework
DeviceKit
publié sur GitHub (également disponible via CocoaPods, Carthage et Swift Package Manager).Voici le code:
Vous l'appelez comme ceci:
Pour les appareils réels, il renvoie par exemple "iPad Pro 9.7 pouces", pour les simulateurs, il renvoie "Simulator" + identifiant Simulator, par exemple "Simulator iPad Pro 9.7 pouces"
la source
Cet exemple Swift 3.0 renvoie le modèle de périphérique actuel sous forme de
enum
constante (pour éviter les comparaisons directes avec les littéraux de chaîne). La valeur brute de l'énumération est unString
contenant le nom du périphérique iOS lisible par l'homme. Comme il s'agit de Swift, la liste des appareils reconnus ne comprend que des modèles suffisamment récents pour prendre en charge les versions iOS qui incluent Swift. L'exemple d'utilisation suivant utilise l'implémentation à la fin de cette réponse:Votre application doit être maintenue à jour pour les nouvelles versions d'appareils et également lorsque Apple ajoute de nouveaux modèles pour la même famille d'appareils. Par exemple, iPhone3,1 iPhone3,2 iPhone3,4 sont tous «iPhone 4». Évitez d'écrire du code qui ne prend pas en compte les nouveaux modèles, afin que vos algorithmes ne parviennent pas de manière inattendue à configurer ou à répondre à un nouveau périphérique. Vous pouvez vous référer à cette liste maintenue des modèles de périphériques iOS pour mettre à jour votre application à des moments stratégiques.
iOS comprend des interfaces indépendantes de l'appareil pour détecter les capacités matérielles et les paramètres tels que la taille de l'écran. Les interfaces généralisées fournies par Apple sont généralement les mécanismes les plus sûrs et les mieux pris en charge pour adapter dynamiquement le comportement d'une application à différents matériels. Néanmoins, le code suivant peut être utile pour le prototypage, le débogage, les tests ou tout code temporel nécessaire pour cibler une famille de périphériques spécifique. Cette technique peut également être utile pour décrire le périphérique actuel par son nom commun / reconnu publiquement.
Swift 3
la source
modelMap
qui font que iOS se plaint:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
. La solution de contournement peut être le décodage de CString en premier, puis l'alimentation de la chaîne décodée enmodelMap
`if let (str, _) = String.decodeCString (modelCode, as: 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, appareil et simulateur mis à jour jusqu'en 2020
et le tout dernier iPad Pro 11 " , iPad Air 3e génération et iPad Pro 3 génération , iPhone 11, 11 Pro et 11 Pro Max et iPhone SE 2e génération .
Cette méthode détecte le bon modèle même s'il s'agit d'un simulateur. ( Le nom exact du modèle d'appareil de simulation exécuté dans votre simulateur )
Utilisation : Vous pouvez simplement obtenir le modèle d'appareil avec:
ou imprimez la chaîne exacte avec:
Un autre exemple avec des cas :
Pour les modèles d'appareils Apple, visitez: https://www.theiphonewiki.com/wiki/Models
la source
UIDevice().type.rawvalue
pour obtenir le nom du périphérique avec des espaces.UIDevice().type
, et si j'ajoute.rawvalue
à la fin de cela, j'obtiens une erreur indiquant: La valeur de type 'Model' n'a pas de membre 'rawvalue'rawvalue
, celui-ci n'est plus nécessaire avec Swift 5 , j'ai mis à jour cette ligne. J'ai maintenant testé le code et il fonctionne correctement, quel type d'appareil essayez-vous de tester? Avez-vous d'autresUIDevice
extensions dans votre prj?UIDevice
extension que la vôtre (hébergée dans un fichier swift dédié).iPhone12,8
Encore une autre alternative / simple (référence d'identifiant de modèle trouvée sur https://www.theiphonewiki.com/wiki/Models ):
Réponse mise à jour pour Swift 3/4/5, y compris la coupe des cordes et le support du simulateur:
la source
J'ai fait un autre exemple d'extension sur UIDevice pour inclure la base d'identifiant de modèle de simulateur dans la réponse de @ HAS . Cela fonctionne bien avec Swift3.2 ci-dessus (y compris Swift 4.x, Swift 5):
Nouveaux modèles d'ajout: iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max
la source
Pour les appareils et les simulateurs, créez un nouveau fichier swift avec le nom UIDevice.swift
Ajoutez le code ci-dessous
Ensuite, dans votre viewcontroller,
la source
Gérer les structures est douloureux en rapide. Surtout s'ils contiennent une sorte de tableaux c. Voici ma solution: Continuez à utiliser objective-c. Créez simplement une classe objective-c wrapper qui fait ce travail, puis utilisez cette classe en swift. Voici un exemple de classe qui fait exactement cela:
Côté rapide:
la source
x86_64
deutsname
est que le simulateur est en fait votre ordinateur qui a lamachine
propriétéx86_64
. Essayez en changeant.machine
en.nodename
dans votre méthode la valeur de retour sera quelque chose commeMy-iMac.local
.J'ai implémenté une bibliothèque ultra-légère pour détecter le périphérique utilisé en fonction de certaines des réponses données: https://github.com/schickling/Device.swift
Il peut être installé via Carthage et utilisé comme ceci:
la source
J'ai trouvé que beaucoup de ces réponses utilisent toutes des chaînes. J'ai décidé de changer la réponse @HAS pour utiliser une énumération:
la source
Utilisation de Swift 3 (Xcode 8.3)
Remarque: Selon la réponse officielle du forum de développement, il est sûr d'utiliser des tuples de cette manière. L'alignement de la mémoire pour le grand tuple Int8 sera le même que s'il s'agissait d'un grand tableau Int8. c'est-à-dire: contiguë et non rembourrée.
la source
Swift 5
la source
Il y a quelques problèmes avec la réponse acceptée lorsque vous utilisez Swift 3! Cette réponse (inspirée de NAZIK) fonctionne avec Swift 3 et les nouveaux modèles d'iPhone:
la source
Swift 3.0 ou supérieur
et ajoutez l'extension suivante
la source
Voici une modification sans déballage forcé et Swift 3.0:
la source
Vous pouvez utiliser le cadre BDLocalizedDevicesModels pour analyser les informations sur le périphérique et obtenir le nom.
Ensuite, appelez simplement
UIDevice.currentDevice.productName
votre code.la source
Vous trouverez ci-dessous le code pour obtenir la chaîne matérielle, mais vous devez comparer ces chaînes matérielles pour savoir de quel périphérique il s'agit. J'ai créé une classe pour qui contient presque toutes les chaînes de périphérique (nous gardons la chaîne à jour avec les nouveaux périphériques). Il est facile à utiliser, veuillez vérifier
Swift : GitHub / DeviceGuru
Objectif-C : GitHub / DeviceUtil
la source
Si vous ne souhaitez pas continuer à mettre à jour votre code à chaque fois qu'Apple ajoute un nouveau modèle à une famille d'appareils, utilisez la méthode ci-dessous pour vous renvoyer uniquement le code du modèle.
la source
SWIFT 3.1
mes deux cents pour avoir simplement appelé utsname:
comme les autres l'ont fait, mais un peu plus propre sur toute la complexité de C / Swift et du dos. ):
Renvoie des valeurs telles que "x86_64"
la source
Utilisation d'un boîtier de commutation Swift:
la source
Ma solution simple regroupée par appareil et prend en charge de nouveaux appareils
iPhone 8
etiPhone X
enSwift 3
:Et utilise:
la source
Sur la base de cette réponse et de cette réponse . J'ai créé un aperçu public
Comment peut-il être utilisé
Ceci est le code à l'intérieur de l'essentiel
la source
Moyen le plus simple d'obtenir le nom du modèle (nom marketing)
Utilisez soigneusement l' API privée
-[UIDevice _deviceInfoForKey:]
, vous ne serez pas rejeté par Apple,Comment ai-je obtenu la clé "marketing-name"?
Fonctionnant sur un simulateur,
NSProcessInfo.processInfo.environment
contient une clé nommée "SIMULATOR_CAPABILITIES", dont la valeur est un fichier plist. Ensuite, vous ouvrez le fichier plist, vous obtiendrez la clé du nom du modèle "marketing-name".la source
Dans Swift 3, ce serait
la source
la source
la source
Il existe une bibliothèque d' aide pour cela.
Swift 5
Swift 4.0 - Swift 4.2
si vous voulez juste déterminer le modèle et faire quelque chose en conséquence.
Vous pouvez utiliser comme ça:
Dans une fonction:
la source
la source