Apakah ada cara untuk mendapatkan nama model perangkat (iPhone 4S, iPhone 5, iPhone 5S, dll) di Swift?
Saya tahu ada properti bernama UIDevice.currentDevice().model
tetapi hanya mengembalikan tipe perangkat (iPod touch, iPhone, iPad, iPhone Simulator, dll).
Saya juga tahu ini bisa dilakukan dengan mudah di Objective-C dengan metode ini:
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
Tetapi saya sedang mengembangkan aplikasi iPhone di Swift, jadi bisakah seseorang membantu saya dengan cara yang setara untuk menyelesaikannya di Swift?
Jawaban:
Saya membuat ekstensi "Swift murni" ini
UIDevice
.Versi ini berfungsi di Swift 2 atau lebih tinggi. Jika Anda menggunakan versi sebelumnya, silakan gunakan versi yang lebih lama dari jawaban saya .
Jika Anda mencari solusi yang lebih elegan, Anda dapat menggunakan μ-framework saya yang
DeviceKit
diterbitkan di GitHub (juga tersedia melalui CocoaPods, Carthage, dan Swift Package Manager).Berikut kodenya:
Anda menyebutnya seperti ini:
Untuk perangkat nyata ia mengembalikan misalnya "iPad Pro 9.7 Inch", untuk simulator ia mengembalikan "Simulator" + pengidentifikasi Simulator, misalnya "Simulator iPad Pro 9.7 Inch"
sumber
Ini Swift 3.0 contoh mengembalikan model perangkat saat ini sebagai
enum
konstan (untuk menghindari perbandingan langsung ke string literal). Nilai mentah enum adalah yangString
berisi nama perangkat iOS yang dapat dibaca manusia. Karena Swift, daftar perangkat yang dikenali hanya menyertakan model yang cukup baru untuk mendukung rilis iOS yang menyertakan Swift. Contoh penggunaan berikut menggunakan implementasi di akhir jawaban ini:Aplikasi Anda harus selalu diperbarui untuk rilis perangkat baru dan juga ketika Apple menambahkan model baru untuk keluarga perangkat yang sama. Misalnya, iPhone3 , 1 iPhone3 , 2 iPhone3, 4 semuanya "iPhone 4". Hindari penulisan kode yang tidak memperhitungkan model-model baru, sehingga algoritme Anda tidak terduga gagal untuk mengkonfigurasi atau merespons perangkat baru. Anda dapat merujuk ke daftar # # Device Model iOS yang dikelola ini untuk memperbarui aplikasi Anda pada waktu-waktu strategis.
iOS mencakup antarmuka yang independen terhadap perangkat untuk mendeteksi kapabilitas dan parameter perangkat keras seperti ukuran layar. Antarmuka umum yang disediakan oleh Apple biasanya merupakan mekanisme yang paling aman dan paling didukung untuk secara dinamis menyesuaikan perilaku aplikasi ke perangkat keras yang berbeda. Namun demikian, kode berikut dapat berguna untuk membuat prototipe, debugging, pengujian, atau kode waktu apa pun yang diperlukan untuk menargetkan keluarga perangkat tertentu. Teknik ini juga dapat berguna untuk menggambarkan perangkat saat ini dengan nama umum / yang dikenal publik.
Cepat 3
sumber
modelMap
yang membuat iOS mengeluh:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
. Penanganan masalah dapat mendekode CString terlebih dahulu dan kemudian mengumpankan string yang didekodekan kemodelMap
`if let (str, _) = String.decodeCString (modelCode, seperti: UTF8 sendiri, memperbaikiInvalidCodeUnits: false) {jika membiarkan model = modelMap [str] {return model} } `if let model = modelMap[String.init(validatingUTF8: deviceModelCode()!)!] { return model }
Swift 5.2.x, kedua perangkat & simulator diperbarui hingga 2020
dan iPad Pro 11 " terbaru terbaru , iPad Air generasi ketiga dan iPad Pro 3 generasi , iPhone 11, 11 Pro dan 11 Pro Max dan iPhone SE generasi ke-2 .
Metode ini mendeteksi model yang benar bahkan jika itu adalah simulator. ( Nama persis untuk model perangkat simulator yang berjalan di simulator Anda )
Penggunaan : Anda cukup mendapatkan model perangkat dengan:
atau cetak string yang tepat dengan:
Contoh lain dengan kasus :
Untuk model perangkat Apple, kunjungi: https://www.theiphonewiki.com/wiki/Models
sumber
UIDevice().type.rawvalue
mendapatkan nama perangkat dengan spasi.UIDevice().type
, dan jika saya menambahkannya.rawvalue
, saya mendapatkan kesalahan yang menyatakan: Nilai tipe 'Model' tidak memiliki anggota 'rawvalue'rawvalue
, yang ini tidak lagi diperlukan dengan Swift 5 , saya sudah memperbarui baris itu. Saya sudah menguji sekarang kodenya dan berfungsi dengan benar, perangkat apa yang Anda coba uji? Apakah Anda memilikiUIDevice
ekstensi lain di prj Anda?UIDevice
ekstensi lain selain milik Anda (ditempatkan di file cepat khusus).iPhone12,8
Alternatif lain / sederhana (referensi pengidentifikasi model ditemukan di https://www.theiphonewiki.com/wiki/Models ):
Jawaban yang diperbarui untuk Swift 3/4/5 termasuk pemangkasan tali dan dukungan simulator:
sumber
Saya telah membuat ekstensi sampel lain di UIDevice untuk memasukkan basis pengidentifikasi model simulator pada jawaban @ HAS . Ini berfungsi baik dengan Swift3.2 di atas (termasuk Swift 4.x, Swift 5):
Model tambahkan baru: iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max
sumber
Untuk kedua perangkat maupun simulator, Buat file cepat baru dengan nama UIDevice.swift
Tambahkan kode di bawah ini
Kemudian di viewcontroller Anda,
sumber
Berurusan dengan c struct adalah menyakitkan dalam cepat. Terutama jika mereka memiliki beberapa array c di dalamnya. Inilah solusi saya: Terus menggunakan tujuan-c. Cukup buat kelas objektif-c wrapper yang melakukan pekerjaan ini dan kemudian gunakan kelas itu dengan cepat. Berikut adalah contoh kelas yang melakukan ini:
Di sisi cepat:
sumber
x86_64
dariutsname
adalah bahwa Simulator sebenarnya komputer Anda yang memilikimachine
propertix86_64
. Coba dengan mengubah.machine
ke.nodename
dalam metode Anda nilai pengembalian akan menjadi sesuatu sepertiMy-iMac.local
.Saya telah mengimplementasikan perpustakaan super ringan untuk mendeteksi perangkat yang digunakan berdasarkan beberapa jawaban yang diberikan: https://github.com/schickling/Device.swift
Ini dapat diinstal melalui Carthage dan digunakan seperti ini:
sumber
Saya menemukan bahwa banyak semua jawaban ini menggunakan string. Saya memutuskan untuk mengubah jawaban @HAS untuk menggunakan enum:
sumber
Menggunakan Swift 3 (Xcode 8.3)
Catatan: Menurut jawaban resmi forum dev, aman menggunakan tuple dengan cara ini. Penyelarasan memori untuk tuple Int8 besar akan sama seperti jika itu adalah array Int8 besar. yaitu: berdekatan dan tidak-empuk.
sumber
Cepat 5
sumber
Ada beberapa masalah dengan jawaban yang diterima saat Anda menggunakan Swift 3! Jawaban ini (terinspirasi dari NAZIK) bekerja dengan Swift 3 dan model iPhone baru:
sumber
Swift 3.0 atau lebih tinggi
dan tambahkan ekstensi berikut
sumber
Di sini modifikasi tanpa paksa membuka dan Swift 3.0:
sumber
Anda dapat menggunakan kerangka kerja BDLocalizedDevicesModels untuk mem-parsing informasi perangkat dan mendapatkan namanya.
Kemudian panggil saja
UIDevice.currentDevice.productName
kode Anda.sumber
Di bawah ini adalah kode untuk mendapatkan string perangkat keras, tetapi Anda perlu membandingkan string perangkat keras ini untuk mengetahui perangkat apa itu. Saya telah membuat kelas untuk yang berisi hampir semua string perangkat (kami senantiasa memperbarui string dengan perangkat baru). Sangat mudah digunakan silakan periksa
Swift : GitHub / DeviceGuru
Objective-C : GitHub / DeviceUtil
sumber
Jika Anda tidak ingin terus memperbarui kode Anda setiap kali Apple menambahkan model baru ke rangkaian perangkat, gunakan metode di bawah ini yang hanya mengembalikan Anda kode model.
sumber
SWIFT 3.1
dua sen saya hanya untuk memanggil utsname:
seperti yang lainnya, tetapi sedikit lebih bersih tentang semua kerumitan C / Swift dan kembali. ):
Mengembalikan nilai seperti "x86_64"
sumber
Menggunakan 'switch-case' Swift:
sumber
Solusi sederhana saya dikelompokkan berdasarkan perangkat dan mendukung perangkat baru
iPhone 8
daniPhone X
diSwift 3
:Dan gunakan:
sumber
Berdasarkan jawaban ini dan jawaban ini . Saya telah membuat intisari publik
Bagaimana itu bisa digunakan
Ini adalah kode di dalam intinya
sumber
Cara termudah untuk mendapatkan nama model (nama pemasaran)
Gunakan API pribadi
-[UIDevice _deviceInfoForKey:]
dengan hati-hati, Anda tidak akan ditolak oleh Apple,Bagaimana saya mendapatkan "nama pemasaran" kunci?
Berjalan di simulator,
NSProcessInfo.processInfo.environment
berisi kunci bernama "SIMULATOR_CAPABILITIES", nilainya adalah file plist. Kemudian Anda membuka file plist, Anda akan mendapatkan kunci nama model "nama pemasaran".sumber
Dalam Swift 3 itu akan terjadi
sumber
sumber
sumber
Ada perpustakaan pembantu untuk ini.
Cepat 5
Swift 4.0 - Swift 4.2
jika Anda hanya ingin menentukan model dan membuat sesuatu yang sesuai.
Anda bisa menggunakan seperti itu:
Dalam suatu fungsi:
sumber
sumber