├── .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 | --------------------------------------------------------------------------------