Info.plist checker for App Store uploads
Paste or drop your app's Info.plist and see what App Store Connect would refuse, what is malformed, and what is worth knowing, each with the Apple page behind it. It reads the project file and the one inside a built app, XML or binary. Nothing is uploaded.
Rules are from Apple's Information Property List documentation and App Store Connect upload messages, checked on 2026-10-31. Each message links to the Apple page behind it.
Drop Info.plist here, or open it from a built app (App.app/Info.plist on iOS, App.app/Contents/Info.plist on a Mac). Binary plists work too. The file is read in this page and never uploaded.
How it works
- •The file is parsed in your browser. It tells a project Info.plist (with $(PRODUCT_BUNDLE_IDENTIFIER)-style variables, which Xcode fills in at build time) from a built one (with the DT… keys Xcode adds), and reads the platform and SDK from the file when it can.
- •Every check comes from an Apple page: the key pages in Apple's Information Property List reference, TN3208 for the launch screen required with the iOS 27 SDK, TN3192 for UIRequiresFullScreen, canOpenURL for the LSApplicationQueriesSchemes limits, and Apple's export compliance guide.
- •Purpose strings (NS…UsageDescription) are checked for blanks, placeholder text, wrong case in the key name and Apple's 4,000-byte limit, using the same key list as our purpose string writer.
- •We ran it over the Info.plist files of Mac App Store apps and of iOS apps that are live on the App Store. It reports no errors on them; the old iPad orientation rule was turned into a note after we found portrait-only iPad apps accepted this year.
What it does not do
- •It sees one file. It cannot tell whether the icon, storyboard or entitlements in the app bundle match it, or whether the bundle ID is registered in your account.
- •App Store Connect runs more checks than any one file shows, such as signing, icons and SDK minimums. Treat a clean result here as one step, not a guarantee.
- •Wording of purpose strings is only checked for blanks and placeholders here. For tone and clarity, use the purpose string writer linked below.
Questions
- What does ITMS-90870 “Missing launch screen” mean?
- From the iOS 27 SDK, App Store Connect requires a launch screen. The built Info.plist must contain UILaunchScreen, UILaunchScreens, UILaunchStoryboardName or UILaunchStoryboards. In a SwiftUI project, turning on the Launch Screen (Generation) build setting adds an empty UILaunchScreen, which is enough.
- Why does my Info.plist say $(PRODUCT_BUNDLE_IDENTIFIER)?
- That is the project file. Xcode replaces each $(…) variable with the build setting's value when it builds, so the Info.plist inside the .app has the real bundle ID. If a built app still shows $(…), the build setting is missing for that target or configuration.
- What format do CFBundleShortVersionString and CFBundleVersion need?
- Digits and periods only. The version shown in the App Store, CFBundleShortVersionString, is Major.Minor.Patch, such as 1.4.2. The build number, CFBundleVersion, is one to three numbers, such as 42 or 1.4.2; the system ignores any extra numbers.
- Do I need ITSAppUsesNonExemptEncryption?
- It is not required, but without it App Store Connect asks the export compliance questions for every build. Set it to NO if your app uses no encryption, or only exempt encryption such as HTTPS through URLSession; set it to YES if it uses non-exempt encryption, and add the code Apple gives you as ITSEncryptionExportComplianceCode.
- Why does my Mac upload fail with “must contain a LSApplicationCategoryType key”?
- Mac App Store builds need a category. Choose App Category in the target's General tab, or add LSApplicationCategoryType with a value such as public.app-category.productivity.
- Where do I find the Info.plist of a built app?
- On a Mac, right-click the app, choose Show Package Contents and open Contents/Info.plist. For an .ipa, rename it to .zip, unzip it and open Payload/YourApp.app/Info.plist. Both are often binary plists, which this page reads as they are.