{"slug":"ios-builds","title":"iOS builds","summary":"Build a signed IPA without a Mac and send it to TestFlight. You need an Apple Developer account, a distribution certificate, and this app's provisioning profile.","body":"Click **Build** in the project bar and choose **iOS**. The output is an IPA signed for App Store distribution, which is what TestFlight and the App Store accept.\n\n## Before the first iOS build\n\n| You need | Belongs to | Where you add it |\n| --- | --- | --- |\n| Apple Developer Program membership | Your Apple team | developer.apple.com |\n| App Store Connect API key | The organization | **Publish**, Readiness, Connected accounts |\n| Distribution certificate (.p12 + password) | The organization, shared by all its apps | **Publish**, when connecting the Apple account |\n| Bundle ID registered with Apple | This app | **Publish**, Readiness, **Fix automatically** |\n| Provisioning profile (.mobileprovision) | This app only | **Build**, iOS, **Created for this app** |\n\nThe Build panel shows the state of each part: **Shared by the organization** for the account and certificate, and **Created for this app** for the bundle ID and profile. Step-by-step instructions are in [iOS certificates and profiles](/docs/ios-signing).\n\n## Step by step\n\n1. Connect the Apple account and upload the distribution certificate. See [Connect store accounts](/docs/connect-store-accounts).\n2. In Publish, Readiness, click **Fix automatically** on **Bundle ID** to register this app's bundle ID with Apple.\n3. Create an App Store provisioning profile for that bundle ID in the Apple Developer site and upload it in Build.\n4. Start the iOS build and wait for **Ready**.\n5. Click **Send to TestFlight**, or download the IPA.\n\n## Send to TestFlight\n\nThe upload goes to App Store Connect. If the app does not exist there yet, FluxNative creates the app record with the app name, the bundle ID, and English as the primary language.\n\nApple then processes the build, which usually takes several minutes and sometimes longer. FluxNative checks for about a minute. After that, use **Check TestFlight status** in **Publish**, **Releases**. See [Release to TestFlight](/docs/testflight).\n\n## Versions\n\nThe marketing version comes from the project. FluxNative assigns the iOS build number for each build and never reuses it. See [Versions and build numbers](/docs/versions-and-build-numbers).\n\n## If it fails\n\nThe reason stays on the build. **Fix with AI** sends the redacted Xcode log to the assistant so it can repair the project, then **Retry build** runs it again. Signing problems (a missing or expired certificate, or a profile for a different bundle ID) are fixed in Publish and Build, not in code. See [Fix a failed build](/docs/build-failures).","sectionSlug":"native-builds","sectionTitle":"Build for devices","updatedAt":"2026-09-23T22:51:25.250Z","previous":{"slug":"android-signing","title":"Android signing keys"},"next":{"slug":"ios-signing","title":"iOS certificates and profiles"}}