Интеграция Firebase App Distribution в мобильное приложение
Firebase App Distribution — это не альтернатива TestFlight, это дополнение к нему. TestFlight ограничен 90-дневным сроком сборки и требует ревью от Apple для каждого external тестера. App Distribution раздаёт .ipa и .apk тестерам напрямую, без магазина, за минуты. Для команд с ежедневными билдами — критически важно.
Что обычно идёт не так при интеграции
Самая частая ошибка — пропустить шаг с GoogleService-Info.plist или google-services.json. App Distribution — это Firebase-сервис, и SDK инициализируется через FirebaseApp.configure(). Если plist добавлен только в основной таргет и не включён в target membership тестового таргета — краш на старте при попытке проверить наличие обновлений.
Второй частый сценарий: iOS-приложение собирается через ad-hoc профиль для тестирования, но UDID тестера не добавлен в профиль — устройство просто не установит .ipa. App Distribution автоматически собирает UDID, но добавить их в provisioning profile — ответственность разработчика. Решается через fastlane match с автоматическим обновлением профилей.
Интеграция через Fastlane
Рабочая схема с fastlane:
lane :distribute_firebase do
# Сборка
build_ios_app(
scheme: "MyApp",
configuration: "Release",
export_method: "ad-hoc"
)
# Загрузка в Firebase App Distribution
firebase_app_distribution(
app: "1:123456789:ios:abcdef",
groups: "qa-team, beta-users",
release_notes: last_git_commit[:message],
firebase_cli_token: ENV["FIREBASE_TOKEN"]
)
end
firebase_cli_token — токен из firebase login:ci. Он хранится в CI/CD secret-переменных (GitHub Actions secrets, GitLab CI variables), не в репозитории.
groups — тестерские группы, созданные в Firebase Console. Группы позволяют дифференцировать доступ: QA-команда получает все билды, бета-пользователи — только стабильные.
Автоматическое уведомление тестеров об обновлениях
SDK App Distribution умеет показывать нативный alert при запуске, если доступна новая версия. Для iOS:
import FirebaseAppDistribution
// AppDelegate.application(_:didFinishLaunchingWithOptions:)
AppDistribution.appDistribution().checkForUpdate { release, error in
guard let release = release else { return }
// Показываем alert с release.displayVersion и release.releaseNotes
let alert = UIAlertController(
title: "Доступно обновление \(release.displayVersion)",
message: release.releaseNotes ?? "",
preferredStyle: .alert
)
alert.addAction(UIAlertAction(title: "Обновить", style: .default) { _ in
UIApplication.shared.open(release.downloadURL)
})
}
Важно: checkForUpdate работает только для тестеров, авторизованных в Firebase. В production-сборке этого кода быть не должно — #if DEBUG или отдельный флаг сборки.
Android: аналогичная схема
FirebaseAppDistribution.getInstance().updateIfNewReleaseAvailable()
.addOnProgressListener { updateProgress ->
// Обновляем прогресс-бар
}
.addOnFailureListener { e ->
if (e is FirebaseAppDistributionException) {
when (e.errorCode) {
FirebaseAppDistributionException.Status.NOT_IMPLEMENTED ->
// SDK не в тестовой среде — production build
}
}
}
Интеграция в CI/CD без Fastlane
Через Firebase CLI напрямую:
firebase appdistribution:distribute app-release.apk \
--app $FIREBASE_APP_ID \
--groups "qa-team" \
--release-notes "$(git log -1 --pretty=%B)" \
--token $FIREBASE_TOKEN
Шаг добавляется в GitHub Actions workflow после шага сборки. Время загрузки .ipa размером 50 МБ — около 90 секунд.
Сроки
Интеграция Firebase App Distribution в существующий CI/CD (iOS + Android): 2–4 дня. Настройка тестерских групп, автопроверки обновлений в приложении, интеграция с Fastlane: 1–1.5 недели. Стоимость рассчитывается индивидуально.







