Czy istnieje sposób na uzyskanie nazwy modelu urządzenia (iPhone 4S, iPhone 5, iPhone 5S itp.) W Swift?
Wiem, że istnieje właściwość o nazwie, UIDevice.currentDevice().model
ale zwraca tylko typ urządzenia (iPod touch, iPhone, iPad, iPhone Simulator itp.).
Wiem też, że można to łatwo zrobić w Objective-C za pomocą tej metody:
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
Ale rozwijam moją aplikację na iPhone'a w Swift, aby ktoś mógł mi pomóc w równoważny sposób rozwiązania tego problemu w Swift?
Odpowiedzi:
Zrobiłem to „czyste Swift” rozszerzenie
UIDevice
.Ta wersja działa w Swift 2 lub wyższej. Jeśli używasz wcześniejszej wersji, użyj starszej wersji mojej odpowiedzi .
Jeśli szukasz bardziej eleganckiego rozwiązania, możesz użyć mojej platformy µ
DeviceKit
opublikowanej na GitHub (dostępnej również za pośrednictwem CocoaPods, Carthage i Swift Package Manager).Oto kod:
Nazywasz to tak:
W przypadku rzeczywistych urządzeń zwraca np. „IPad Pro 9.7 Cal”, w przypadku symulatorów zwraca „Symulator” + identyfikator symulatora, np. „Symulator iPad Pro 9.7 Cal”
źródło
Ten przykład Swift 3.0 zwraca bieżący model urządzenia jako
enum
stałą (aby uniknąć bezpośrednich porównań z literałami łańcuchowymi). Surowa wartość wyliczeniaString
zawiera czytelną dla człowieka nazwę urządzenia iOS. Ponieważ jest to Swift, lista rozpoznanych urządzeń zawiera tylko modele wystarczająco nowe, aby obsługiwać wydania iOS zawierające Swift. Poniższy przykład użycia wykorzystuje implementację na końcu tej odpowiedzi:Twoja aplikacja powinna być na bieżąco aktualizowana o nowe wydania urządzeń, a także kiedy Apple doda nowe modele dla tej samej rodziny urządzeń. Na przykład iPhone3,1 iPhone3,2 iPhone3,4 to „iPhone 4”. Unikaj pisania kodu, który nie uwzględnia nowych modeli, aby Twoje algorytmy nie niespodziewanie nie skonfigurowały się ani nie zareagowały na nowe urządzenie. Możesz skorzystać z tej utrzymywanej listy modeli urządzeń z systemem iOS, aby zaktualizować aplikację w strategicznych momentach.
iOS zawiera niezależne od urządzenia interfejsy do wykrywania możliwości sprzętowych i parametrów, takich jak rozmiar ekranu. Uogólnione interfejsy oferowane przez Apple są zwykle najbezpieczniejszymi, najlepiej obsługiwanymi mechanizmami, które dynamicznie dostosowują zachowanie aplikacji do różnych urządzeń. Niemniej jednak poniższy kod może być przydatny do prototypowania, debugowania, testowania lub w dowolnym momencie, gdy kod musi być ukierunkowany na określoną rodzinę urządzeń. Ta technika może być również przydatna do opisania bieżącego urządzenia za pomocą jego popularnej / powszechnie uznanej nazwy.
Szybki 3
źródło
modelMap
, dzięki czemu iOS narzeka:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
. Obejściem może być najpierw dekodowanie CString, a następnie podawanie zdekodowanego ciągu domodelMap
`if let (str, _) = String.decodeCString (modelCode, jako: 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, zarówno urządzenie, jak i symulator zaktualizowane do 2020 roku
oraz nowy najnowszy iPad Pro 11 " , iPad Air 3. generacji i iPad Pro 3. generacji , iPhone 11, 11 Pro i 11 Pro Max oraz iPhone SE 2. generacji .
Ta metoda wykrywa właściwy model, nawet jeśli jest to symulator. ( Dokładna nazwa modelu urządzenia symulatora działającego w symulatorze )
Zastosowanie : Możesz po prostu uzyskać model urządzenia z:
lub wydrukuj dokładny ciąg za pomocą:
Kolejny przykład z przypadkami :
Modele urządzeń Apple odwiedź: https://www.theiphonewiki.com/wiki/Models
źródło
UIDevice().type.rawvalue
podanie nazwy urządzenia ze spacjami.UIDevice().type
, a jeśli dodam.rawvalue
do tego koniec, pojawia się komunikat o błędzie: Wartość typu „Model” nie ma elementu „rawvalue”rawvalue
, ten nie jest już potrzebny w Swift 5 , zaktualizowałem ten wiersz. Przetestowałem teraz kod i działa on poprawnie, jakiego rodzaju urządzenie próbujesz przetestować? Czy masz inneUIDevice
rozszerzenia w swoim prj?UIDevice
rozszerzenia oprócz twojego (mieszczą się w dedykowanym pliku swift).iPhone12,8
Jeszcze inna / prosta alternatywa (numer identyfikacyjny modelu znajduje się na https://www.theiphonewiki.com/wiki/Models ):
Zaktualizowana odpowiedź dla Swift 3/4/5, w tym przycinanie strun i obsługa symulatora:
źródło
Zrobiłem kolejne rozszerzenie próbki na UIDevice, aby uwzględnić identyfikator modelu symulatora na podstawie odpowiedzi @ HAS . Działa dobrze z Swift3.2 powyżej (w tym Swift 4.x, Swift 5):
Nowe dodaj Modele: iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max
źródło
Zarówno dla urządzenia, jak i symulatorów, Utwórz nowy plik szybki o nazwie UIDevice.swift
Dodaj poniższy kod
Następnie w twoim kontroler widoku
źródło
Szybkie radzenie sobie z cstruktami jest bolesne. Zwłaszcza jeśli mają w sobie jakieś tablice c. Oto moje rozwiązanie: Kontynuuj używanie celu-c. Wystarczy utworzyć opakowującą klasę c celu, która wykonuje to zadanie, a następnie szybko użyć tej klasy. Oto przykładowa klasa, która robi dokładnie to:
Po szybkiej stronie:
źródło
x86_64
zutsname
to, że symulator jest w rzeczywistości komputer, który mamachine
właściwośćx86_64
. Spróbuj zmieniając.machine
się.nodename
w sposób wartość zwracana będzie coś podobnegoMy-iMac.local
.Zaimplementowałem superlekką bibliotekę do wykrywania używanego urządzenia w oparciu o niektóre z podanych odpowiedzi: https://github.com/schickling/Device.swift
Można go zainstalować za pośrednictwem Kartaginy i używać go w następujący sposób:
źródło
Odkryłem, że wiele z tych odpowiedzi używa ciągów. Postanowiłem zmienić odpowiedź @HAS, aby użyć wyliczenia:
źródło
Korzystanie z Swift 3 (Xcode 8.3)
Uwaga: zgodnie z oficjalną odpowiedzią na forum deweloperów można w ten sposób używać krotek. Wyrównanie pamięci dla dużej krotki Int8 będzie takie samo, jak gdyby była to duża tablica Int8. tj .: przylegające i nieściełkowane.
źródło
Szybki 5
źródło
Podczas używania Swift 3 występują pewne problemy z zaakceptowaną odpowiedzią! Ta odpowiedź (zainspirowana przez NAZIK) działa z Swift 3 i nowymi modelami iPhone'ów:
źródło
Swift 3.0 lub nowszy
i dodaj następujące rozszerzenie
źródło
Oto modyfikacja bez użycia siły odwijania i Swift 3.0:
źródło
Możesz użyć struktury BDLocalizedDevicesModels , aby przeanalizować informacje o urządzeniu i uzyskać nazwę.
Następnie po prostu
UIDevice.currentDevice.productName
wpisz swój kod.źródło
Poniżej znajduje się kod do pobierania ciągu sprzętowego, ale musisz porównać te ciągi sprzętowe, aby wiedzieć, które to urządzenie. Stworzyłem klasę, która zawiera prawie wszystkie ciągi urządzeń (aktualizujemy ciągi o nowe urządzenia). Jest łatwy w użyciu, sprawdź
Swift : GitHub / DeviceGuru
Cel C : GitHub / DeviceUtil
źródło
Jeśli nie chcesz ciągle aktualizować kodu za każdym razem, gdy Apple dodaje nowy model do rodziny urządzeń, skorzystaj z poniższej metody zwracając tylko kod modelu.
źródło
SWIFT 3.1
moje dwa centy za zwykłe wywołanie utsname:
podobnie jak inni, ale nieco czystszy w kwestii zawiłości C / Swift i wstecz. ):
Zwraca wartości takie jak „x86_64”
źródło
Za pomocą „skrzynki rozdzielczej” Swift:
źródło
Moje proste rozwiązanie pogrupowane według urządzenia i obsługuje nowe urządzenia
iPhone 8
oraziPhone X
wSwift 3
:I użyć:
źródło
Na podstawie tej odpowiedzi i tej odpowiedzi . Stworzyłem publiczną istotę
Jak można go używać
To jest kod wewnątrz istoty
źródło
Najprostszy sposób na uzyskanie nazwy modelu (nazwa marketingowa)
Ostrożnie używaj prywatnego API
-[UIDevice _deviceInfoForKey:]
, nie zostaniesz odrzucony przez Apple,Jak zdobyłem kluczową „nazwę marketingową”?
Uruchomiony na symulatorze
NSProcessInfo.processInfo.environment
zawiera klucz o nazwie „SIMULATOR_CAPABILITIES”, którego wartość jest plikiem plist. Następnie otworzysz plik plist, otrzymasz klucz nazwy modelu „marketing-name”.źródło
W Swift 3 byłoby to
źródło
źródło
źródło
Jest do tego biblioteka pomocnicza .
Szybki 5
Swift 4.0 - Swift 4.2
jeśli chcesz tylko określić model i odpowiednio coś zrobić.
Możesz użyć w ten sposób:
W funkcji:
źródło
źródło