Skip to content

Commit 974c4ba

Browse files
zhu-xiaoweixiaoweii
andauthored
feat: add iOS model parser (#12)
Co-authored-by: xiaoweii <xiaoweii@amazom.com>
1 parent c19c6a2 commit 974c4ba

File tree

3 files changed

+201
-2
lines changed

3 files changed

+201
-2
lines changed

Sources/Clickstream/Dependency/Clickstream/System/SystemInfo.swift

Lines changed: 78 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class SystemInfo {
3333
if idfa == "00000000-0000-0000-0000-000000000000" {
3434
self.idfa = ""
3535
}
36-
self.model = UIDevice.current.name
36+
self.model = Self.getModel(identifier: Self.identifier)
3737
self.osVersion = UIDevice.current.systemVersion
3838
self.screenWidth = Int(UIScreen.main.bounds.size.width * UIScreen.main.scale)
3939
self.screenHeight = Int(UIScreen.main.bounds.size.height * UIScreen.main.scale)
@@ -60,4 +60,81 @@ class SystemInfo {
6060
return "UNKNOWN"
6161
#endif
6262
}
63+
64+
private(set) static var identifier: String = {
65+
var systemInfo = utsname()
66+
uname(&systemInfo)
67+
let mirror = Mirror(reflecting: systemInfo.machine)
68+
let identifier = mirror.children.reduce("") { identifier, element in
69+
guard let value = element.value as? Int8, value != 0 else { return identifier }
70+
return identifier + String(UnicodeScalar(UInt8(value)))
71+
}
72+
return identifier
73+
}()
74+
75+
// swiftlint:disable cyclomatic_complexity
76+
static func getModel(identifier: String) -> String {
77+
switch identifier {
78+
case "iPod9,1": return "iPod touch (7th generation)"
79+
case "iPhone8,1": return "iPhone 6s"
80+
case "iPhone8,2": return "iPhone 6s Plus"
81+
case "iPhone9,1", "iPhone9,3": return "iPhone 7"
82+
case "iPhone9,2", "iPhone9,4": return "iPhone 7 Plus"
83+
case "iPhone8,4": return "iPhone SE"
84+
case "iPhone10,1", "iPhone10,4": return "iPhone 8"
85+
case "iPhone10,2", "iPhone10,5": return "iPhone 8 Plus"
86+
case "iPhone10,3", "iPhone10,6": return "iPhone X"
87+
case "iPhone11,2": return "iPhone Xs"
88+
case "iPhone11,4", "iPhone11,6": return "iPhone Xs Max"
89+
case "iPhone11,8": return "iPhone XR"
90+
case "iPhone12,1": return "iPhone 11"
91+
case "iPhone12,3": return "iPhone 11 Pro"
92+
case "iPhone12,5": return "iPhone 11 Pro Max"
93+
case "iPhone12,8": return "iPhone SE (2nd generation)"
94+
case "iPhone13,2": return "iPhone 12"
95+
case "iPhone13,1": return "iPhone 12 mini"
96+
case "iPhone13,3": return "iPhone 12 Pro"
97+
case "iPhone13,4": return "iPhone 12 Pro Max"
98+
case "iPhone14,5": return "iPhone 13"
99+
case "iPhone14,4": return "iPhone 13 mini"
100+
case "iPhone14,2": return "iPhone 13 Pro"
101+
case "iPhone14,3": return "iPhone 13 Pro Max"
102+
case "iPhone14,6": return "iPhone SE (3rd generation)"
103+
case "iPhone14,7": return "iPhone 14"
104+
case "iPhone14,8": return "iPhone 14 Plus"
105+
case "iPhone15,2": return "iPhone 14 Pro"
106+
case "iPhone15,3": return "iPhone 14 Pro Max"
107+
case "iPad5,3", "iPad5,4": return "iPad Air 2"
108+
case "iPad6,11", "iPad6,12": return "iPad (5th generation)"
109+
case "iPad7,5", "iPad7,6": return "iPad (6th generation)"
110+
case "iPad11,3", "iPad11,4": return "iPad Air (3rd generation)"
111+
case "iPad7,11", "iPad7,12": return "iPad (7th generation)"
112+
case "iPad11,6", "iPad11,7": return "iPad (8th generation)"
113+
case "iPad12,1", "iPad12,2": return "iPad (9th generation)"
114+
case "iPad13,18", "iPad13,19": return "iPad (10th generation)"
115+
case "iPad13,1", "iPad13,2": return "iPad Air (4th generation)"
116+
case "iPad13,16", "iPad13,17": return "iPad Air (5th generation)"
117+
case "iPad4,7", "iPad4,8", "iPad4,9": return "iPad Mini 3"
118+
case "iPad5,1", "iPad5,2": return "iPad Mini 4"
119+
case "iPad11,1", "iPad11,2": return "iPad Mini (5th generation)"
120+
case "iPad14,1", "iPad14,2": return "iPad Mini (6th generation)"
121+
case "iPad6,3", "iPad6,4": return "iPad Pro (9.7-inch)"
122+
case "iPad6,7", "iPad6,8": return "iPad Pro (12.9-inch)"
123+
case "iPad7,1", "iPad7,2": return "iPad Pro (12.9-inch) (2nd generation)"
124+
case "iPad7,3", "iPad7,4": return "iPad Pro (10.5-inch)"
125+
case "iPad8,1", "iPad8,2", "iPad8,3", "iPad8,4": return "iPad Pro (11-inch)"
126+
case "iPad8,5", "iPad8,6", "iPad8,7", "iPad8,8": return "iPad Pro (12.9-inch) (3rd generation)"
127+
case "iPad8,9", "iPad8,10": return "iPad Pro (11-inch) (2nd generation)"
128+
case "iPad8,11", "iPad8,12": return "iPad Pro (12.9-inch) (4th generation)"
129+
case "iPad13,4", "iPad13,5", "iPad13,6", "iPad13,7": return "iPad Pro (11-inch) (3rd generation)"
130+
case "iPad13,8", "iPad13,9", "iPad13,10", "iPad13,11": return "iPad Pro (12.9-inch) (5th generation)"
131+
case "iPad14,3", "iPad14,4": return "iPad Pro (11-inch) (4th generation)"
132+
case "iPad14,5", "iPad14,6": return "iPad Pro (12.9-inch) (6th generation)"
133+
case "i386", "x86_64", "arm64": return getModel(identifier:
134+
ProcessInfo().environment["SIMULATOR_MODEL_IDENTIFIER"] ?? "iOS")
135+
default:
136+
return identifier
137+
}
138+
}
139+
// swiftlint:enable cyclomatic_complexity
63140
}

Sources/Clickstream/PackageInfo.swift

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,5 @@
88
enum PackageInfo {
99
/// the clickstream analytics iOS sdk version
1010
/// note: update and align the version with new tag version before committing new tag
11-
static let version = "0.4.1"
11+
static let version = "0.4.2"
1212
}
Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
//
2+
// Copyright Amazon.com Inc. or its affiliates.
3+
// All Rights Reserved.
4+
//
5+
// SPDX-License-Identifier: Apache-2.0
6+
//
7+
8+
@testable import Clickstream
9+
import XCTest
10+
11+
class SystemInfoTest: XCTestCase {
12+
func testGetIdentifierNotNil() {
13+
XCTAssertNotNil(SystemInfo.identifier)
14+
}
15+
16+
func testGetModelForSimulator() {
17+
XCTAssertTrue(SystemInfo.getModel(identifier: "arm64").starts(with: "iPhone"))
18+
}
19+
20+
func testGetModelFor_iPhone() {
21+
XCTAssertEqual("iPhone 7", SystemInfo.getModel(identifier: "iPhone9,1"))
22+
XCTAssertEqual("iPhone 7", SystemInfo.getModel(identifier: "iPhone9,3"))
23+
XCTAssertEqual("iPhone 7 Plus", SystemInfo.getModel(identifier: "iPhone9,2"))
24+
XCTAssertEqual("iPhone 7 Plus", SystemInfo.getModel(identifier: "iPhone9,4"))
25+
XCTAssertEqual("iPhone SE", SystemInfo.getModel(identifier: "iPhone8,4"))
26+
XCTAssertEqual("iPhone 8", SystemInfo.getModel(identifier: "iPhone10,1"))
27+
XCTAssertEqual("iPhone 8", SystemInfo.getModel(identifier: "iPhone10,4"))
28+
XCTAssertEqual("iPhone X", SystemInfo.getModel(identifier: "iPhone10,3"))
29+
XCTAssertEqual("iPhone X", SystemInfo.getModel(identifier: "iPhone10,6"))
30+
XCTAssertEqual("iPhone Xs", SystemInfo.getModel(identifier: "iPhone11,2"))
31+
XCTAssertEqual("iPhone Xs Max", SystemInfo.getModel(identifier: "iPhone11,4"))
32+
XCTAssertEqual("iPhone Xs Max", SystemInfo.getModel(identifier: "iPhone11,6"))
33+
XCTAssertEqual("iPhone XR", SystemInfo.getModel(identifier: "iPhone11,8"))
34+
XCTAssertEqual("iPhone 11", SystemInfo.getModel(identifier: "iPhone12,1"))
35+
XCTAssertEqual("iPhone 11 Pro", SystemInfo.getModel(identifier: "iPhone12,3"))
36+
XCTAssertEqual("iPhone 11 Pro Max", SystemInfo.getModel(identifier: "iPhone12,5"))
37+
XCTAssertEqual("iPhone SE (2nd generation)", SystemInfo.getModel(identifier: "iPhone12,8"))
38+
XCTAssertEqual("iPhone 12", SystemInfo.getModel(identifier: "iPhone13,2"))
39+
XCTAssertEqual("iPhone 12 mini", SystemInfo.getModel(identifier: "iPhone13,1"))
40+
XCTAssertEqual("iPhone 12 Pro", SystemInfo.getModel(identifier: "iPhone13,3"))
41+
XCTAssertEqual("iPhone 12 Pro Max", SystemInfo.getModel(identifier: "iPhone13,4"))
42+
XCTAssertEqual("iPhone 13", SystemInfo.getModel(identifier: "iPhone14,5"))
43+
XCTAssertEqual("iPhone 13 mini", SystemInfo.getModel(identifier: "iPhone14,4"))
44+
XCTAssertEqual("iPhone 13 Pro", SystemInfo.getModel(identifier: "iPhone14,2"))
45+
XCTAssertEqual("iPhone 13 Pro Max", SystemInfo.getModel(identifier: "iPhone14,3"))
46+
XCTAssertEqual("iPhone SE (3rd generation)", SystemInfo.getModel(identifier: "iPhone14,6"))
47+
XCTAssertEqual("iPhone 14", SystemInfo.getModel(identifier: "iPhone14,7"))
48+
XCTAssertEqual("iPhone 14 Plus", SystemInfo.getModel(identifier: "iPhone14,8"))
49+
XCTAssertEqual("iPhone 14 Pro", SystemInfo.getModel(identifier: "iPhone15,2"))
50+
XCTAssertEqual("iPhone 14 Pro Max", SystemInfo.getModel(identifier: "iPhone15,3"))
51+
}
52+
53+
func testGetModelFor_iPad() {
54+
XCTAssertEqual("iPad Air 2", SystemInfo.getModel(identifier: "iPad5,3"))
55+
XCTAssertEqual("iPad Air 2", SystemInfo.getModel(identifier: "iPad5,4"))
56+
XCTAssertEqual("iPad (5th generation)", SystemInfo.getModel(identifier: "iPad6,11"))
57+
XCTAssertEqual("iPad (5th generation)", SystemInfo.getModel(identifier: "iPad6,12"))
58+
XCTAssertEqual("iPad (6th generation)", SystemInfo.getModel(identifier: "iPad7,5"))
59+
XCTAssertEqual("iPad (6th generation)", SystemInfo.getModel(identifier: "iPad7,6"))
60+
XCTAssertEqual("iPad Air (3rd generation)", SystemInfo.getModel(identifier: "iPad11,3"))
61+
XCTAssertEqual("iPad Air (3rd generation)", SystemInfo.getModel(identifier: "iPad11,4"))
62+
XCTAssertEqual("iPad (7th generation)", SystemInfo.getModel(identifier: "iPad7,11"))
63+
XCTAssertEqual("iPad (7th generation)", SystemInfo.getModel(identifier: "iPad7,12"))
64+
XCTAssertEqual("iPad (8th generation)", SystemInfo.getModel(identifier: "iPad11,6"))
65+
XCTAssertEqual("iPad (8th generation)", SystemInfo.getModel(identifier: "iPad11,7"))
66+
XCTAssertEqual("iPad (9th generation)", SystemInfo.getModel(identifier: "iPad12,1"))
67+
XCTAssertEqual("iPad (9th generation)", SystemInfo.getModel(identifier: "iPad12,2"))
68+
XCTAssertEqual("iPad (10th generation)", SystemInfo.getModel(identifier: "iPad13,18"))
69+
XCTAssertEqual("iPad (10th generation)", SystemInfo.getModel(identifier: "iPad13,19"))
70+
XCTAssertEqual("iPad Air (4th generation)", SystemInfo.getModel(identifier: "iPad13,1"))
71+
XCTAssertEqual("iPad Air (4th generation)", SystemInfo.getModel(identifier: "iPad13,2"))
72+
XCTAssertEqual("iPad Air (5th generation)", SystemInfo.getModel(identifier: "iPad13,16"))
73+
XCTAssertEqual("iPad Air (5th generation)", SystemInfo.getModel(identifier: "iPad13,17"))
74+
XCTAssertEqual("iPad Mini 3", SystemInfo.getModel(identifier: "iPad4,7"))
75+
XCTAssertEqual("iPad Mini 3", SystemInfo.getModel(identifier: "iPad4,8"))
76+
XCTAssertEqual("iPad Mini 3", SystemInfo.getModel(identifier: "iPad4,9"))
77+
XCTAssertEqual("iPad Mini (5th generation)", SystemInfo.getModel(identifier: "iPad11,1"))
78+
XCTAssertEqual("iPad Mini (5th generation)", SystemInfo.getModel(identifier: "iPad11,2"))
79+
XCTAssertEqual("iPad Mini (6th generation)", SystemInfo.getModel(identifier: "iPad14,1"))
80+
XCTAssertEqual("iPad Mini (6th generation)", SystemInfo.getModel(identifier: "iPad14,2"))
81+
XCTAssertEqual("iPad Pro (9.7-inch)", SystemInfo.getModel(identifier: "iPad6,3"))
82+
XCTAssertEqual("iPad Pro (9.7-inch)", SystemInfo.getModel(identifier: "iPad6,4"))
83+
XCTAssertEqual("iPad Pro (12.9-inch)", SystemInfo.getModel(identifier: "iPad6,7"))
84+
XCTAssertEqual("iPad Pro (12.9-inch)", SystemInfo.getModel(identifier: "iPad6,8"))
85+
XCTAssertEqual("iPad Pro (12.9-inch) (2nd generation)", SystemInfo.getModel(identifier: "iPad7,1"))
86+
XCTAssertEqual("iPad Pro (12.9-inch) (2nd generation)", SystemInfo.getModel(identifier: "iPad7,2"))
87+
XCTAssertEqual("iPad Pro (10.5-inch)", SystemInfo.getModel(identifier: "iPad7,3"))
88+
XCTAssertEqual("iPad Pro (10.5-inch)", SystemInfo.getModel(identifier: "iPad7,4"))
89+
XCTAssertEqual("iPad Pro (11-inch)", SystemInfo.getModel(identifier: "iPad8,1"))
90+
XCTAssertEqual("iPad Pro (11-inch)", SystemInfo.getModel(identifier: "iPad8,2"))
91+
XCTAssertEqual("iPad Pro (11-inch)", SystemInfo.getModel(identifier: "iPad8,3"))
92+
XCTAssertEqual("iPad Pro (11-inch)", SystemInfo.getModel(identifier: "iPad8,4"))
93+
XCTAssertEqual("iPad Pro (12.9-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad8,5"))
94+
XCTAssertEqual("iPad Pro (12.9-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad8,6"))
95+
XCTAssertEqual("iPad Pro (12.9-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad8,7"))
96+
XCTAssertEqual("iPad Pro (12.9-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad8,8"))
97+
XCTAssertEqual("iPad Pro (11-inch) (2nd generation)", SystemInfo.getModel(identifier: "iPad8,9"))
98+
XCTAssertEqual("iPad Pro (11-inch) (2nd generation)", SystemInfo.getModel(identifier: "iPad8,10"))
99+
XCTAssertEqual("iPad Pro (12.9-inch) (4th generation)", SystemInfo.getModel(identifier: "iPad8,11"))
100+
XCTAssertEqual("iPad Pro (12.9-inch) (4th generation)", SystemInfo.getModel(identifier: "iPad8,12"))
101+
XCTAssertEqual("iPad Pro (11-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad13,4"))
102+
XCTAssertEqual("iPad Pro (11-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad13,5"))
103+
XCTAssertEqual("iPad Pro (11-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad13,6"))
104+
XCTAssertEqual("iPad Pro (11-inch) (3rd generation)", SystemInfo.getModel(identifier: "iPad13,7"))
105+
XCTAssertEqual("iPad Pro (12.9-inch) (5th generation)", SystemInfo.getModel(identifier: "iPad13,8"))
106+
XCTAssertEqual("iPad Pro (12.9-inch) (5th generation)", SystemInfo.getModel(identifier: "iPad13,9"))
107+
XCTAssertEqual("iPad Pro (12.9-inch) (5th generation)", SystemInfo.getModel(identifier: "iPad13,10"))
108+
XCTAssertEqual("iPad Pro (12.9-inch) (5th generation)", SystemInfo.getModel(identifier: "iPad13,11"))
109+
XCTAssertEqual("iPad Pro (11-inch) (4th generation)", SystemInfo.getModel(identifier: "iPad14,3"))
110+
XCTAssertEqual("iPad Pro (11-inch) (4th generation)", SystemInfo.getModel(identifier: "iPad14,4"))
111+
XCTAssertEqual("iPad Pro (12.9-inch) (6th generation)", SystemInfo.getModel(identifier: "iPad14,5"))
112+
XCTAssertEqual("iPad Pro (12.9-inch) (6th generation)", SystemInfo.getModel(identifier: "iPad14,6"))
113+
}
114+
115+
func testGetModelFor_iPod() {
116+
XCTAssertEqual("iPod touch (7th generation)", SystemInfo.getModel(identifier: "iPod9,1"))
117+
}
118+
119+
func testGetModelFor_UnKnow() {
120+
XCTAssertEqual("iPhone100,1", SystemInfo.getModel(identifier: "iPhone100,1"))
121+
}
122+
}

0 commit comments

Comments
 (0)