You can distribute builds to testers using the Firebase CLI. The CLI
tool lets you specify testers and release notes for a build, and distributes the
build accordingly.

## Before you begin

1. If you haven't already, [add Firebase to your Apple
   project](https://firebase.google.com/docs/ios/setup).

   If you aren't using any other Firebase products, you only have to create a
   project and register your app. However, if you decide to use additional
   products in the future, be sure to complete all of the steps on the page
   linked above.
2. Open the [App Distribution page](https://console.firebase.google.com/project/_/appdistribution) of the
   Firebase console. Select your Firebase project when prompted, select
   your app using the app switcher, and click **Get started**.

## Step 1. Distribute your app to testers

To distribute your app to testers, upload the IPA file using the
Firebase CLI:

1. Install or update to the latest version of the [Firebase CLI](https://firebase.google.com/docs/cli.md.txt#install_the_firebase_cli) (we recommend downloading the standalone binary for the CLI specific to your OS). Make sure to [sign in](https://firebase.google.com/docs/cli.md.txt#sign-in-test-cli) and test that you can access your projects.

   > [!NOTE]
   > **Note:** If you're using the Firebase CLI in a CI environment, you can also authenticate with a [service account](https://firebase.google.com/docs/app-distribution/authenticate-service-account.md.txt) or by using [`login:ci`.](https://firebase.google.com/docs/cli.md.txt#cli-ci-systems)

2. Run the `appdistribution:distribute` command to upload your app and
   distribute it to testers. Use the following parameters to configure the
   distribution:

   | appdistribution:distribute options ||
   |---|---|
   | `--app` | **Required** : Your app's Firebase App ID. You can find the App ID in the Firebase console, on the [General Settings page](https://console.firebase.google.com/project/_/settings/general/). ``` --app 1:1234567890:ios:0a1b2c3d4e5f67890 ``` |
   | `--token` | A refresh token that's printed when you authenticate your CI environment with the Firebase CLI (read [Use the CLI with CI systems](https://firebase.google.com/docs/cli.md.txt#cli-ci-systems) for more information). ``` --token "$FIREBASE_TOKEN" ``` |
   | `--release-notes` `--release-notes-file` | Release notes for this build. You can either specify the release notes directly: ``` --release-notes "Text of release notes" ``` Or, specify the path to a plain text file: ``` --release-notes-file "/path/to/release-notes.txt" ``` |
   | `--testers` `--testers-file` | The email addresses of the testers you want to invite. You can specify the testers as a comma-separated list of email addresses: ``` --testers "ali@example.com, bri@example.com, cal@example.com" ``` Or, you can specify the path to a plain text file containing a comma-separated list of email addresses: ``` --testers-file "/path/to/testers.txt" ``` |
   | `--groups` `--groups-file` | The tester groups you want to invite (refer to [Manage testers](https://firebase.google.com/docs/app-distribution/manage-testers)). Groups are specified using group aliases, which you can look up in the Firebase console. You can specify the groups as a comma-separated list: ``` --groups "qa-team, trusted-testers" ``` Or, you can specify the path to a plain text file containing a comma-separated list of group names: ``` --groups-file "/path/to/groups.txt" ``` |
   | `--debug` | A flag you can include to print verbose log output. |
   | `--test-devices` `--test-devices-file` | The test devices you want to run [App Testing agent](https://firebase.google.com/docs/app-distribution/app-testing-agent) tests on. You can specify the test devices as a semicolon-separated list of device specifications: ``` --test-devices: "model=shiba,version=34,locale=en,orientation=portrait" ``` Or, you can specify the path to a plain text file containing a semicolon-separated list of test devices: ``` --test-devices-file: "/path/to/test-devices.txt" ``` |
   | `--test-username` | The username for automatic login to be used during [App Testing agent](https://firebase.google.com/docs/app-distribution/app-testing-agent) tests. |
   | `--test-password` `--test-password-file` | The password for automatic login to be used during [App Testing agent](https://firebase.google.com/docs/app-distribution/app-testing-agent) tests. Or, you can specify the path to a plain text file containing a password: ``` --test-password-file: "/path/to/test-password.txt" ``` |
   | `--test-username-resource` | Resource name for the username field for automatic login to be used during [App Testing agent](https://firebase.google.com/docs/app-distribution/app-testing-agent) tests. |
   | `--test-password-resource` | Resource name for the password field for automatic login to be used during [App Testing agent](https://firebase.google.com/docs/app-distribution/app-testing-agent) tests. |
   | `--test-non-blocking` | If set when running [App Testing agent](https://firebase.google.com/docs/app-distribution/app-testing-agent) tests, the command will start the tests and then return immediately instead of waiting for them to complete. To see the test results, visit the Firebase console. If this flag is not set, the command will block until the tests are complete, and exit with a failure code if any of the tests fail. |
   | `--results-bucket` | A custom Google Cloud Storage (GCS) bucket where test results are stored. If left blank, the default bucket is used. The bucket must be owned by a billing-enabled project, and specifying a bucket results in billing charges for the storage used. |

   For example:

   ```
   firebase appdistribution:distribute test.ipa  \
       --app 1:1234567890:ios:0a1b2c3d4e5f67890  \
       --release-notes "Bug fixes and improvements" --testers-file testers.txt
   ```

   The Firebase CLI outputs the following links after the release upload.
   These links help you manage binaries and ensure that testers and other
   developers have the right release:
   - `firebase_console_uri` - A link to the Firebase console displaying a single release. You can share this link with other developers in your org.
   - `testing_uri` - A link to the release in the tester experience (iOS web clip) that lets testers view release notes and install the app onto their device. The tester needs access to the release in order to use the link.
   - `binary_download_uri` - A signed link that directly downloads and installs the app binary (IPA file) . The link expires after one hour.

   <br />

   ### Manage testers and groups

   In addition to distributing releases, you can also use
   `appdistribution:testers:add` and
   `appdistribution:testers:remove` to invite new testers or remove
   existing testers from your Firebase project.

   Once a tester has been added
   to your Firebase project, you can add them to individual releases.
   Once you remove a tester, they will no longer have access to
   releases in your project. Note that testers who are recently removed can
   still retain access to your releases for a window of time.

   For example:

       firebase appdistribution:testers:add anothertester@email.com moretesters@email.com

       firebase appdistribution:testers:remove anothertester@email.com moretesters@email.com

   Tester emails must be separated by a space. You can also specify testers
   using `--file /path/to/testers.txt`.

   If you have a large number of testers you should consider using groups:
   You can use `appdistribution:group:create` and
   `appdistribution:group:delete` to create or delete groups in your Firebase
   project.

   Use `--group-alias` to specify a group for the
   `appdistribution:testers:add` and
   `appdistribution:testers:remove` commands.

   For example:

       firebase appdistribution:group:create "QA team" qa-team

       firebase appdistribution:testers:add --group-alias=qa-team anothertester@email.com moretesters@email.com

       firebase appdistribution:testers:remove --group-alias=qa-team anothertester@email.com moretesters@email.com

       firebase appdistribution:group:delete qa-team

Once you distribute your build, it becomes available in the
App Distribution dashboard of the Firebase console for 150 days (five months).
When the build is 30 days from expiring, an expiration notice appears in both
the console and your tester's list of builds on their test device.

Testers who haven't been invited to test the app receive email invitations to
get started, and existing testers receive email notifications that a new build
is ready to test. To learn how to install the test
app, see [Get set up as a tester](https://firebase.google.com/docs/app-distribution/get-set-up-as-a-tester.md.txt?platform=ios).
You can monitor the status of each tester-whether they accepted the
invitation and whether they downloaded the app-in the Firebase console.

Testers have 30 days to accept an invitation to test the app before it expires.
When an invitation is 5 days from expiring, an expiration notice appears in the
Firebase console next to the tester on a release. An invitation can be
renewed by resending it using the drop-down menu on the tester row.

## Next steps

- To register more devices manually or programmatically, see
  [Register additional iOS devices](https://firebase.google.com/docs/app-distribution/register-additional-devices.md.txt).

- Learn best practices for [distributing Apple apps to QA testers using CI/CD and fastlane](https://firebase.google.com/docs/app-distribution/best-practices-distributing-apple-apps-to-qa-testers-with-ci-cd-fastlane.md.txt).