Info.plist is an XML configuration file for iOS and macOS applications that contains metadata, permissions, and launch settings. It is processed by the system before application code initialization. According to Apple Developer, 2025, without a properly configured Info.plist, the application will not pass App Store review. Info.plist defines the bundle identifier, build version, requested permissions, and supported screen orientations.
Key Takeaways
Info.plist is a file in XML format with a root dict element containing key-value pairs as a property list. It is located inside the application bundle and is read by the system at each launch before code execution. The plist format supports strings, numbers, arrays, dictionaries, dates, and boolean values, allowing complex configurations to be described.
Apple uses Info.plist to define the application’s identity, capabilities, and requirements. Changing certain keys requires rebuilding the bundle, as they affect metadata checked by the App Store when uploading a build. For example, changing CFBundleVersion or CFBundleIdentifier after publication may break the app update process, since App Store Connect uses these values to identify versions.
Basic keys are created automatically when creating a project in Xcode, but most settings are added manually as the application’s functionality evolves. Xcode provides a graphical Info.plist editor with dropdown lists for standard keys, reducing the risk of typos. However, for complex configurations such as Scene Manifest or Background Modes, it is recommended to edit the raw XML directly.
Some Info.plist keys are required for publishing in the App Store. Their absence leads to build rejection at the validation stage. Apple checks these keys automatically when uploading an archive via Xcode Organizer or Transporter. Developers must ensure all required fields are correctly filled before submitting for review.
The key CFBundleIdentifier sets a unique application identifier in reverse domain notation (com.company.appname). It is used for code signing, Push Notifications, CloudKit, App Groups, and many other Apple services. Changing the identifier after publication is treated by the App Store as a new application, and existing users will not receive the update. Therefore, the identifier must remain unchanged throughout the entire application lifecycle.
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>
The keys CFBundleShortVersionString (displayed version) and CFBundleVersion (build number) are used by App Store Connect and the system for update management. The version is specified in major.minor.patch format. The build number must increment with every build uploaded to App Store Connect, even if the app version does not change. Apple uses CFBundleVersion to determine whether a build is new or duplicates an already uploaded one. If the build number matches a previously uploaded one, an ITMS-90161 error is returned.
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>
The keys UISupportedInterfaceOrientations define the supported screen orientations for iPhone. For iPad, a separate key UISupportedInterfaceOrientations~ipad with a device suffix is used. Each orientation is specified as a string: UIInterfaceOrientationPortrait, UIInterfaceOrientationLandscapeLeft, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationLandscapeRight, UIInterfaceOrientationPortraitUpsideDown. If an app supports only portrait orientation and is not iPhone-only, the App Store will reject the build if only portrait is specified for iPad.
<key>UISupportedInterfaceOrientations</key>
<array>
<string>UIInterfaceOrientationPortrait</string>
<string>UIInterfaceOrientationLandscapeLeft</string>
</array>
Since iOS 10, Apple requires a description for each requested permission through keys with the NS prefix (NeXTStep). The description is displayed to the user in a system dialog upon the first request for access to private APIs. The absence of a corresponding NS key when calling an API that requires permission leads to an immediate application crash with an exception, which is only recorded in crash logs.
| Key | Purpose |
|---|---|
| NSCameraUsageDescription | Access to camera for photos and video |
| NSPhotoLibraryUsageDescription | Access to photo library |
| NSLocationWhenInUseUsageDescription | Geolocation while in use |
| NSMicrophoneUsageDescription | Access to microphone for audio recording |
| NSContactsUsageDescription | Access to device contacts |
Each Privacy key must contain a user-understandable description of the reason for the request. Empty or templated texts, such as “For app operation” or “Access needed”, lead to App Store rejection. The description should explain the specific functionality: “Camera access is needed for scanning QR codes and creating profile photos.” It is recommended to use localized versions of descriptions via InfoPlist.strings files for each supported language.
The absence of a required NS key when calling an API that accesses private data causes the application to crash. The system terminates the process with an exception, which is only noticeable in crash report logs from Xcode or Firebase Crashlytics. The user sees only a sudden app closure without any explanation. Therefore, before adding new functionality that uses the camera, microphone, or geolocation, you must first add the corresponding Privacy key in Info.plist, and then implement the API call.
The key CFBundleURLTypes registers custom URL schemes for deep linking into the application. This allows opening the app from a browser, email, or other applications via links like myapp://profile/123. Each scheme uniquely identifies the application: if two apps register the same scheme, the system shows the user a dialog to choose which one to use.
<key>CFBundleURLTypes</key>
<array>
<dict>
<key>CFBundleURLName</key>
<string>com.itsectr.myapp</string>
<key>CFBundleURLSchemes</key>
<array>
<string>myapp</string>
</array>
</dict>
</array>
To support Universal Links, the key com.apple.developer.associated-domains is required in the Entitlements file, not in Info.plist. Universal Links work only if a configured apple-app-site-association file exists on the server, linking the domain to the application. Unlike custom URL schemes, Universal Links do not show a confirmation dialog and do not conflict with other applications, since they use HTTPS links instead of custom schemes. However, they require a domain with a valid SSL certificate.
Custom schemes can conflict with standard iOS schemes. It is recommended to use schemes at least 4 characters long to minimize collisions with other apps. For example, the scheme “fb” is too short and may conflict. It is better to use reverse notation: myapp:// instead of app://. Also keep in mind that if the app is deleted but another app has registered the same scheme, the user may experience unexpected behavior when navigating via a link.
The key UIBackgroundModes declares the background capabilities of the application. Each mode requires a corresponding description in Info.plist and confirmation in the Xcode project capabilities. Without specifying a mode, the system may forcibly terminate the background task after 30 seconds or when resources are low.
<key>UIBackgroundModes</key>
<array>
<string>fetch</string>
<string>remote-notification</string>
<string>location</string>
<string>processing</string>
</array>
The key UIApplicationSupportsMultipleScenes enables multitasking support on iPad and Mac Catalyst. Without this key, the application cannot use SwiftUI ScenePhase or UIKit UISceneDelegate to manage multiple windows. On iPadOS, users can open multiple windows of the same app, drag content between them, and use Split View. If the application does not support multi-window mode, setting this key to false disables the corresponding functionality.
The key LSRequiresIPhoneOS prevents installation of the app on iPad. It is used for iPhone-only apps that do not support the iPad interface or have not been adapted for a large screen. However, Apple does not recommend using this key unnecessarily, as users expect apps to work on all devices running iOS and iPadOS. If the app is still limited to iPhone, ensure this requirement is technically justified and stated in the App Store description.
The key UIViewControllerBasedStatusBarAppearance controls the status bar style. If set to NO, the status bar style is set globally via the Info.plist key UIStatusBarStyle. If YES (default since iOS 7), each ViewController can manage its own status bar by overriding preferredStatusBarStyle. For modern apps, it is recommended to keep YES to have different status bar styles on different screens, for example light on a dark background and dark on a light background.
The key UIApplicationExitsOnSuspend forces the app to terminate completely when entering the background instead of suspending. It is rarely used, only for apps with high security requirements: banking apps or apps handling confidential data. In this case, the user loses the ability to quickly return to the app, and each launch starts from a clean state. The App Store may request justification for using this key during review.
The key NSAppTransportSecurity manages the app’s network connections. Since iOS 9, App Transport Security (ATS) blocks all HTTP connections by default, requiring HTTPS. To temporarily allow HTTP requests to specific domains, the NSExceptionDomains dictionary inside NSAppTransportSecurity is used. For development, complete ATS disablement via NSAllowsArbitraryLoads = true is allowed, but Apple requires justification and does not allow such builds without a valid reason. In production builds, ATS must be enabled for all domains handling user data.
Frequently Asked Questions
The Info.plist file is located in the project folder with the name matching the application name. In Xcode, it is displayed in the project navigator inside the Supporting Files group with a blue book icon. It can also be found via Spotlight search in the project.
Yes, Info.plist can be edited in any text editor or through the Xcode graphical interface. Manual editing gives full control over the content but requires attention to XML syntax: each opening <key> directive must have a corresponding </key>, and data types must match what Apple expects.
In SwiftUI projects, Info.plist works identically to UIKit projects. Additionally, the UIApplicationSceneManifest key may be required for Scene Configuration if the project does not use the App protocol for scene management. The SwiftUI App protocol automatically generates scene configuration, but customization requires manually adding keys.
Open Info.plist in Xcode, click the plus button, and enter the key name. For custom keys, use a company prefix to avoid conflicts with Apple system keys, for example ITSCustomKey instead of just CustomKey. The value type (String, Number, Array, Dictionary) is chosen based on the expected data format.
Typical reasons: missing Privacy keys for requested permissions, incorrect CFBundleIdentifier, version mismatch between Info.plist and App Store Connect, empty NS key values. Check all NS keys for the APIs being used and ensure each description contains a meaningful explanation in the app’s localization language.
Summary
We will develop a mobile application turnkey
IT Sectr creates iOS and Android applications for startups and businesses since 2017. We will advise you and propose the best solution.
Read also