Ad-Hoc distribution vs TestFlight in React Native - a practical comparison
If you're testing an iOS build with real devices, you've got two main paths: Apple's TestFlight, or Expo's EAS Preview using Ad-Hoc provisioning. They solve the same problem - getting a build onto a real iPhone without the App Store - but the workflows are genuinely different, not just cosmetically.
How Each One Works
TestFlight uses Apple's official infrastructure. You upload your build to App Store Connect (often via npx testflight to speed this up), Apple processes/reviews it, and testers install the TestFlight app and accept an email or public link invite. No UDID collection needed - Apple handles device registration behind the scenes.
Expo EAS Preview (Ad-Hoc) uses Ad-Hoc provisioning. You register each tester's device UDID against your Apple Developer account before building - either manually (eas device:create, eas device:list) or by having the tester scan a QR code that installs a temporary profile. Once devices are tied to your provisioning profile, you build with:
eas build --platform ios --profile preview
This generates a direct install link/QR code - no App Store account or TestFlight app required.
Comparison
| Feature | Expo Preview / Ad-Hoc | Apple TestFlight |
|---|---|---|
| Device limit | ~100 devices/device class/year (Apple Developer account tier) | Up to 10,000 external testers |
| Processing time | Immediate after cloud build finishes | Apple review/processing (mins to hours) |
| UDID management | Manual or profile-based registration required | Not required, handled by Apple |
| Best for | Fast internal testing, client demos, strict ad-hoc distribution | Larger-scale beta testing, staging before production |
Which One Should You Use?
- Fast internal iteration, client demos, small teams โ Ad-Hoc. No waiting on Apple, instant install links.
- Wider beta testing before a production release โ TestFlight. Built-in scale, no manual device management.
Most teams I've worked with end up using both at different stages: Ad-Hoc during active development for quick feedback loops, TestFlight once the build is stable enough for a broader external beta. Curious what others are using - drop your setup in the comments.
Comments
No comments yet. Start the discussion.