Teams that develop with React Native mostly use Mac for iOS compilation and release. But there is a scenario that is becoming increasingly common: CI/CD pipelines run on Linux servers, or frontend developers in the team use Linux as their primary system. React Native projects can write code, run Metro dev server, and even build Android APKs on Linux, but the iOS step gets stuck—the IPA file is already compiled on a remote Mac. How can you upload it to the App Store from Linux without tying the upload step to a Mac environment?

iOS Build Workflow for React Native

The iOS build of a React Native project depends on the Xcode environment. The usual approach is to run npx react-native run-ios on a Mac or use Fastlane to archive. If a team has only one Mac as the build machine, RN developers can write React code locally, and after submission, CI pulls the code and builds/uploads it on the Mac.

For Linux developers, if you don’t want to tie the upload step to Mac as well, you can decouple the IPA upload process—let compilation be handled by a Mac or a cloud build service, and use a cross-platform tool on Linux to perform the upload.

Upload Solution using Appuploader on Linux

Appuploader provides desktop and command-line versions, both of which support Linux. The desktop version can run on Linux via Wine or directly if a native Linux version is provided, while the command-line version can be directly integrated into Bash scripts.

In the Appuploader desktop version, you select the IPA file, upload channel, and Apple account-specific password on the submission screen, then click upload. It provides multiple upload channels; you can switch when the network is poor. After a successful upload, the build appears in App Store Connect; you can select the build and submit it for review.

The command-line version is more suitable for integrating into the CI/CD pipeline of a React Native project. The command format is: appuploader_cli --upload-app -f Payload.ipa -u user@example.com -p xxxx-xxxx-xxxx-xxxx --type ios. You only need to specify the IPA file path, Apple account, and app-specific password; no GUI is required.

A recommended complete workflow on Linux CI is: compile the IPA on a Mac runner via GitHub Actions or GitLab CI → transfer the IPA artifact to a Linux runner → invoke Appuploader CLI on the Linux runner to upload the IPA. This decouples the build and upload steps in the CI pipeline—building depends on a Mac as a hard constraint, but uploading does not need to be tied to a Mac environment. Linux runners are typically much cheaper than Mac runners, so moving the upload step to Linux can also save some CI costs.

Preparation Before Upload

Regardless of the method, several things must be confirmed before uploading the IPA. The IPA must be signed with a distribution certificate; an IPA signed with a development certificate cannot be submitted for release. The Apple developer account needs two-factor authentication enabled, and an app-specific password must be generated (create it under “Security” → “App-Specific Passwords” in your Apple ID page). The upload-specific password is different from your login password; make sure to record it at least once. The Bundle ID must exactly match the app created in App Store Connect; if not, you will get a “No suitable application records were found” error.

Post-Upload Operations

After the upload is complete, go back to App Store Connect, select the build, and fill in the review information. If the build does not appear immediately, wait a few minutes and refresh. If it still does not appear, check whether the version number is duplicated or whether the network upload channel is functioning properly.