UIDevice currentDevice модель возможных значений
Каковы все возможные значения, возвращаемые [[UIDevice currentDevice] model];
? Это не задокументировано.
4 ответа
Возможные долины iPod touch
, iPhone
, iPhone Simulator
, iPad
, iPad Simulator
Если вы хотите знать, какое оборудование iOS
губит как iPhone3
, iPhone4
, iPhone5
и т.д. ниже приведен код для этого
ПРИМЕЧАНИЕ: приведенный ниже код может содержать не все строки устройства, я с другими парнями поддерживаю тот же код на GitHub, поэтому, пожалуйста, берите последнюю версию кода оттуда
Objective-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
Ни один из этих ответов не распространяется на новые номера моделей. Вот перечисление:
public enum DeviceType {
case iPad(String?)
case iPhone(String?)
case simulator(String?)
case appleTV(String?)
case unknown
}
И расширение, которое я написал, я думаю, немного чище и немного расширяемо, когда выходит новый номер модели.
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
}
}
}
Я считаю, что лучший ответ для объяснения (то, что здесь не было написано) - это сказать, что само значение является строковым значением. и возможные ответы - строка, например: "iPhone","iPad" и т. д.