iOS获取设备型号记录

在开发中,我们经常需要根据设备型号的不同来进行数据统计或者是适配。但是,系统并没有提供API让我们直接获取当前设备的型号。

不过,每一种苹果的设备都有自己的标识符,我们只需要根据其标识符就可以判断当前设备的具体类型了。

  • 获取设备标识符
  • 定义设备类型
  • 获取设备类型
  • 设备尺寸

获取设备标识符

这个wiki中提供了苹果设备的标识符,接下来我们来获取当前设备的标识符。

这里,我为 UIDevice 扩展了一个属性

1
2
3
4
5
6
7
8
9
10
11
12
13
extension UIDevice {
var modelType: String {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}

return identifier
}
}

定义设备类型

上面已经得到了设备的唯一标识符,但是每次都是字符串的判断,而字符串易写错且 xcode 不会有提示,所以我们利用枚举完善一下。

定义一个设备类型的枚举

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
enum IphoneType: String {
case other
case simulator
case iPhone4
case iPhone4s
case iPhone5
case iPhone5c
case iPhone5s
case iPhone6
case iPhone6_Plus
case iPhone6s
case iPhone6s_Plus
case iPhoneSE
case iPhone7
case iPhone7_Plus
case iPhone8
case iPhone8_Plus
case iPhoneX
case iPhoneXR
case iPhoneXS
case iPhoneXS_Max
}

获取设备类型

现在设备型号已经定义完成了,我们将 UIDevice 的 extension 完善一下。完成版如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
extension UIDevice {
var modelType: IphoneType {
var systemInfo = utsname()
uname(&systemInfo)
let machineMirror = Mirror(reflecting: systemInfo.machine)
let identifier = machineMirror.children.reduce("") { identifier, element in
guard let value = element.value as? Int8, value != 0 else { return identifier }
return identifier + String(UnicodeScalar(UInt8(value)))
}

switch identifier {
case "iPhone3,1", "iPhone3,2", "iPhone3,3":
return .iPhone4
case "iPhone4,1":
return .iPhone4s
case "iPhone5,1", "iPhone5,2":
return .iPhone5
case "iPhone5,3", "iPhone5,4":
return .iPhone5c
case "iPhone6,1", "iPhone6,2":
return .iPhone5s
case "iPhone7,2":
return .iPhone6
case "iPhone7,1":
return .iPhone6_Plus
case "iPhone8,1":
return .iPhone6s
case "iPhone8,2":
return .iPhone6s_Plus
case "iPhone8,4":
return .iPhoneSE
case "iPhone9,1", "iPhone9,3":
return .iPhone7
case "iPhone9,2", "iPhone9,4":
return .iPhone7_Plus
case "iPhone10,1":
return .iPhone8
case "iPhone10,2", "iPhone10,5":
return .iPhone8_Plus
case "iPhone10,3", "iPhone10,6":
return .iPhoneX
case "iPhone11,8":
return .iPhoneXR
case "iPhone11,2":
return .iPhoneXS
case "iPhone11,6", "iPhone11,4":
return .iPhoneXS_Max
case "i386", "x86_64":
return .similator
default:
return . other
}
}
}

enum IphoneType: String {
case other
case simulator
case iPhone4
case iPhone4s
case iPhone5
case iPhone5c
case iPhone5s
case iPhone6
case iPhone6_Plus
case iPhone6s
case iPhone6s_Plus
case iPhoneSE
case iPhone7
case iPhone7_Plus
case iPhone8
case iPhone8_Plus
case iPhoneX
case iPhoneXR
case iPhoneXS
case iPhoneXS_Max
}

设备尺寸

关于设备的各个尺寸都可以在下方的链接中查看。

The Ultimate Guide To iPhone Resolutions

参考

The Ultimate Guide To iPhone Resolutions

theiphonewiki