Anyone who has published iOS apps knows the traditional process relies on a Mac and Xcode: creating certificates requires Keychain, archiving requires Xcode’s Archive, and uploading uses Transporter. However, if your team doesn’t have a Mac or Mac resources are tight, the entire release process can stall. In fact, when you break down each step, many can be replaced with cross-platform tools.
Overall Process
The complete iOS publishing process consists of several steps: register a developer account → create a Bundle ID → generate certificates and provisioning profiles → package IPA → upload to App Store Connect → fill in review information → submit for review. Not many steps require a Mac; most can be done with Windows tools.
Certificates and Provisioning Profiles
Without a Mac, certificate management is the most likely part to get stuck. Apple’s Keychain tool is only available on macOS, but Appuploader can directly create development and distribution certificates on Windows and generate P12 files. After filling in the name and password, it automatically completes the application and download.
Provisioning profiles can also be created in Appuploader. Choose the type (Development or App Store), bind the Bundle ID, and select a certificate. The Development type requires adding the UDID of test devices; the tool automatically reads it when connected, so there’s no need to manually copy the 40-character code.
iOS development also requires understanding account types. A personal account costs ¥688/year and allows publishing to the App Store, using push notifications and payment features. Company accounts are related to team collaboration, while enterprise accounts are for internal distribution but do not support store publication. Free accounts can only be used for development testing.
Packaging IPA
The packaging method for IPA depends on the project type. For native Swift/Objective-C projects, you can use KXApp (with its built-in compiler, no Xcode needed) or compile via a remote Mac. For uni-app projects, click “Publish → Native App-Cloud Packaging” directly in HBuilder X to generate the IPA.
Flutter projects on Windows can be compiled to iOS using KXApp, or you can add the –obfuscate parameter when packaging for obfuscation protection. When packaging, ensure you select the correct development certificate and provisioning profile, and the Bundle ID must match the app created in App Store Connect.
Uploading IPA
After the IPA is packaged, you can use Appuploader to upload to the App Store. On the upload screen, select the IPA file, choose an upload channel, enter your Apple ID and app-specific password, and click upload. If upload fails due to poor network, you can switch to another channel or retry with a mobile hotspot. Appuploader also offers a command-line version suitable for integration into CI/CD pipelines.
After uploading, wait a few minutes; the build will appear on the app’s page in App Store Connect. If it doesn’t appear, check whether the version number is duplicated. After uploading, you also need to go back to App Store Connect to fill in the app name, subtitle, keywords, description, privacy policy URL, etc., then select the build and submit for review.
Screenshots and Metadata
For screenshots, you can use Appuploader’s bulk upload feature. It supports uploading multiple sizes and language versions at once. You can also set pricing and sales territories, in-app purchases, etc., directly in App Store Connect.
Submission and Follow-up
After submission, the review result usually arrives within a few days. If it’s rejected, modify the app according to the rejection reason, re-upload the IPA, and submit again. Common rejection reasons include failure to disclose device information collection in the privacy policy, missing IDFA permission configuration, incorrect screenshot sizes, etc. After making changes, you can directly upload a new version with Appuploader without going through the entire Mac process.