Info.plist: What It Is, Required Keys and Launch Configuration

Author: IT Sectr Published: 2026-05-31 Reading time: 8 min

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 an XML dictionary with iOS/macOS application configuration keys in plist format
  • Bundle identifier is a unique application identifier in the Apple ecosystem for signing and services
  • Privacy keys (NSCameraUsageDescription) are required for accessing camera, microphone, and geolocation
  • Custom URL schemes are configured via the CFBundleURLTypes key for deep links
  • UIRequiredDeviceCapabilities sets minimum device requirements for App Store installation

What Is Info.plist

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.

Required Info.plist Keys

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.

Bundle Identifiers

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.

xml
<key>CFBundleIdentifier</key>
<string>com.itsectr.myapp</string>

App Version

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.

xml
<key>CFBundleShortVersionString</key>
<string>1.2.0</string>
<key>CFBundleVersion</key>
<string>42</string>

Supported Interface Orientations

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.

xml
<key>UISupportedInterfaceOrientations</key>
<array>
    <string>UIInterfaceOrientationPortrait</string>
    <string>UIInterfaceOrientationLandscapeLeft</string>
</array>

Permissions and Privacy Keys

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.

KeyPurpose
NSCameraUsageDescriptionAccess to camera for photos and video
NSPhotoLibraryUsageDescriptionAccess to photo library
NSLocationWhenInUseUsageDescriptionGeolocation while in use
NSMicrophoneUsageDescriptionAccess to microphone for audio recording
NSContactsUsageDescriptionAccess 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.

Custom URL Schemes and App Links

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.

xml
<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.

Launch Configuration and Background Modes

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.

xml
<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

Where to Find Info.plist in an Xcode Project?

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.

Can Info.plist Be Edited Manually?

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.

What Is Info.plist in SwiftUI Projects?

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.

How to Add a Custom Key to Info.plist?

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.

Why Did App Store Reject My Build Because of Info.plist?

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

  • Info.plist is an XML configuration for iOS/macOS apps with metadata, permissions, and launch settings
  • CFBundleIdentifier and CFBundleVersion are required keys for identification and App Store publishing
  • Privacy keys (NSCameraUsageDescription) are required for accessing camera, microphone, and other private APIs
  • Custom URL schemes are configured via CFBundleURLTypes, Universal Links via Entitlements and apple-app-site-association
  • UIBackgroundModes declares background capabilities for proper background operation
  • Missing required keys leads to app crashes or App Store build rejection
  • Editing Info.plist is available via Xcode Interface or a text editor with XML syntax control

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.

Discuss the project

Read also