When uploading an IPA to App Store Connect on macOS, a common issue is that the IPA is exported successfully with correct signing and no errors from Xcode Archive, but during the upload phase you get Missing AppStoreInfo.plist or Could not locate AppStoreInfo.plist.
Many developers instinctively try to manually create the plist file, copy it from an old project, or unzip the IPA and patch the file.
This not only fails to solve the problem but also introduces new metadata errors.
This article directly analyzes where AppStoreInfo.plist is generated and how to avoid manually maintaining it on macOS.
The file does not actually exist inside the IPA
Some developers unzip app.ipa and search for AppStoreInfo.plist in the Payload directory, only to find it does not exist. This is normal because AppStoreInfo.plist is not part of the app bundle itself.
It belongs to the upload metadata, not the App Bundle.
Why it is missing even on Mac
Many assume that using a Mac guarantees the plist file, but that is not the case.
The following scenarios often cause it:
| Scenario | Result |
|---|---|
| Using command-line upload | Missing metadata |
| Custom upload script | Plist not generated |
| CI upload | Only IPA generated |
| Non-Xcode upload | No metadata phase |
Why Xcode rarely reports this issue
During the Archive → Export process, Xcode automatically generates metadata and assembles the upload structure, so developers are unaware of it.
The real issue is during the upload phase
If the IPA is signed, can be installed, has the correct Bundle ID, but reports a plist error during upload, it means the upload tool lacks the ability to generate metadata.
Do not manually create the plist
Some online methods suggest:
<?xml version="1.0" encoding="UTF-8"?>
and then manually write the fields. The problem is that Apple metadata fields change, upload protocols update, and different Transporter versions have different structures. Incomplete fields will cause upload failure directly.
A simpler approach: auto-generate during upload
On macOS, a more stable method is to let the upload tool automatically generate AppStoreInfo.plist.
This eliminates the need to maintain the plist, study metadata formats, or manually assemble XML.
Using AppUploader CLI to upload
Tool location
mac version: inside AppUploader.app/runtime/, after entering the runtime, you can use appuploader_cli. Upload command:
Example:
appuploader_cli --upload-app -f Payload.ipa -u user@example.com -p xxxx-xxxx-xxxx-xxxx --type ios
Or:
appuploader_cli upload -f Payload.ipa -u user@example.com -p xxxx-xxxx-xxxx-xxxx --type ios
When uploading via CLI, it automatically parses the IPA, reads the Bundle ID, Version, Build Number,
creates metadata including AppStoreInfo.plist, and then invokes the upload interface to upload to App Store Connect.
Command-line is more suitable for long-term projects
If the project already uses:
- Fastlane
- Jenkins
- GitHub Actions
- GitLab CI
GUI upload becomes inconvenient.
CLI is more suitable for:
| Scenario | Advantage |
|---|---|
| Automated builds | Scriptable |
| Multi-project upload | Easy batch processing |
| Remote servers | No GUI dependency |
Example:
- Flutter packaging IPA
- Mac mini as CI node
- Jenkins automatic upload
Script:
./appuploader_cli upload \
-f build/ios/app.ipa \
-u ci@example.com \
-p xxxx-xxxx-xxxx-xxxx \
--type ios
Metadata is automatically generated during upload, no manual plist intervention required.
AppStoreInfo.plist belongs to the metadata generation phase, not the app build phase.
If the upload tool already supports automatic metadata generation, there is no need to manually maintain the plist file.
Top comments (0)