When developing iOS projects on Windows, the most challenging step isn’t writing code, but uploading the IPA to the App Store.

Many resources assume the use of Xcode or Transporter, which rely on macOS.
If both development and release are done on Windows, the process needs to be separated:

  • IPA can be generated in any environment
  • Uploading is just an independent step

As long as the IPA meets requirements, uploading can be completed entirely on Windows.


Confirm the IPA is Ready for Upload

Before considering upload, ensure the IPA is a “release package.”

Check three key points:

1. Use a Distribution Certificate

When packaging, you must use:

  • A Distribution certificate

If using a Development certificate:

  • The IPA can be installed
  • But it cannot be uploaded to the App Store

2. Correct Provisioning Profile Type

The provisioning profile must be:

  • App Store type

You can check by unpacking the IPA:

unzip -p app.ipa Payload/*.app/embedded.mobileprovision

Confirm there are no device UDIDs.


3. Bundle ID Matches the Backend

Ensure:

  • The Bundle ID in the IPA
  • The Bundle ID in App Store Connect

Are exactly the same.


Prepare Upload Environment on Windows

Windows doesn’t have Xcode, but you can use the following tools:

  • AppUploader
  • iTMSTransporter (requires additional Java environment setup)
  • Fastlane (limited support on Windows)

In practice, using graphical or command-line tools directly is more stable.


Upload IPA Using AppUploader

On Windows, AppUploader (Happy Upload) can directly handle the upload.

Specific steps are as follows:


1. Open the Upload Interface

Launch AppUploader and go to the “Submit Upload” page.


2. Set Up App-Specific Password

Generate an app-specific password in your Apple ID.

Enter:

  • Apple ID
  • App-specific password

Note: Do not use your account login password here.
App-Specific Password

App-Specific Password


3. Select IPA File

Click to select the local .ipa file.


4. Choose Upload Channel

The tool offers multiple upload channels:

  • Channel 1 (old channel)
  • Channel 2 (new channel)

If the upload gets stuck, try switching channels.
Upload Page


5. Execute Upload

Click the upload button and wait for completion.

After successful upload, Apple will return processing results.
Upload Success


Confirm Status After Upload

Upload completion doesn’t mean immediate visibility.

Go to:

App Store Connect → My Apps → TestFlight

Apple will process it (Processing).

After processing:

  • The build version will appear
  • You can then submit for review

If Upload Succeeds but No Build Appears

If upload succeeds but no build appears, check:

Check Build Number

  • CFBundleVersion must be incremented

Check Signing Type

  • Whether an App Store provisioning profile is used

Check Bundle ID

  • Whether it matches the one in App Store Connect

Re-upload

Try submitting again using a different upload channel.


Upload Methods Integrated with Other Tools

In some teams, the upload process is integrated with build tools.

For example:

Fastlane + Windows

You can build the IPA on Mac, transfer it to Windows, and then upload using AppUploader.


CI Workflow

The process can be split into:

  1. Build IPA on Mac or cloud
  2. Upload to server
  3. Execute upload on Windows node

This reduces dependency on macOS.


Practical Workflow Example

When a team develops on Windows, they can do this:

  1. Build IPA using HBuilderX or CI
  2. Create certificates and provisioning profiles using AppUploader
  3. Download .p12 and .mobileprovision files
  4. Package to generate IPA
  5. Upload using AppUploader on Windows

Throughout this process:

  • No Xcode upload is needed
  • No macOS device is required

Reference link: https://www.appuploader.net/blog/231