When handling iOS uploads on a Linux server, many people get stuck on a strange issue: after signing the IPA and waiting to upload, the tool reports a missing AppStoreInfo.plist.

This file is easily misunderstood. It is not a resource file inside the app, nor a configuration file placed in the Payload directory. It belongs to the upload phase data, submitted together with the IPA to App Store Connect.

Confirm that Linux is responsible for uploading

In this workflow, the role of Linux is to receive the already-signed IPA and call a command-line upload tool to submit the package to App Store Connect.
The IPA can come from: Xcode Archive, Fastlane build, Flutter/React Native macOS build node, HBuilderX, or cloud packaging services. Linux does not need to participate in iOS compilation; it only handles the upload.

Why does AppStoreInfo.plist appear during Linux upload?

If you use Xcode’s graphical upload workflow, the relevant metadata is handled automatically by Xcode, and we rarely see it.

But on Linux, there is no Xcode and no Transporter GUI. If the upload tool does not automatically generate metadata, you may encounter Missing AppStoreInfo.plist, or the upload step may fail directly.

Such issues do not indicate a damaged IPA or invalid certificate. They mean that the upload lacks the description information required by the App Store.

Manually creating AppStoreInfo.plist is not recommended

Manually creating the plist seems feasible, but the maintenance cost is high. Because:

  • Metadata fields change as Apple’s upload API evolves.
  • Different upload methods may require different structures.
  • Errors in manually written fields make debugging more difficult.

If your goal is simply to upload an IPA, manually maintaining the plist is not a stable solution.

Use AppUploader CLI to auto-generate and upload

On Linux, you can use the AppUploader (Happy Launch) command-line tool to complete the upload.

The Linux version of appuploader_cli is located in the runtime directory of the downloaded package.

Navigate to the directory, grant execute permissions first: chmod +x appuploader_cli

Then execute the upload command:

./appuploader_cli --upload-app \
-f Payload.ipa \
-u user@example.com \
-p xxxx-xxxx-xxxx-xxxx \
--type ios

You can also use the subcommand syntax:

./appuploader_cli upload \
-f Payload.ipa \
-u user@example.com \
-p xxxx-xxxx-xxxx-xxxx \
--type ios

The meaning of the parameters:

  • -f specifies the IPA file path
  • -u specifies the Apple developer account
  • -p specifies the app-specific password
  • --type ios specifies uploading an iOS app

During upload, the CLI automatically handles the upload metadata, including AppStoreInfo.plist, without the developer needing to generate it separately.

How to integrate into CI

If the Linux node runs in Jenkins, GitLab CI, or other release systems, you can place the upload command in a script:

if [ ! -f build/app.ipa ]; then
  echo "IPA not found"
  exit 1
fi

./appuploader_cli upload \
-f build/app.ipa \
-u "$APPLE_ID" \
-p "$APP_PASSWORD" \
--type ios

This makes the upload process an automated, repeatable step:

  • Build system produces the IPA
  • Linux node checks if the file exists
  • AppUploader CLI uploads
  • App Store Connect receives the build

During this process, AppStoreInfo.plist is automatically generated by the upload tool.

Generating AppStoreInfo.plist on Linux is more accurately described as auto-generation during upload, rather than manual creation.

As long as the IPA is signed, using the AppUploader CLI allows direct upload to App Store Connect from Linux, with automatic metadata handling.