ios UIDevice currentDevice 模型可能的值

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/14411075/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-30 21:54:56  来源:igfitidea点击:

UIDevice currentDevice model possible values

iosobjective-cswift

提问by Fergal

What are all the possible values returned by [[UIDevice currentDevice] model];? It isn't documented.

返回的所有可能值是[[UIDevice currentDevice] model];什么?它没有 记录

回答by Inder Kumar Rathore

The possible vales are iPod touch, iPhone, iPhone Simulator, iPad, iPad Simulator

可能的值是iPod touch, iPhone, iPhone Simulator, iPad,iPad Simulator

If you want to know which hardware iOSis ruining on like iPhone3, iPhone4, iPhone5etc below is the code for that

如果你想知道哪些硬件iOS是像毁了iPhone3iPhone4iPhone5等下面是该代码



NOTE:The below code may not contain all device's string, I'm with other guys are maintaining the same code on GitHubso please take the latest code from there

注意:下面的代码可能不包含所有设备的字符串,我和其他人在GitHub 上维护相同的代码,所以请从那里获取最新的代码

Objective-C : GitHub/DeviceUtil

Objective-C : GitHub/DeviceUtil

Swift : GitHub/DeviceGuru

斯威夫特: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;
}

回答by javienegas

I just did a test on iPod Touch, iPhone, Phone Retina, iPhone 5, iPad, iPad Retina and iPad Mini. So this is my conclusion:

我刚刚在 iPod Touch、iPhone、Phone Retina、iPhone 5、iPad、iPad Retina 和 iPad Mini 上进行了测试。所以这是我的结论:

iPod touch
iPhone
iPad

On simulators - this could be useful if you're a developer working on features that sometimes do not work at all on simulators - you'll get these values:

在模拟器上 - 如果您是开发有时在模拟器上根本不起作用的功能的开发人员,这可能很有用 - 您将获得以下值:

iPhone Simulator
iPad Simulator

回答by iDesireJustice

I believe the best answer to explain(something which wasn't written here) Is to say that the value itself is a String value. and the possible answers are string e.g: "iPhone","iPad" and etc..

我相信解释(这里没有写的东西)的最佳答案是说值本身是一个字符串值。并且可能的答案是字符串,例如:“iPhone”、“iPad”等。

回答by Jon Vogel

None of these answers are extendable for new model numbers. Here is an enumeration:

这些答案都不能扩展到新型号。这是一个枚举:

public enum DeviceType {
 case iPad(String?)
 case iPhone(String?)
 case simulator(String?)
 case appleTV(String?)
 case unknown
}

And Extension I wrote that I think is a little cleaner and a little more extendable for when new model number come out.

和我写的扩展,我认为当新型号出现时,它更简洁,更具扩展性。

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
        }
    }
}