Возможные значения модели UIDevice currentDevice
Каковы все возможные значения, возвращаемые [[UIDevice currentDevice] model];
? Он не документирован .
- AWS SNS EndPoint отключен при публикации
- Программный переход от UIBarButtonItem
- Все уведомления, исчезающие после открытия одного из них
- Как нажимать новый контроллер просмотра при прослушивании ячейки таблицы?
- WCErrorCodeDeliveryFailed: полезная нагрузка не может быть доставлена
- Как обновить UITextField при получении ввода из UIPickerView?
- Загрузка изображения Crash в Firebase Codelabs FriendlyChat Tutorial
- Можно ли использовать Realm как модель персистентности для представления публичной базы данных CloudKit?
Возможными долями являются iPod touch
, iPhone
, iPhone Simulator
, iPad
, iPad Simulator
Если вы хотите узнать, какое оборудование iOS
испортилось, например iPhone3
, iPhone4
, iPhone5
т. Д. Ниже, это код для этого
ПРИМЕЧАНИЕ. В приведенном ниже коде может не содержаться вся строка устройства, я с другими ребятами поддерживаю тот же код в GitHub, поэтому, пожалуйста, возьмите последний код
Цель-C: GitHub / DeviceUtil
Swift: GitHub / DeviceGuru
#include <sys/types.h> #include <sys/sysctl.h> - (NSString*)hardwareDescription { NSString *hardware = [self hardwareString]; if ([hardware isEqualToString:@"iPhone1,1"]) return @"iPhone 2G"; if ([hardware isEqualToString:@"iPhone1,2"]) return @"iPhone 3G"; if ([hardware isEqualToString:@"iPhone3,1"]) return @"iPhone 4"; if ([hardware isEqualToString:@"iPhone4,1"]) return @"iPhone 4S"; if ([hardware isEqualToString:@"iPhone5,1"]) return @"iPhone 5"; if ([hardware isEqualToString:@"iPod1,1"]) return @"iPodTouch 1G"; if ([hardware isEqualToString:@"iPod2,1"]) return @"iPodTouch 2G"; if ([hardware isEqualToString:@"iPad1,1"]) return @"iPad"; if ([hardware isEqualToString:@"iPad2,6"]) return @"iPad Mini"; if ([hardware isEqualToString:@"iPad4,1"]) return @"iPad Air WIFI"; //there are lots of other strings too, checkout the github repo //link is given at the top of this answer if ([hardware isEqualToString:@"i386"]) return @"Simulator"; if ([hardware isEqualToString:@"x86_64"]) return @"Simulator"; return nil; } - (NSString*)hardwareString { size_t size = 100; char *hw_machine = malloc(size); int name[] = {CTL_HW,HW_MACHINE}; sysctl(name, 2, hw_machine, &size, NULL, 0); NSString *hardware = [NSString stringWithUTF8String:hw_machine]; free(hw_machine); return hardware; }
Я просто сделал тест на iPod Touch, iPhone, Phone Retina, iPhone 5, iPad, iPad Retina и iPad Mini. Итак, это мой вывод:
iPod touch iPhone iPad
На симуляторах – это может быть полезно, если вы разработчик, работающий над функциями, которые иногда вообще не работают на симуляторах, вы получите следующие значения:
iPhone Simulator iPad Simulator
Я считаю, что лучший ответ на объяснение (что-то, что не было написано здесь) Является ли сказать, что само значение является значением String. и возможные ответы – это строка, например: «iPhone», «iPad» и т. д.
Ни один из этих ответов не расширяется для новых номеров моделей. Вот перечисление:
public enum DeviceType { case iPad(String?) case iPhone(String?) case simulator(String?) case appleTV(String?) case unknown }
И Extension я написал, что, по-моему, немного чище и немного более расширяем, когда появляется новый номер модели.
extension UIDevice { public static func getDevice() -> DeviceType { var info = utsname() uname(&info) let machineMirror = Mirror(reflecting: info.machine) let code = machineMirror.children.reduce("") { identifier, element in guard let value = element.value as? Int8, value != 0 else { return identifier } return identifier + String(UnicodeScalar(UInt8(value))) } if code.lowercased().range(of: "ipad") != nil { if let range = code.lowercased().range(of: "ipad") { var mutate = code mutate.removeSubrange(range) return .iPad(mutate) }else{ return .iPad(nil) } }else if code.lowercased().range(of: "iphone") != nil { if let range = code.lowercased().range(of: "iphone") { var mutate = code mutate.removeSubrange(range) return .iPhone(mutate) }else{ return .iPhone(nil) } }else if code.lowercased().range(of: "i386") != nil || code.lowercased().range(of: "x86_64") != nil{ return .simulator(code) }else if code.lowercased().range(of: "appletv") != nil { if let range = code.lowercased().range(of: "appletv") { var mutate = code mutate.removeSubrange(range) return .appleTV(mutate) }else{ return .appleTV(nil) } }else{ return .unknown } } }