Gibt es eine Möglichkeit, den Namen des Gerätemodells (iPhone 4S, iPhone 5, iPhone 5S usw.) in Swift abzurufen?
Ich weiß, dass es eine Eigenschaft mit dem Namen gibt, die UIDevice.currentDevice().model
jedoch nur den Gerätetyp zurückgibt (iPod touch, iPhone, iPad, iPhone Simulator usw.).
Ich weiß auch, dass dies in Objective-C mit dieser Methode problemlos möglich ist:
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
Aber ich entwickle meine iPhone-App in Swift. Könnte mir bitte jemand bei der entsprechenden Lösung in Swift helfen?
Antworten:
Ich habe diese "pure Swift" -Erweiterung aktiviert
UIDevice
.Diese Version funktioniert in Swift 2 oder höher. Wenn Sie eine frühere Version verwenden, verwenden Sie bitte eine ältere Version meiner Antwort .
Wenn Sie nach einer eleganteren Lösung suchen, können Sie mein
DeviceKit
auf GitHub veröffentlichtes µ-Framework verwenden (auch über CocoaPods, Carthage und Swift Package Manager verfügbar).Hier ist der Code:
Sie nennen es so:
Für reale Geräte wird z. B. "iPad Pro 9,7 Zoll" zurückgegeben, für Simulatoren wird "Simulator" + Simulator-ID zurückgegeben, z. B. "Simulator iPad Pro 9,7 Zoll".
quelle
In diesem Swift 3.0- Beispiel wird das aktuelle Gerätemodell als
enum
Konstante zurückgegeben (um direkte Vergleiche mit Zeichenfolgenliteralen zu vermeiden). Die ENUM Roh - Wert ist eineString
der für Menschen lesbaren iOS - Gerätenamen enthält. Da es sich um Swift handelt, enthält die Liste der erkannten Geräte nur Modelle, die aktuell genug sind, um iOS-Versionen mit Swift zu unterstützen. Das folgende Verwendungsbeispiel verwendet die Implementierung am Ende dieser Antwort:Ihre App sollte für neue Geräteversionen und auch dann, wenn Apple neue Modelle für dieselbe Gerätefamilie hinzufügt, auf dem neuesten Stand gehalten werden. Zum Beispiel sind iPhone3,1 iPhone3,2 iPhone3,4 alle "iPhone 4". Vermeiden Sie das Schreiben von Code, der keine neuen Modelle berücksichtigt, damit Ihre Algorithmen nicht unerwartet ein neues Gerät konfigurieren oder darauf reagieren. Sie können sich auf diese gepflegte Liste der iOS-Gerätemodelle beziehen, um Ihre App zu strategischen Zeiten zu aktualisieren.
iOS enthält geräteunabhängige Schnittstellen zum Erkennen von Hardwarefunktionen und -parametern wie der Bildschirmgröße. Die allgemeinen Schnittstellen, die Apple bereitstellt, sind normalerweise die sichersten und am besten unterstützten Mechanismen, um das Verhalten einer App dynamisch an unterschiedliche Hardware anzupassen. Der folgende Code kann jedoch nützlich sein, um Prototypen zu erstellen, zu debuggen, zu testen oder um Code zu erhalten, der auf eine bestimmte Gerätefamilie abzielt. Diese Technik kann auch nützlich sein, um das aktuelle Gerät anhand seines allgemeinen / öffentlich anerkannten Namens zu beschreiben.
Swift 3
quelle
modelMap
, die iOS dazu bringen, sich zu beschweren:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
. Die Problemumgehung kann darin bestehen, zuerst CString zu dekodieren und dann den dekodierten String anmodelMap
`if let (str, _) = String.decodeCString (modelCode, as: UTF8.self, RepairingInvalidCodeUnits: false) {if let model = modelMap [str] {return model} zu übergeben } `if let model = modelMap[String.init(validatingUTF8: deviceModelCode()!)!] { return model }
Swift 5.2.x, Gerät und Simulator auf 2020 aktualisiert
und das neue neueste iPad Pro 11 " , iPad Air 3. Generation und iPad Pro 3 Generation , iPhone 11, 11 Pro und 11 Pro Max und iPhone SE 2. Generation .
Diese Methode erkennt das richtige Modell, auch wenn es sich um einen Simulator handelt. ( Der genaue Name für das Simulator-Gerätemodell, das in Ihrem Simulator ausgeführt wird )
Verwendung : Sie können das Gerätemodell einfach erhalten mit:
oder drucken Sie die genaue Zeichenfolge mit:
Ein weiteres Beispiel mit Fällen :
Modelle für Apple-Geräte finden Sie unter: https://www.theiphonewiki.com/wiki/Models
quelle
UIDevice().type.rawvalue
, um den Gerätenamen mit Leerzeichen zu erhalten.UIDevice().type
, und wenn ich.rawvalue
am Ende hinzufüge , erhalte ich eine Fehlermeldung: Der Wert vom Typ 'Model' hat kein Mitglied 'rawvalue'rawvalue
, dieses ist mit Swift 5 nicht mehr notwendig , ich habe diese Zeile aktualisiert. Ich habe jetzt den Code getestet und er funktioniert korrekt. Welche Art von Gerät versuchen Sie zu testen? Haben Sie andereUIDevice
Erweiterungen in Ihrem PRJ?UIDevice
Erweiterungen außer Ihrer (in einer dedizierten schnellen Datei).iPhone12,8
Eine weitere / einfache Alternative (Referenz zur Modellkennung unter https://www.theiphonewiki.com/wiki/Models ):
Aktualisierte Antwort für Swift 3/4/5 einschließlich String-Trimmen und Simulator-Unterstützung:
quelle
Ich habe eine weitere Beispielerweiterung für UIDevice vorgenommen, um eine Simulator-Modellkennung basierend auf der Antwort von @ HAS aufzunehmen . Es funktioniert gut mit Swift3.2 oben (einschließlich Swift 4.x, Swift 5):
Neue Modelle hinzufügen: iPhone 11, iPhone 11 Pro, iPhone 11 Pro max
quelle
Erstellen Sie sowohl für Geräte als auch für Simulatoren eine neue schnelle Datei mit dem Namen UIDevice.swift
Fügen Sie den folgenden Code hinzu
Dann in Ihrem Viewcontroller,
quelle
Der Umgang mit c-Strukturen ist schnell schmerzhaft. Vor allem, wenn sie eine Art C-Arrays enthalten. Hier ist meine Lösung: Verwenden Sie weiterhin Objective-C. Erstellen Sie einfach eine Wrapper Objective-C-Klasse, die diesen Job ausführt, und verwenden Sie diese Klasse dann schnell. Hier ist eine Beispielklasse, die genau dies tut:
Auf der schnellen Seite:
quelle
x86_64
ausutsname
, dass der Simulator tatsächlich Ihr Computer ist , die das hatmachine
Eigenschaftx86_64
. Versuchen Sie, indem Sie.machine
auf.nodename
den Rückgabewert in Ihrer Methode wird so etwas wie seinMy-iMac.local
.Ich habe eine superleichte Bibliothek implementiert , um das verwendete Gerät anhand einiger der angegebenen Antworten zu erkennen: https://github.com/schickling/Device.swift
Es kann über Karthago installiert und wie folgt verwendet werden:
quelle
Ich fand, dass viele dieser Antworten Zeichenfolgen verwenden. Ich habe beschlossen, die @ Has-Antwort zu ändern, um eine Aufzählung zu verwenden:
quelle
Verwenden von Swift 3 (Xcode 8.3)
Hinweis: Laut der offiziellen Antwort des Entwicklerforums ist es sicher, Tupel auf diese Weise zu verwenden. Die Speicherausrichtung für das große Int8-Tupel ist dieselbe, als wäre es ein großes Int8-Array. dh: zusammenhängend und nicht gepolstert.
quelle
Swift 5
quelle
Es gibt einige Probleme mit der akzeptierten Antwort, wenn Sie Swift 3 verwenden! Diese Antwort (inspiriert von NAZIK) funktioniert mit Swift 3 und den neuen iPhone-Modellen:
quelle
Swift 3.0 oder höher
und fügen Sie die folgende Erweiterung hinzu
quelle
Hier eine Modifikation ohne Force Unwrap und Swift 3.0:
quelle
Sie können das BDLocalizedDevicesModels- Framework verwenden, um Geräteinformationen zu analysieren und den Namen abzurufen .
Dann rufen
UIDevice.currentDevice.productName
Sie einfach Ihren Code an.quelle
Unten finden Sie den Code zum Abrufen der Hardwarezeichenfolge. Sie müssen diese Hardwarezeichenfolge jedoch vergleichen, um festzustellen, um welches Gerät es sich handelt. Ich habe eine Klasse dafür erstellt, die fast alle Gerätezeichenfolgen enthält (wir halten die Zeichenfolge mit neuen Geräten auf dem neuesten Stand). Es ist einfach zu bedienen, bitte überprüfen
Swift : GitHub / DeviceGuru
Ziel-C : GitHub / DeviceUtil
quelle
Wenn Sie Ihren Code nicht jedes Mal aktualisieren möchten, wenn Apple einer Gerätefamilie ein neues Modell hinzufügt, verwenden Sie die folgende Methode, um nur den Modellcode zurückzugeben.
quelle
SWIFT 3.1
meine zwei Cent für den einfachen Aufruf von utsname:
wie andere auch, aber ein bisschen sauberer in Bezug auf die Komplexität von C / Swift und zurück. ):
Gibt Werte wie "x86_64" zurück.
quelle
Verwenden eines Swift-Schaltkastens:
quelle
Meine einfache Lösung, gruppiert nach Gerät und Unterstützung neuer Geräte
iPhone 8
undiPhone X
inSwift 3
:Und benutze:
quelle
Basierend auf dieser Antwort und dieser Antwort . Ich habe einen öffentlichen Kern erstellt
Wie es verwendet werden kann
Dies ist der Code im Kern
quelle
Einfachster Weg, um den Modellnamen (Marketingname) zu erhalten
Verwenden Sie die private API
-[UIDevice _deviceInfoForKey:]
sorgfältig, Sie werden von Apple nicht abgelehnt.Wie habe ich den Schlüssel "Marketing-Name" bekommen?
NSProcessInfo.processInfo.environment
Wird auf einem Simulator ausgeführt und enthält einen Schlüssel mit dem Namen "SIMULATOR_CAPABILITIES", dessen Wert eine Plist-Datei ist. Wenn Sie die Plist-Datei öffnen, erhalten Sie den Schlüssel "Marketing-Name" des Modellnamens.quelle
In Swift 3 wäre es so
quelle
quelle
quelle
Es gibt eine Helfer - Bibliothek für diese.
Swift 5
Swift 4.0 - Swift 4.2
wenn Sie nur das Modell bestimmen und etwas entsprechend machen wollen.
Sie können so verwenden:
In einer Funktion:
quelle
quelle