# How to Export an IPA From Xcode for Testers

> Archive your app and export an .ipa for testers with Xcode’s Release Testing option, or from the command line with xcodebuild and an ExportOptions.plist.

Last updated: 2026-11-05
Canonical: https://buildferry.app/export-ipa-from-xcode

An .ipa is the file iOS installs. You get one by archiving your app and exporting it with a distribution method.

## In Xcode

1. Choose **Any iOS Device** as the run destination.
2. Choose **Product**, then **Archive**. The Organizer opens when it's done.
3. Select the archive and click **Distribute App**.
4. Choose **Release Testing** for ad hoc testers. Older Xcode versions call it **Ad Hoc**.
5. Keep automatic signing, click **Next**, then **Export**.
6. The folder you choose contains your .ipa.

## From the command line

Save this as ExportOptions.plist, with your own team ID:

```
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
  <key>method</key>
  <string>release-testing</string>
  <key>signingStyle</key>
  <string>automatic</string>
  <key>teamID</key>
  <string>ABCDE12345</string>
</dict>
</plist>
```

Then archive and export:

```
xcodebuild archive -scheme MyApp -archivePath build/MyApp.xcarchive -destination 'generic/platform=iOS'
xcodebuild -exportArchive -archivePath build/MyApp.xcarchive -exportPath build -exportOptionsPlist ExportOptions.plist
```

On Xcode versions before 15.3, use `ad-hoc` as the method.

## Which devices are in the build?

An ad hoc export only installs on the devices in its provisioning profile. Each new tester normally means registering their iPhone and exporting again.

With [BuildFerry](https://buildferry.app/) you export once. Upload the .ipa and BuildFerry re-signs it for every iPhone you approve, so the devices in your own profile don't matter.

## Send it from the terminal

Right after exporting, upload from the same folder with a token from **Upload from CI** in the dashboard:

```
export BUILDFERRY_TOKEN=bf_your_token
npx buildferry upload
```

It finds the newest .ipa, uploads it and prints the share link. In CI, use the [GitHub Action](https://buildferry.app/github-actions-ios-distribution) or [a fastlane lane](https://buildferry.app/fastlane-ad-hoc-distribution) instead.
