# How to Share a Flutter iOS App With Testers Without TestFlight

> Build a Flutter .ipa with flutter build ipa and get it onto testers’ iPhones over the air, without TestFlight and without rebuilding for each new device.

Last updated: 2026-11-05
Canonical: https://buildferry.app/share-flutter-ios-app

Flutter makes the build easy, but sharing an iOS build still follows Apple's rules: the .ipa has to be signed for each tester's iPhone.

## 1. Build the .ipa

Building an iOS app still needs macOS, on your Mac or in CI. From your project folder:

```
flutter build ipa --export-method ad-hoc
```

The .ipa is written to `build/ios/ipa/`. Set your team and bundle ID in Xcode first, under **Runner**, **Signing & Capabilities**.

If you build in CI, such as GitHub Actions or Codemagic, send the build straight to testers with one more command. It finds the .ipa in `build/ios/ipa/` by itself:

```
flutter build ipa --export-method ad-hoc
npx buildferry upload
```

Set `BUILDFERRY_TOKEN` to a token from **Upload from CI** in the dashboard. On GitHub Actions you can use [the BuildFerry action](https://buildferry.app/github-actions-ios-distribution) instead.

## 2. Share it

- **TestFlight:** upload with Xcode or Transporter and wait for processing and, for external testers, App Review.
- **A hosting link:** works only for iPhones already in your provisioning profile.
- **BuildFerry:** upload the .ipa and send one share link. Each tester's iPhone is registered after you approve it, and the build is re-signed for it in the cloud.

With BuildFerry, a new tester doesn't mean a new `flutter build`. Only a code change does.

## 3. Your tester installs

They open the link in Safari, allow a one-time profile, and tap Install once you approve.

## Flutter tips

- **Release mode only.** `flutter build ipa` builds in release mode. Debug builds only run when started from your Mac.
- **Bump the build number** with `--build-number` so testers can tell builds apart.
- **Extensions and push** keep working: BuildFerry signs app extensions with their own bundle IDs and profiles.
