iOS 15.3.1/16.2设备名称显示为标识符问题求解决方案
解决iOS 15.3.1/16.2中获取设备实际型号名称的问题
在iOS 15.3.1和16.2版本中,通过sysctlbyname("hw.machine")只能获取到设备标识符(如iPhone14,5对应iPhone13、iPhone12,1对应iPhone11),而非用户认知的实际型号名称。以下是可靠的解决方案:
方案:维护设备标识符-实际名称映射表
苹果的设备标识符是固定且公开的,通过维护映射表可以将标识符转换为实际型号名称,不受系统版本限制。
1. 创建映射字典
添加所有需要支持的设备标识符与对应名称的映射:
+ (NSDictionary *)deviceModelMap { return @{ // iPhone系列示例 @"iPhone14,5": @"iPhone 13", @"iPhone12,1": @"iPhone 11", @"iPhone14,2": @"iPhone 13 Pro", @"iPhone14,3": @"iPhone 13 Pro Max", @"iPhone12,3": @"iPhone 11 Pro", @"iPhone12,5": @"iPhone 11 Pro Max", // 可根据需求补充iPad、Apple Watch等其他设备的映射 @"iPad13,1": @"iPad Air (4th generation)" }; }
2. 修改设备信息获取方法
修正原代码中的内存错误,并添加映射转换逻辑:
+ (NSString *)getSysctlValue:(char *)typeSpecifier { size_t size; // 获取所需内存大小 sysctlbyname(typeSpecifier, NULL, &size, NULL, 0); char *valueBuffer = malloc(size); // 读取系统信息 sysctlbyname(typeSpecifier, valueBuffer, &size, NULL, 0); NSString *result = [NSString stringWithCString:valueBuffer encoding:NSUTF8StringEncoding]; free(valueBuffer); return result; } + (NSString *)deviceModelName { NSString *machineIdentifier = [self getSysctlValue:@"hw.machine"]; NSDictionary *modelMap = [self deviceModelMap]; // 优先返回映射的实际名称,无映射则返回原始标识符 return modelMap[machineIdentifier] ?: machineIdentifier; }
注意事项
- 原代码中存在未定义变量
answer的错误,已修正为valueBuffer避免内存异常; - 映射表需根据苹果发布的新设备及时更新,确保覆盖所有需要支持的机型;
- 该方法兼容性强,不受特定iOS版本的API限制。
内容的提问来源于stack exchange,提问作者SonalB
相关产品推荐
相关产品推荐

