├── .gitignore
├── DeviceInformation
├── .gitignore
├── DeviceInformation
│ ├── Assets.xcassets
│ │ ├── Contents.json
│ │ ├── AccentColor.colorset
│ │ │ └── Contents.json
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Preview Content
│ │ └── Preview Assets.xcassets
│ │ │ └── Contents.json
│ ├── DeviceInformationApp.swift
│ ├── DeviceInformation.entitlements
│ └── ContentView.swift
└── DeviceInformation.xcodeproj
│ ├── project.xcworkspace
│ ├── contents.xcworkspacedata
│ ├── xcuserdata
│ │ └── amitmoryossef.xcuserdatad
│ │ │ └── UserInterfaceState.xcuserstate
│ └── xcshareddata
│ │ └── IDEWorkspaceChecks.plist
│ ├── xcuserdata
│ └── amitmoryossef.xcuserdatad
│ │ └── xcschemes
│ │ └── xcschememanagement.plist
│ └── project.pbxproj
├── devices
├── iPad_Landscape.json
├── iPhone 15 Pro Max_Portrait.json
├── iPhone 11_Portrait.json
├── iPhone 12_Portrait.json
├── iPhone 13_Portrait.json
├── iPhone 15_Portrait.json
├── iPhone 8_Portrait.json
├── iPad (10th generation)_Portrait.json
├── iPad (9th generation)_Portrait.json
├── iPad Pro (9.7-inch)_Portrait.json
├── iPhone 11 Pro_Portrait.json
├── iPhone 12 Pro_Portrait.json
├── iPhone 12 mini_Portrait.json
├── iPhone 13 Pro_Portrait.json
├── iPhone 13 mini_Portrait.json
├── iPhone 15 Plus_Portrait.json
├── iPhone 15 Pro_Portrait.json
├── iPhone 8 Plus_Portrait.json
├── iPad Air (5th generation)_Portrait.json
├── iPad mini (6th generation)_Portrait.json
├── iPhone 11 Pro Max_Portrait.json
├── iPhone 12 Pro Max_Portrait.json
├── iPhone 13 Pro Max_Portrait.json
├── iPad Pro (11-inch) (3rd generation)_Portrait.json
├── iPad Pro (11-inch) (4th generation)_Portrait.json
├── iPad Pro (12.9-inch) (5th generation)_Portrait.json
└── iPad Pro (12.9-inch) (6th generation)_Portrait.json
├── README.md
├── LICENSE
└── collect_device_information.sh
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea/
2 | .DS_Store
--------------------------------------------------------------------------------
/DeviceInformation/.gitignore:
--------------------------------------------------------------------------------
1 | Build/
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/Preview Content/Preview Assets.xcassets/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "info" : {
3 | "author" : "xcode",
4 | "version" : 1
5 | }
6 | }
7 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/DeviceInformationApp.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 |
3 | @main
4 | struct DeviceInformationApp: App {
5 | var body: some Scene {
6 | WindowGroup {
7 | ContentView()
8 | }
9 | }
10 | }
11 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/Assets.xcassets/AccentColor.colorset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "colors" : [
3 | {
4 | "idiom" : "universal"
5 | }
6 | ],
7 | "info" : {
8 | "author" : "xcode",
9 | "version" : 1
10 | }
11 | }
12 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation.xcodeproj/project.xcworkspace/xcuserdata/amitmoryossef.xcuserdatad/UserInterfaceState.xcuserstate:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/sign/apple-device-information/main/DeviceInformation/DeviceInformation.xcodeproj/project.xcworkspace/xcuserdata/amitmoryossef.xcuserdatad/UserInterfaceState.xcuserstate
--------------------------------------------------------------------------------
/devices/iPad_Landscape.json:
--------------------------------------------------------------------------------
1 | {
2 | "isMobile" : true,
3 | "safeAreaInsets" : {
4 | "trailing" : 0,
5 | "bottom" : 20,
6 | "top" : 0,
7 | "leading" : 0
8 | },
9 | "userAgent" : "Unknown",
10 | "hasTouch" : true,
11 | "deviceScaleFactor" : 2,
12 | "dimensions" : {
13 | "height" : 834,
14 | "width" : 1194
15 | }
16 | }
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation.xcodeproj/project.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/devices/iPhone 15 Pro Max_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "isMobile" : true,
3 | "hasTouch" : true,
4 | "safeAreaInsets" : {
5 | "trailing" : 0,
6 | "bottom" : 34,
7 | "top" : 59,
8 | "leading" : 0
9 | },
10 | "userAgent" : "Unknown",
11 | "dimensions" : {
12 | "height" : 932,
13 | "width" : 430
14 | },
15 | "deviceScaleFactor" : 3
16 | }
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/DeviceInformation.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | com.apple.security.app-sandbox
6 |
7 | com.apple.security.files.user-selected.read-only
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/devices/iPhone 11_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "dimensions" : {
3 | "height" : 896,
4 | "width" : 414
5 | },
6 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
7 | "deviceScaleFactor" : 2,
8 | "isMobile" : true,
9 | "hasTouch" : true,
10 | "safeAreaInsets" : {
11 | "top" : 48,
12 | "leading" : 0,
13 | "trailing" : 0,
14 | "bottom" : 34
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 12_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "safeAreaInsets" : {
3 | "trailing" : 0,
4 | "top" : 47,
5 | "leading" : 0,
6 | "bottom" : 34
7 | },
8 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
9 | "isMobile" : true,
10 | "deviceScaleFactor" : 3,
11 | "hasTouch" : true,
12 | "dimensions" : {
13 | "height" : 844,
14 | "width" : 390
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 13_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "deviceScaleFactor" : 3,
3 | "hasTouch" : true,
4 | "dimensions" : {
5 | "height" : 844,
6 | "width" : 390
7 | },
8 | "safeAreaInsets" : {
9 | "bottom" : 34,
10 | "trailing" : 0,
11 | "top" : 47,
12 | "leading" : 0
13 | },
14 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
15 | "isMobile" : true
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 15_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
3 | "isMobile" : true,
4 | "deviceScaleFactor" : 3,
5 | "hasTouch" : true,
6 | "safeAreaInsets" : {
7 | "leading" : 0,
8 | "bottom" : 34,
9 | "trailing" : 0,
10 | "top" : 59
11 | },
12 | "dimensions" : {
13 | "height" : 852,
14 | "width" : 393
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 8_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "hasTouch" : true,
3 | "deviceScaleFactor" : 2,
4 | "dimensions" : {
5 | "width" : 375,
6 | "height" : 667
7 | },
8 | "safeAreaInsets" : {
9 | "top" : 20,
10 | "trailing" : 0,
11 | "bottom" : 0,
12 | "leading" : 0
13 | },
14 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
15 | "isMobile" : true
16 | }
--------------------------------------------------------------------------------
/devices/iPad (10th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "deviceScaleFactor" : 2,
3 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
4 | "dimensions" : {
5 | "height" : 1180,
6 | "width" : 820
7 | },
8 | "hasTouch" : true,
9 | "safeAreaInsets" : {
10 | "leading" : 0,
11 | "trailing" : 0,
12 | "top" : 24,
13 | "bottom" : 20
14 | },
15 | "isMobile" : true
16 | }
--------------------------------------------------------------------------------
/devices/iPad (9th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "isMobile" : true,
3 | "safeAreaInsets" : {
4 | "top" : 20,
5 | "bottom" : 0,
6 | "trailing" : 0,
7 | "leading" : 0
8 | },
9 | "hasTouch" : true,
10 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
11 | "dimensions" : {
12 | "height" : 1080,
13 | "width" : 810
14 | },
15 | "deviceScaleFactor" : 2
16 | }
--------------------------------------------------------------------------------
/devices/iPad Pro (9.7-inch)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "safeAreaInsets" : {
3 | "bottom" : 0,
4 | "leading" : 0,
5 | "top" : 20,
6 | "trailing" : 0
7 | },
8 | "isMobile" : true,
9 | "deviceScaleFactor" : 2,
10 | "hasTouch" : true,
11 | "dimensions" : {
12 | "width" : 768,
13 | "height" : 1024
14 | },
15 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148"
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 11 Pro_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "hasTouch" : true,
3 | "isMobile" : true,
4 | "dimensions" : {
5 | "width" : 375,
6 | "height" : 812
7 | },
8 | "safeAreaInsets" : {
9 | "top" : 44,
10 | "leading" : 0,
11 | "bottom" : 34,
12 | "trailing" : 0
13 | },
14 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
15 | "deviceScaleFactor" : 3
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 12 Pro_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
3 | "hasTouch" : true,
4 | "dimensions" : {
5 | "width" : 390,
6 | "height" : 844
7 | },
8 | "safeAreaInsets" : {
9 | "trailing" : 0,
10 | "leading" : 0,
11 | "top" : 47,
12 | "bottom" : 34
13 | },
14 | "deviceScaleFactor" : 3,
15 | "isMobile" : true
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 12 mini_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "safeAreaInsets" : {
3 | "bottom" : 34,
4 | "leading" : 0,
5 | "top" : 50,
6 | "trailing" : 0
7 | },
8 | "hasTouch" : true,
9 | "dimensions" : {
10 | "height" : 812,
11 | "width" : 375
12 | },
13 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
14 | "deviceScaleFactor" : 3,
15 | "isMobile" : true
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 13 Pro_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "isMobile" : true,
3 | "hasTouch" : true,
4 | "deviceScaleFactor" : 3,
5 | "dimensions" : {
6 | "width" : 390,
7 | "height" : 844
8 | },
9 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
10 | "safeAreaInsets" : {
11 | "bottom" : 34,
12 | "trailing" : 0,
13 | "leading" : 0,
14 | "top" : 47
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 13 mini_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
3 | "deviceScaleFactor" : 3,
4 | "hasTouch" : true,
5 | "isMobile" : true,
6 | "safeAreaInsets" : {
7 | "top" : 50,
8 | "trailing" : 0,
9 | "bottom" : 34,
10 | "leading" : 0
11 | },
12 | "dimensions" : {
13 | "height" : 812,
14 | "width" : 375
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 15 Plus_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "dimensions" : {
3 | "height" : 932,
4 | "width" : 430
5 | },
6 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
7 | "hasTouch" : true,
8 | "safeAreaInsets" : {
9 | "trailing" : 0,
10 | "leading" : 0,
11 | "top" : 59,
12 | "bottom" : 34
13 | },
14 | "isMobile" : true,
15 | "deviceScaleFactor" : 3
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 15 Pro_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "hasTouch" : true,
3 | "deviceScaleFactor" : 3,
4 | "dimensions" : {
5 | "width" : 393,
6 | "height" : 852
7 | },
8 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
9 | "isMobile" : true,
10 | "safeAreaInsets" : {
11 | "top" : 59,
12 | "bottom" : 34,
13 | "trailing" : 0,
14 | "leading" : 0
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 8 Plus_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "deviceScaleFactor" : 3,
3 | "isMobile" : true,
4 | "hasTouch" : true,
5 | "dimensions" : {
6 | "width" : 414,
7 | "height" : 736
8 | },
9 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
10 | "safeAreaInsets" : {
11 | "leading" : 0,
12 | "trailing" : 0,
13 | "bottom" : 0,
14 | "top" : 20
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPad Air (5th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "isMobile" : true,
3 | "safeAreaInsets" : {
4 | "bottom" : 20,
5 | "leading" : 0,
6 | "top" : 24,
7 | "trailing" : 0
8 | },
9 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
10 | "deviceScaleFactor" : 2,
11 | "hasTouch" : true,
12 | "dimensions" : {
13 | "height" : 1180,
14 | "width" : 820
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPad mini (6th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "hasTouch" : true,
3 | "isMobile" : true,
4 | "deviceScaleFactor" : 2,
5 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
6 | "safeAreaInsets" : {
7 | "trailing" : 0,
8 | "top" : 24,
9 | "leading" : 0,
10 | "bottom" : 20
11 | },
12 | "dimensions" : {
13 | "height" : 1133,
14 | "width" : 744
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 11 Pro Max_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
3 | "hasTouch" : true,
4 | "deviceScaleFactor" : 3,
5 | "safeAreaInsets" : {
6 | "trailing" : 0,
7 | "top" : 44,
8 | "leading" : 0,
9 | "bottom" : 34
10 | },
11 | "isMobile" : true,
12 | "dimensions" : {
13 | "height" : 896,
14 | "width" : 414
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 12 Pro Max_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "safeAreaInsets" : {
3 | "leading" : 0,
4 | "top" : 47,
5 | "trailing" : 0,
6 | "bottom" : 34
7 | },
8 | "hasTouch" : true,
9 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
10 | "isMobile" : true,
11 | "dimensions" : {
12 | "height" : 926,
13 | "width" : 428
14 | },
15 | "deviceScaleFactor" : 3
16 | }
--------------------------------------------------------------------------------
/devices/iPhone 13 Pro Max_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "deviceScaleFactor" : 3,
3 | "hasTouch" : true,
4 | "isMobile" : true,
5 | "dimensions" : {
6 | "height" : 926,
7 | "width" : 428
8 | },
9 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
10 | "safeAreaInsets" : {
11 | "top" : 47,
12 | "bottom" : 34,
13 | "trailing" : 0,
14 | "leading" : 0
15 | }
16 | }
--------------------------------------------------------------------------------
/devices/iPad Pro (11-inch) (3rd generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
3 | "deviceScaleFactor" : 2,
4 | "safeAreaInsets" : {
5 | "trailing" : 0,
6 | "leading" : 0,
7 | "bottom" : 20,
8 | "top" : 24
9 | },
10 | "isMobile" : true,
11 | "dimensions" : {
12 | "width" : 834,
13 | "height" : 1194
14 | },
15 | "hasTouch" : true
16 | }
--------------------------------------------------------------------------------
/devices/iPad Pro (11-inch) (4th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "safeAreaInsets" : {
3 | "bottom" : 20,
4 | "top" : 24,
5 | "leading" : 0,
6 | "trailing" : 0
7 | },
8 | "isMobile" : true,
9 | "hasTouch" : true,
10 | "deviceScaleFactor" : 2,
11 | "dimensions" : {
12 | "height" : 1194,
13 | "width" : 834
14 | },
15 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148"
16 | }
--------------------------------------------------------------------------------
/devices/iPad Pro (12.9-inch) (5th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "safeAreaInsets" : {
3 | "top" : 24,
4 | "leading" : 0,
5 | "bottom" : 20,
6 | "trailing" : 0
7 | },
8 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 15_5 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
9 | "isMobile" : true,
10 | "hasTouch" : true,
11 | "dimensions" : {
12 | "height" : 1366,
13 | "width" : 1024
14 | },
15 | "deviceScaleFactor" : 2
16 | }
--------------------------------------------------------------------------------
/devices/iPad Pro (12.9-inch) (6th generation)_Portrait.json:
--------------------------------------------------------------------------------
1 | {
2 | "userAgent" : "Mozilla\/5.0 (iPad; CPU OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148",
3 | "dimensions" : {
4 | "width" : 1024,
5 | "height" : 1366
6 | },
7 | "deviceScaleFactor" : 2,
8 | "isMobile" : true,
9 | "hasTouch" : true,
10 | "safeAreaInsets" : {
11 | "leading" : 0,
12 | "top" : 24,
13 | "bottom" : 20,
14 | "trailing" : 0
15 | }
16 | }
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation.xcodeproj/xcuserdata/amitmoryossef.xcuserdatad/xcschemes/xcschememanagement.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | SchemeUserState
6 |
7 | DeviceInformation.xcscheme_^#shared#^_
8 |
9 | orderHint
10 | 0
11 |
12 |
13 |
14 |
15 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # Apple Device Information
2 |
3 | This repository contains information about Apple devices.
4 |
5 | For each device type,
6 | the device type, orientation, userAgent, and viewport are listed, including safe area specifications.
7 | ```json
8 | {
9 | "deviceScaleFactor" : 3,
10 | "dimensions" : {
11 | "width" : 393,
12 | "height" : 852
13 | },
14 | "safeAreaInsets" : {
15 | "top" : 59,
16 | "bottom" : 34,
17 | "trailing" : 0,
18 | "leading" : 0
19 | },
20 | "isMobile" : true,
21 | "hasTouch" : true,
22 | "userAgent" : "Mozilla\/5.0 (iPhone; CPU iPhone OS 17_2 like Mac OS X) AppleWebKit\/605.1.15 (KHTML, like Gecko) Mobile\/15E148"
23 | }
24 | ```
25 |
26 | ## Automation
27 |
28 | To collect the information for more devices, dependeing on simulators available on your machine,
29 | you can run the following command:
30 | ```bash
31 | ./collect_device_information.sh
32 | ```
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2024 sign
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "universal",
5 | "platform" : "ios",
6 | "size" : "1024x1024"
7 | },
8 | {
9 | "idiom" : "mac",
10 | "scale" : "1x",
11 | "size" : "16x16"
12 | },
13 | {
14 | "idiom" : "mac",
15 | "scale" : "2x",
16 | "size" : "16x16"
17 | },
18 | {
19 | "idiom" : "mac",
20 | "scale" : "1x",
21 | "size" : "32x32"
22 | },
23 | {
24 | "idiom" : "mac",
25 | "scale" : "2x",
26 | "size" : "32x32"
27 | },
28 | {
29 | "idiom" : "mac",
30 | "scale" : "1x",
31 | "size" : "128x128"
32 | },
33 | {
34 | "idiom" : "mac",
35 | "scale" : "2x",
36 | "size" : "128x128"
37 | },
38 | {
39 | "idiom" : "mac",
40 | "scale" : "1x",
41 | "size" : "256x256"
42 | },
43 | {
44 | "idiom" : "mac",
45 | "scale" : "2x",
46 | "size" : "256x256"
47 | },
48 | {
49 | "idiom" : "mac",
50 | "scale" : "1x",
51 | "size" : "512x512"
52 | },
53 | {
54 | "idiom" : "mac",
55 | "scale" : "2x",
56 | "size" : "512x512"
57 | }
58 | ],
59 | "info" : {
60 | "author" : "xcode",
61 | "version" : 1
62 | }
63 | }
64 |
--------------------------------------------------------------------------------
/collect_device_information.sh:
--------------------------------------------------------------------------------
1 | #!/bin/bash
2 |
3 | set -e
4 | set -x
5 |
6 | BUNDLE_ID="mt.sign.DeviceInformation"
7 | APP_FILE="DeviceInformation/Build/Build/Products/Debug-iphonesimulator/DeviceInformation.app"
8 |
9 | [ ! -d "$APP_FILE" ] &&
10 | xcodebuild \
11 | -project DeviceInformation/DeviceInformation.xcodeproj \
12 | -scheme DeviceInformation \
13 | -sdk iphonesimulator \
14 | -configuration Debug \
15 | -derivedDataPath './DeviceInformation/Build'
16 |
17 | # Get a list of available simulators
18 | available_simulators=$(xcrun simctl list devices available | grep 'iPad' | grep -o '([0-9A-F\-]\+)' | tr -d '()')
19 |
20 | # Iterate through each simulator
21 | for udid in $available_simulators; do
22 | echo "Processing simulator with UDID: $udid"
23 |
24 | # Boot the simulator
25 | xcrun simctl boot "$udid" || true
26 |
27 | # Check if the simulator is fully booted
28 | while true; do
29 | if xcrun simctl list devices | grep "$udid" | grep "(Booted)"; then
30 | break
31 | fi
32 | sleep 1
33 | done
34 |
35 | # Install the app
36 | xcrun simctl install booted "$APP_FILE"
37 |
38 | # TODO: Iterate over orientations: portrait, landscape-left,
39 | # TODO: Currently, the script only runs for portrait, and couldn't find a way to set the orientation
40 |
41 | # Open your app
42 | xcrun simctl launch booted "$BUNDLE_ID"
43 |
44 | # Wait for the app to record the information
45 | sleep 10
46 |
47 | # Close the app
48 | xcrun simctl terminate booted "$BUNDLE_ID"
49 |
50 | # Shut down the simulator
51 | xcrun simctl shutdown "$udid" || true
52 | done
53 |
54 | echo "All simulators processed."
55 |
56 | cp -r /Users/Shared/devices/ devices/
57 | git add -A devices/
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation/ContentView.swift:
--------------------------------------------------------------------------------
1 | import SwiftUI
2 | import WebKit
3 |
4 | struct WebView: UIViewRepresentable {
5 | @Binding var userAgent: String
6 |
7 | func makeUIView(context: Context) -> WKWebView {
8 | return WKWebView()
9 | }
10 |
11 | func updateUIView(_ webView: WKWebView, context: Context) {
12 | webView.evaluateJavaScript("navigator.userAgent") { result, error in
13 | if let userAgent = result as? String {
14 | DispatchQueue.main.async {
15 | self.userAgent = userAgent
16 | }
17 | }
18 | }
19 | }
20 | }
21 |
22 | struct ContentView: View {
23 | @State private var userAgent = "Unknown"
24 | @State private var isDataSaved = false
25 |
26 | var body: some View {
27 | GeometryReader { geometry in
28 | VStack {
29 | WebView(userAgent: $userAgent)
30 | .frame(width: 0, height: 0) // Invisible WebView
31 |
32 | Image(systemName: "globe")
33 | .imageScale(.large)
34 | .foregroundStyle(.tint)
35 | Text(isDataSaved ? "Data Saved!" : "Capturing Data...")
36 | .onAppear {
37 | DispatchQueue.main.asyncAfter(deadline: .now() + 1) {
38 | saveDeviceData(geometry: geometry, userAgent: userAgent)
39 | isDataSaved = true
40 | }
41 | }
42 | }
43 | .padding()
44 | }
45 | }
46 |
47 | func saveDeviceData(geometry: GeometryProxy, userAgent: String) {
48 | let dimensions = UIScreen.main.bounds
49 | let safeAreaInsets = geometry.safeAreaInsets
50 | let orientation = UIDevice.current.orientation.isLandscape ? "Landscape" : "Portrait"
51 | let deviceName = UIDevice.current.name
52 | let deviceScaleFactor = UIScreen.main.scale
53 | let isMobile = true
54 | let hasTouch = true
55 |
56 | let data: [String: Any] = [
57 | "dimensions": ["width": dimensions.width, "height": dimensions.height],
58 | "safeAreaInsets": ["top": safeAreaInsets.top, "bottom": safeAreaInsets.bottom, "leading": safeAreaInsets.leading, "trailing": safeAreaInsets.trailing],
59 | "userAgent": userAgent,
60 | "deviceScaleFactor": deviceScaleFactor,
61 | "isMobile": isMobile,
62 | "hasTouch": hasTouch
63 | ]
64 |
65 | if let jsonData = try? JSONSerialization.data(withJSONObject: data, options: .prettyPrinted) {
66 | let baseFolderPath = "/Users/Shared/"
67 | let devicesFolderPath = baseFolderPath + "devices/"
68 | let fileManager = FileManager.default
69 |
70 | // Check if 'devices' directory exists, if not, create it
71 | if !fileManager.fileExists(atPath: devicesFolderPath) {
72 | do {
73 | try fileManager.createDirectory(atPath: devicesFolderPath, withIntermediateDirectories: true, attributes: nil)
74 | } catch {
75 | print("Error creating directory: \(error)")
76 | return
77 | }
78 | }
79 |
80 | let fileName = "\(UIDevice.current.name)_\(UIDevice.current.orientation.isLandscape ? "Landscape" : "Portrait").json"
81 | let fileURL = URL(fileURLWithPath: devicesFolderPath).appendingPathComponent(fileName)
82 |
83 | // Writing to the file
84 | do {
85 | try jsonData.write(to: fileURL)
86 | } catch {
87 | print("Error writing to file: \(error)")
88 | }
89 | }
90 | }
91 | }
92 |
93 | // Preview
94 | struct ContentView_Previews: PreviewProvider {
95 | static var previews: some View {
96 | ContentView()
97 | }
98 | }
99 |
--------------------------------------------------------------------------------
/DeviceInformation/DeviceInformation.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 56;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 26B91EAD2B6E49A7006DE2DC /* DeviceInformationApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B91EAC2B6E49A7006DE2DC /* DeviceInformationApp.swift */; };
11 | 26B91EAF2B6E49A7006DE2DC /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 26B91EAE2B6E49A7006DE2DC /* ContentView.swift */; };
12 | 26B91EB12B6E49A9006DE2DC /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 26B91EB02B6E49A9006DE2DC /* Assets.xcassets */; };
13 | 26B91EB52B6E49A9006DE2DC /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 26B91EB42B6E49A9006DE2DC /* Preview Assets.xcassets */; };
14 | /* End PBXBuildFile section */
15 |
16 | /* Begin PBXFileReference section */
17 | 26B91EA92B6E49A7006DE2DC /* DeviceInformation.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = DeviceInformation.app; sourceTree = BUILT_PRODUCTS_DIR; };
18 | 26B91EAC2B6E49A7006DE2DC /* DeviceInformationApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DeviceInformationApp.swift; sourceTree = ""; };
19 | 26B91EAE2B6E49A7006DE2DC /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
20 | 26B91EB02B6E49A9006DE2DC /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
21 | 26B91EB22B6E49A9006DE2DC /* DeviceInformation.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = DeviceInformation.entitlements; sourceTree = ""; };
22 | 26B91EB42B6E49A9006DE2DC /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
23 | /* End PBXFileReference section */
24 |
25 | /* Begin PBXFrameworksBuildPhase section */
26 | 26B91EA62B6E49A7006DE2DC /* Frameworks */ = {
27 | isa = PBXFrameworksBuildPhase;
28 | buildActionMask = 2147483647;
29 | files = (
30 | );
31 | runOnlyForDeploymentPostprocessing = 0;
32 | };
33 | /* End PBXFrameworksBuildPhase section */
34 |
35 | /* Begin PBXGroup section */
36 | 26B91EA02B6E49A7006DE2DC = {
37 | isa = PBXGroup;
38 | children = (
39 | 26B91EAB2B6E49A7006DE2DC /* DeviceInformation */,
40 | 26B91EAA2B6E49A7006DE2DC /* Products */,
41 | );
42 | sourceTree = "";
43 | };
44 | 26B91EAA2B6E49A7006DE2DC /* Products */ = {
45 | isa = PBXGroup;
46 | children = (
47 | 26B91EA92B6E49A7006DE2DC /* DeviceInformation.app */,
48 | );
49 | name = Products;
50 | sourceTree = "";
51 | };
52 | 26B91EAB2B6E49A7006DE2DC /* DeviceInformation */ = {
53 | isa = PBXGroup;
54 | children = (
55 | 26B91EAC2B6E49A7006DE2DC /* DeviceInformationApp.swift */,
56 | 26B91EAE2B6E49A7006DE2DC /* ContentView.swift */,
57 | 26B91EB02B6E49A9006DE2DC /* Assets.xcassets */,
58 | 26B91EB22B6E49A9006DE2DC /* DeviceInformation.entitlements */,
59 | 26B91EB32B6E49A9006DE2DC /* Preview Content */,
60 | );
61 | path = DeviceInformation;
62 | sourceTree = "";
63 | };
64 | 26B91EB32B6E49A9006DE2DC /* Preview Content */ = {
65 | isa = PBXGroup;
66 | children = (
67 | 26B91EB42B6E49A9006DE2DC /* Preview Assets.xcassets */,
68 | );
69 | path = "Preview Content";
70 | sourceTree = "";
71 | };
72 | /* End PBXGroup section */
73 |
74 | /* Begin PBXNativeTarget section */
75 | 26B91EA82B6E49A7006DE2DC /* DeviceInformation */ = {
76 | isa = PBXNativeTarget;
77 | buildConfigurationList = 26B91EB82B6E49A9006DE2DC /* Build configuration list for PBXNativeTarget "DeviceInformation" */;
78 | buildPhases = (
79 | 26B91EA52B6E49A7006DE2DC /* Sources */,
80 | 26B91EA62B6E49A7006DE2DC /* Frameworks */,
81 | 26B91EA72B6E49A7006DE2DC /* Resources */,
82 | );
83 | buildRules = (
84 | );
85 | dependencies = (
86 | );
87 | name = DeviceInformation;
88 | productName = DeviceInformation;
89 | productReference = 26B91EA92B6E49A7006DE2DC /* DeviceInformation.app */;
90 | productType = "com.apple.product-type.application";
91 | };
92 | /* End PBXNativeTarget section */
93 |
94 | /* Begin PBXProject section */
95 | 26B91EA12B6E49A7006DE2DC /* Project object */ = {
96 | isa = PBXProject;
97 | attributes = {
98 | BuildIndependentTargetsInParallel = 1;
99 | LastSwiftUpdateCheck = 1520;
100 | LastUpgradeCheck = 1520;
101 | TargetAttributes = {
102 | 26B91EA82B6E49A7006DE2DC = {
103 | CreatedOnToolsVersion = 15.2;
104 | };
105 | };
106 | };
107 | buildConfigurationList = 26B91EA42B6E49A7006DE2DC /* Build configuration list for PBXProject "DeviceInformation" */;
108 | compatibilityVersion = "Xcode 14.0";
109 | developmentRegion = en;
110 | hasScannedForEncodings = 0;
111 | knownRegions = (
112 | en,
113 | Base,
114 | );
115 | mainGroup = 26B91EA02B6E49A7006DE2DC;
116 | productRefGroup = 26B91EAA2B6E49A7006DE2DC /* Products */;
117 | projectDirPath = "";
118 | projectRoot = "";
119 | targets = (
120 | 26B91EA82B6E49A7006DE2DC /* DeviceInformation */,
121 | );
122 | };
123 | /* End PBXProject section */
124 |
125 | /* Begin PBXResourcesBuildPhase section */
126 | 26B91EA72B6E49A7006DE2DC /* Resources */ = {
127 | isa = PBXResourcesBuildPhase;
128 | buildActionMask = 2147483647;
129 | files = (
130 | 26B91EB52B6E49A9006DE2DC /* Preview Assets.xcassets in Resources */,
131 | 26B91EB12B6E49A9006DE2DC /* Assets.xcassets in Resources */,
132 | );
133 | runOnlyForDeploymentPostprocessing = 0;
134 | };
135 | /* End PBXResourcesBuildPhase section */
136 |
137 | /* Begin PBXSourcesBuildPhase section */
138 | 26B91EA52B6E49A7006DE2DC /* Sources */ = {
139 | isa = PBXSourcesBuildPhase;
140 | buildActionMask = 2147483647;
141 | files = (
142 | 26B91EAF2B6E49A7006DE2DC /* ContentView.swift in Sources */,
143 | 26B91EAD2B6E49A7006DE2DC /* DeviceInformationApp.swift in Sources */,
144 | );
145 | runOnlyForDeploymentPostprocessing = 0;
146 | };
147 | /* End PBXSourcesBuildPhase section */
148 |
149 | /* Begin XCBuildConfiguration section */
150 | 26B91EB62B6E49A9006DE2DC /* Debug */ = {
151 | isa = XCBuildConfiguration;
152 | buildSettings = {
153 | ALWAYS_SEARCH_USER_PATHS = NO;
154 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
155 | CLANG_ANALYZER_NONNULL = YES;
156 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
157 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
158 | CLANG_ENABLE_MODULES = YES;
159 | CLANG_ENABLE_OBJC_ARC = YES;
160 | CLANG_ENABLE_OBJC_WEAK = YES;
161 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
162 | CLANG_WARN_BOOL_CONVERSION = YES;
163 | CLANG_WARN_COMMA = YES;
164 | CLANG_WARN_CONSTANT_CONVERSION = YES;
165 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
166 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
167 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
168 | CLANG_WARN_EMPTY_BODY = YES;
169 | CLANG_WARN_ENUM_CONVERSION = YES;
170 | CLANG_WARN_INFINITE_RECURSION = YES;
171 | CLANG_WARN_INT_CONVERSION = YES;
172 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
173 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
174 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
175 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
176 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
177 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
178 | CLANG_WARN_STRICT_PROTOTYPES = YES;
179 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
180 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
181 | CLANG_WARN_UNREACHABLE_CODE = YES;
182 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
183 | COPY_PHASE_STRIP = NO;
184 | DEBUG_INFORMATION_FORMAT = dwarf;
185 | ENABLE_STRICT_OBJC_MSGSEND = YES;
186 | ENABLE_TESTABILITY = YES;
187 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
188 | GCC_C_LANGUAGE_STANDARD = gnu17;
189 | GCC_DYNAMIC_NO_PIC = NO;
190 | GCC_NO_COMMON_BLOCKS = YES;
191 | GCC_OPTIMIZATION_LEVEL = 0;
192 | GCC_PREPROCESSOR_DEFINITIONS = (
193 | "DEBUG=1",
194 | "$(inherited)",
195 | );
196 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
197 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
198 | GCC_WARN_UNDECLARED_SELECTOR = YES;
199 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
200 | GCC_WARN_UNUSED_FUNCTION = YES;
201 | GCC_WARN_UNUSED_VARIABLE = YES;
202 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
203 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
204 | MTL_FAST_MATH = YES;
205 | ONLY_ACTIVE_ARCH = YES;
206 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
207 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
208 | };
209 | name = Debug;
210 | };
211 | 26B91EB72B6E49A9006DE2DC /* Release */ = {
212 | isa = XCBuildConfiguration;
213 | buildSettings = {
214 | ALWAYS_SEARCH_USER_PATHS = NO;
215 | ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
216 | CLANG_ANALYZER_NONNULL = YES;
217 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
218 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
219 | CLANG_ENABLE_MODULES = YES;
220 | CLANG_ENABLE_OBJC_ARC = YES;
221 | CLANG_ENABLE_OBJC_WEAK = YES;
222 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
223 | CLANG_WARN_BOOL_CONVERSION = YES;
224 | CLANG_WARN_COMMA = YES;
225 | CLANG_WARN_CONSTANT_CONVERSION = YES;
226 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
227 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
228 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
229 | CLANG_WARN_EMPTY_BODY = YES;
230 | CLANG_WARN_ENUM_CONVERSION = YES;
231 | CLANG_WARN_INFINITE_RECURSION = YES;
232 | CLANG_WARN_INT_CONVERSION = YES;
233 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
234 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
235 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
236 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
237 | CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
238 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
239 | CLANG_WARN_STRICT_PROTOTYPES = YES;
240 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
241 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
242 | CLANG_WARN_UNREACHABLE_CODE = YES;
243 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
244 | COPY_PHASE_STRIP = NO;
245 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
246 | ENABLE_NS_ASSERTIONS = NO;
247 | ENABLE_STRICT_OBJC_MSGSEND = YES;
248 | ENABLE_USER_SCRIPT_SANDBOXING = YES;
249 | GCC_C_LANGUAGE_STANDARD = gnu17;
250 | GCC_NO_COMMON_BLOCKS = YES;
251 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
252 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
253 | GCC_WARN_UNDECLARED_SELECTOR = YES;
254 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
255 | GCC_WARN_UNUSED_FUNCTION = YES;
256 | GCC_WARN_UNUSED_VARIABLE = YES;
257 | LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
258 | MTL_ENABLE_DEBUG_INFO = NO;
259 | MTL_FAST_MATH = YES;
260 | SWIFT_COMPILATION_MODE = wholemodule;
261 | };
262 | name = Release;
263 | };
264 | 26B91EB92B6E49A9006DE2DC /* Debug */ = {
265 | isa = XCBuildConfiguration;
266 | buildSettings = {
267 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
268 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
269 | CODE_SIGN_ENTITLEMENTS = DeviceInformation/DeviceInformation.entitlements;
270 | CODE_SIGN_STYLE = Automatic;
271 | CURRENT_PROJECT_VERSION = 1;
272 | DEVELOPMENT_ASSET_PATHS = "\"DeviceInformation/Preview Content\"";
273 | DEVELOPMENT_TEAM = M8ACAQF4GJ;
274 | ENABLE_HARDENED_RUNTIME = YES;
275 | ENABLE_PREVIEWS = YES;
276 | GENERATE_INFOPLIST_FILE = YES;
277 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
278 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
279 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
280 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
281 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
282 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
283 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
284 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
285 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
286 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
287 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
288 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
289 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
290 | MACOSX_DEPLOYMENT_TARGET = 14.0;
291 | MARKETING_VERSION = 1.0;
292 | PRODUCT_BUNDLE_IDENTIFIER = mt.sign.DeviceInformation;
293 | PRODUCT_NAME = "$(TARGET_NAME)";
294 | SDKROOT = auto;
295 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
296 | SWIFT_EMIT_LOC_STRINGS = YES;
297 | SWIFT_VERSION = 5.0;
298 | TARGETED_DEVICE_FAMILY = "1,2";
299 | };
300 | name = Debug;
301 | };
302 | 26B91EBA2B6E49A9006DE2DC /* Release */ = {
303 | isa = XCBuildConfiguration;
304 | buildSettings = {
305 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
306 | ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
307 | CODE_SIGN_ENTITLEMENTS = DeviceInformation/DeviceInformation.entitlements;
308 | CODE_SIGN_STYLE = Automatic;
309 | CURRENT_PROJECT_VERSION = 1;
310 | DEVELOPMENT_ASSET_PATHS = "\"DeviceInformation/Preview Content\"";
311 | DEVELOPMENT_TEAM = M8ACAQF4GJ;
312 | ENABLE_HARDENED_RUNTIME = YES;
313 | ENABLE_PREVIEWS = YES;
314 | GENERATE_INFOPLIST_FILE = YES;
315 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
316 | "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
317 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
318 | "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
319 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
320 | "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
321 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
322 | "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
323 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
324 | INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
325 | IPHONEOS_DEPLOYMENT_TARGET = 15.0;
326 | LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
327 | "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
328 | MACOSX_DEPLOYMENT_TARGET = 14.0;
329 | MARKETING_VERSION = 1.0;
330 | PRODUCT_BUNDLE_IDENTIFIER = mt.sign.DeviceInformation;
331 | PRODUCT_NAME = "$(TARGET_NAME)";
332 | SDKROOT = auto;
333 | SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
334 | SWIFT_EMIT_LOC_STRINGS = YES;
335 | SWIFT_VERSION = 5.0;
336 | TARGETED_DEVICE_FAMILY = "1,2";
337 | };
338 | name = Release;
339 | };
340 | /* End XCBuildConfiguration section */
341 |
342 | /* Begin XCConfigurationList section */
343 | 26B91EA42B6E49A7006DE2DC /* Build configuration list for PBXProject "DeviceInformation" */ = {
344 | isa = XCConfigurationList;
345 | buildConfigurations = (
346 | 26B91EB62B6E49A9006DE2DC /* Debug */,
347 | 26B91EB72B6E49A9006DE2DC /* Release */,
348 | );
349 | defaultConfigurationIsVisible = 0;
350 | defaultConfigurationName = Release;
351 | };
352 | 26B91EB82B6E49A9006DE2DC /* Build configuration list for PBXNativeTarget "DeviceInformation" */ = {
353 | isa = XCConfigurationList;
354 | buildConfigurations = (
355 | 26B91EB92B6E49A9006DE2DC /* Debug */,
356 | 26B91EBA2B6E49A9006DE2DC /* Release */,
357 | );
358 | defaultConfigurationIsVisible = 0;
359 | defaultConfigurationName = Release;
360 | };
361 | /* End XCConfigurationList section */
362 | };
363 | rootObject = 26B91EA12B6E49A7006DE2DC /* Project object */;
364 | }
365 |
--------------------------------------------------------------------------------