Generally, when iOS developers upload an IPA for the first time, they default to opening Xcode and using Archive → Distribute App → Upload. However, once a project enters a continuous iteration phase, this approach gradually exposes several issues:

  1. Uploading must rely on a Mac.
  2. CI environments are not easily integrated.
  3. The upload process is difficult to unify in multi-person collaboration.
  4. Transporter behavior changes significantly after Xcode upgrades.

Especially for cross-platform projects like Flutter, React Native, uni-app, and HBuilderX, the IPA is already generated by other tools. What developers truly need is just a stable way to upload the IPA.

This article specifically discusses practical methods for uploading IPA without Xcode, including:

  1. Uploading on Windows
  2. Uploading on Linux
  3. Command-line upload
  4. Automatic metadata generation
  5. Submitting to App Store Connect

Clarify: IPA Upload ≠ Xcode Build

Many people confuse “build” and “upload,” but they are two separate phases.
The build phase handles compilation, signing, and exporting the IPA.
The upload phase handles generating metadata, calling App Store Connect APIs, and submitting the IPA.

In other words, once the IPA is generated, Xcode is not necessarily required for uploading.

Which Projects Are Suitable for Uploading Without Xcode?

The following types of projects are very suitable:

Type Scenario
Flutter Codemagic / CI build
React Native Automated release
uni-app Cloud build
HBuilderX Already generated IPA
Unity Export iOS package
Jenkins Automated upload
Linux server No GUI environment

Many Teams Are Moving Away from Xcode Upload

Because Xcode’s upload logic depends on:

  1. The current macOS environment
  2. The current Xcode version
  3. The current Transporter version

After upgrades, issues such as “Deprecated Transporter usage” or “Metadata validation failed” can occur. Moreover, handling GUI in CI environments is inconvenient. Therefore, more and more teams are splitting:

Phase Tool
Build Xcode / Flutter / Cloud build
Upload CLI tool

A More Stable Solution: CLI IPA Upload

If the IPA already exists, it can be uploaded directly via the command line.

Here we take the AppUploader CLI as an example.

First, ensure the IPA is signed: verify that an App Store distribution profile and a valid Distribution certificate are used.

Obtain an Apple App-Specific Password (note: this is not the Apple ID login password; it must be created in the Apple ID account management page).

Locate the command-line tool. After downloading AppUploader:

  • Windows: runtime/appuploader_cli.exe
  • macOS: AppUploader.app/runtime/
  • Linux: runtime/appuploader_cli

Uploading the IPA

Directly execute:

1appuploader_cli --upload-app \
2-f Payload.ipa \
3-u user@example.com \
4-p xxxx-xxxx-xxxx-xxxx \
5--type ios

Alternatively:

1appuploader_cli upload \
2-f Payload.ipa \
3-u user@example.com \
4-p xxxx-xxxx-xxxx-xxxx \
5--type ios

What does the CLI do during upload? During the upload process, it automatically analyzes the IPA, reads the Bundle ID, Version, Build Number, and automatically generates metadata including AppStoreInfo.plist — no manual creation needed. It then automatically submits to App Store Connect. The entire process requires no Xcode, Transporter GUI, or manual metadata.

CI Scenario

Typical structure: Jenkins builds Flutter with flutter build ipa, then uploads on a Linux node:

1./appuploader_cli upload \
2-f build/ios/ipa/app.ipa \
3-u ci@example.com \
4-p xxxx-xxxx-xxxx-xxxx \
5--type ios

The version automatically appears in TestFlight. After upload, you can see the build in App Store Connect → TestFlight.

iOS Upload Structure

Now more and more teams split the workflow like this:

Stage Tool
Development Flutter / RN / uni-app
Build Xcode / Cloud build
Certificate Mgmt AppUploader
IPA Upload AppUploader CLI
Review Mgmt App Store Connect

In this way, a Mac is no longer the only entry point, the upload process is easier to automate, and Windows/Linux can participate in releases.

Uploading IPA without Xcode is not about bypassing Apple; it’s about separating “build” and “upload” into two independent steps. Once the IPA is generated, uploading can be done entirely via command line.