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.