iOS设备返回不同格式的设备型号,为什么?

sna*_*ggs 6 objective-c ios

我使用此方法获取设备型号名称:

+ (NSString *) machineModel
{
    const char *name = "hw.model";
#if TARGET_OS_IPHONE
    // .model on iOS returns internal model name (e.g. "N51AP") when we'd prefer to see the model identifier here ("iPhone6,1")
    name = "hw.machine";
#endif

    int error = 0;
    size_t length = 0;
    error = sysctlbyname(name, NULL, &length, NULL, 0);

    if (error != 0) {
        return nil;
    }

    char *p = malloc(sizeof(char) * length);
    if (p) {
        error = sysctlbyname(name, p, &length, NULL, 0);
    }

    if (error != 0) {
        free(p);
        return nil;
    }

    NSString *machinemodel = [NSString stringWithFormat:@"%s", p];        
    free(p);        
    return machinemodel;
}
Run Code Online (Sandbox Code Playgroud)

但是,当我在数千台设备上运行此代码时,我在数据库中获得以下选项:

"iPhone7;1"
"iPhone8,1"
"iPhone7;2"
"iPhone"
"iPhone9;3"
"iPhone7;1"
"iPhone8,1"
"iPhone8,1"
"iPhone7,2"
"iPhone7;2"
"iPhone9;1"
"iPhone7;2"
...
Run Code Online (Sandbox Code Playgroud)

问题

有时我有,分隔符,有时候; 有时我看不到号码:"iPhone"

为什么会这样?


我希望这可以从Android设备(5K不同的制造商),但为什么iOS只有Apple是所有者

Ser*_*yov 2

我相信您通过直接访问模型名称而对代码有疑问。可能在某些 iOS 版本或 iOS 架构上它的工作方式有所不同。

我建议您使用一些更高级别的库,例如DeviceKitDevice - 它对我来说效果非常好并且总是给出正确的结果。

如果您不想直接使用它们,至少您可以了解它们在幕后如何工作并自己实现相同的逻辑。