Есть ли способ получить название модели устройства (iPhone 4S, iPhone 5, iPhone 5S и т. Д.) В Swift?
Я знаю, что есть свойство с именем, UIDevice.currentDevice().model
но оно возвращает только тип устройства (iPod touch, iPhone, iPad, iPhone Simulator и т. Д.).
Я также знаю, что это легко сделать в Objective-C с помощью этого метода:
#import <sys/utsname.h>
struct utsname systemInfo;
uname(&systemInfo);
NSString* deviceModel = [NSString stringWithCString:systemInfo.machine
encoding:NSUTF8StringEncoding];
Но я разрабатываю свое приложение для iPhone на Swift, так что кто-нибудь может помочь мне с аналогичным способом решить эту проблему в Swift?
Ответы:
Я сделал это "чистый Swift" расширение
UIDevice
.Эта версия работает в Swift 2 или выше. Если вы используете более раннюю версию, пожалуйста, используйте более старую версию моего ответа .
Если вы ищете более элегантное решение, вы можете использовать мою µ-инфраструктуру,
DeviceKit
опубликованную на GitHub (также доступна через CocoaPods, Carthage и Swift Package Manager).Вот код:
Вы называете это так:
Для реальных устройств он возвращает, например, «iPad Pro 9,7 дюйма», для симуляторов - «Симулятор» + идентификатор симулятора, например, «Симулятор iPad Pro 9,7 дюйма».
источник
Этот пример Swift 3.0 возвращает текущую модель устройства как
enum
константу (чтобы избежать прямого сравнения со строковыми литералами). Необработанное значение enum представляет собойString
удобочитаемое имя устройства iOS. Поскольку это Swift, список распознанных устройств включает только модели, достаточно недавние для поддержки версий iOS, которые включают Swift. В следующем примере использования используется реализация в конце этого ответа:Ваше приложение должно быть в курсе новых выпусков устройств, а также когда Apple добавляет новые модели для того же семейства устройств. Например, iPhone3,1 iPhone3,2 iPhone3,4 - это все «iPhone 4». Избегайте написания кода, который не учитывает новые модели, чтобы ваши алгоритмы не могли неожиданно не настроить и не реагировать на новое устройство. Вы можете обратиться к этому поддерживаемому списку iOS Device Model #, чтобы обновить свое приложение в стратегическое время.
iOS включает независимые от устройства интерфейсы для определения аппаратных возможностей и параметров, таких как размер экрана. Обобщенные интерфейсы, предоставляемые Apple, обычно являются наиболее безопасными и наиболее поддерживаемыми механизмами для динамической адаптации поведения приложения к разным аппаратным средствам. Тем не менее, следующий код может быть полезен для создания прототипов, отладки, тестирования или любого временного кода, необходимого для определенного семейства устройств. Этот метод также может быть полезен для описания текущего устройства его общим / общепризнанным именем.
Свифт 3
источник
modelMap
которые заставляют iOS жаловаться:Duplicate literals in keys
if let model = modelMap[String.fromCString(modelCode!)!]
.modelMap
Обходным путем может быть сначала декодирование CString, а затем подача декодированной строки в `if let (str, _) = String.decodeCString (modelCode, as: UTF8.self, repairingInvalidCodeUnits: false) {если let model = modelMap [str] {вернуть модель} } `if let model = modelMap[String.init(validatingUTF8: deviceModelCode()!)!] { return model }
Swift 5.2.x, устройство и симулятор обновлены до 2020 года
и новые новейшие iPad Pro 11 " , iPad Air 3-го поколения и iPad Pro 3 поколения , iPhone 11, 11 Pro и 11 Pro Max и iPhone SE 2-го поколения .
Этот метод определяет правильную модель, даже если это симулятор. ( Точное название модели устройства симулятора, работающего в вашем симуляторе )
Использование : Вы можете просто получить модель устройства с:
или выведите точную строку с помощью:
Еще один пример с делами :
Для моделей устройств Apple посетите: https://www.theiphonewiki.com/wiki/Models
источник
UIDevice().type.rawvalue
чтобы получить имя устройства с пробелами.UIDevice().type
, и если я добавлю.rawvalue
в конце этого, я получу сообщение об ошибке: Значение типа «Модель» не имеет члена «rawvalue»rawvalue
, это больше не нужно с Swift 5 , я обновил эту строку. Сейчас я протестировал код, и он работает правильно, какое устройство вы пытаетесь протестировать? У вас есть другиеUIDevice
расширения в вашем prj?UIDevice
расширений, кроме вашего (размещенного в специальном файле swift).iPhone12,8
Еще одна / простая альтернатива (ссылка на идентификатор модели находится по адресу https://www.theiphonewiki.com/wiki/Models ):
Обновленный ответ для Swift 3/4/5, включая обрезку строк и поддержку симулятора:
источник
Я сделал еще один пример расширения для UIDevice, включив в него идентификатор идентификатора модели симулятора на основе ответа @ HAS . Это работает отлично с Swift3.2 выше (включая Swift 4.x, Swift 5):
Новое добавление моделей: iPhone 11, iPhone 11 Pro, iPhone 11 Pro Max
источник
Для обоих устройств, а также для симуляторов, создайте новый файл swift с именем UIDevice.swift
Добавьте код ниже
Тогда в вашем viewcontroller,
источник
Работа с c структурами болезненна быстро. Особенно, если в них есть какие-то массивы c. Вот мое решение: продолжать использовать цель-c. Просто создайте класс-объект-оболочку, который выполняет эту работу, а затем используйте этот класс в Swift. Вот пример класса, который делает именно это:
В быстрой стороне:
источник
x86_64
отutsname
том , что тренажер действительно ваш компьютер , который имеетmachine
свойствоx86_64
. Попробуйте, изменив.machine
к.nodename
в методе возвращаемого значения будет что - то вродеMy-iMac.local
.Я реализовал сверхлегкую библиотеку для обнаружения используемого устройства на основе некоторых из приведенных ответов: https://github.com/schickling/Device.swift
Его можно установить через Карфаген и использовать так:
источник
Я обнаружил, что во многих ответах используются строки. Я решил изменить ответ @HAS, чтобы использовать перечисление:
источник
Использование Swift 3 (Xcode 8.3)
Примечание: согласно официальному ответу на форуме разработчиков, таким образом безопасно использовать кортежи. Выравнивание памяти для большого кортежа Int8 будет таким же, как если бы это был большой массив Int8. то есть: смежный и не дополненный.
источник
Swift 5
источник
Есть некоторые проблемы с принятым ответом, когда вы используете Swift 3! Этот ответ (вдохновленный NAZIK) работает с Swift 3 и новыми моделями iPhone:
источник
Swift 3.0 или выше
и добавьте следующее расширение
источник
Вот модификация без принудительной развертки и Swift 3.0:
источник
Вы можете использовать платформу BDLocalizedDevicesModels для анализа информации об устройстве и получения имени.
Тогда просто позвоните
UIDevice.currentDevice.productName
в своем коде.источник
Ниже приведен код для получения аппаратной строки, но вам нужно сравнить эту аппаратную строку, чтобы узнать, какое это устройство. Я создал класс, в котором содержатся почти все строки устройств (мы постоянно обновляем строку для новых устройств). Это легко использовать, пожалуйста, проверьте
Swift : GitHub / DeviceGuru
Objective-C : GitHub / DeviceUtil
источник
Если вы не хотите обновлять свой код каждый раз, когда Apple добавляет новую модель в семейство устройств, используйте метод, приведенный ниже, чтобы вернуть вам только код модели.
источник
SWIFT 3.1
мои два цента за простой вызов utsname:
как и другие, но немного чище во всей тонкости C / Swift и обратно. ):
Возвращает значения, такие как "x86_64"
источник
Используя Swift 'switch-case':
источник
Мое простое решение сгруппировано по устройствам и поддерживает новые устройства
iPhone 8
иiPhone X
вSwift 3
:И использовать:
источник
На основании этого ответа и этого ответа . Я создал публичную суть
Как это можно использовать
Это код внутри сущности
источник
Самый простой способ получить название модели (маркетинговое название)
Тщательно используйте закрытый API
-[UIDevice _deviceInfoForKey:]
, Apple не отклонит вас,Как я получил ключ "маркетинг-имя"?
Работает на симуляторе,
NSProcessInfo.processInfo.environment
содержит ключ с именем «SIMULATOR_CAPABILITIES», значением которого является файл plist. Затем вы открываете файл plist, вы получите ключ названия модели "marketing-name".источник
В Swift 3 это было бы
источник
источник
источник
Для этого есть вспомогательная библиотека .
Swift 5
Swift 4.0 - Swift 4.2
если вы просто хотите определить модель и сделать что-то соответственно.
Вы можете использовать так:
В функции:
источник
источник