Интеграция Firebase Crashlytics в мобильное приложение
Краш на холодном старте у 0.3% пользователей. В логах устройства — EXC_BAD_ACCESS без стека. Без Crashlytics это означает часы поиска: воспроизвести не выходит, устройство не то, версия iOS другая. Crashlytics собирает symbolicated стектрейс, версию OS, устройство, предыдущие действия пользователя и доставляет это в консоль в течение минут после краша.
Подключение SDK
iOS через Swift Package Manager: добавляем FirebaseCrashlytics из репозитория firebase-ios-sdk. Инициализация происходит автоматически при FirebaseApp.configure() в AppDelegate или через @main + FirebaseOptions.
Обязательный шаг, который часто пропускают: загрузка dSYM. Без символьных файлов Crashlytics показывает адреса памяти вместо имён функций. Для автоматической загрузки добавляем run script в Build Phases:
"${PODS_ROOT}/FirebaseCrashlytics/run"
# или через SPM:
"${BUILD_DIR%Build/*}SourcePackages/checkouts/firebase-ios-sdk/Crashlytics/run"
На Android SDK подключается через Gradle plugin: id 'com.google.firebase.crashlytics' в app/build.gradle. ProGuard/R8 mapping загружается автоматически при сборке release-варианта если настроен firebaseCrashlytics { mappingFileUploadEnabled = true }.
Кастомные ключи и логи
Автоматический краш-репорт — это базовый минимум. Реальная ценность — контекст вокруг краша:
// iOS
Crashlytics.crashlytics().setCustomValue(userID, forKey: "user_id")
Crashlytics.crashlytics().setCustomValue("checkout", forKey: "last_screen")
Crashlytics.crashlytics().log("CartViewModel: начало оформления заказа, items=\(cart.count)")
// Нефатальная ошибка — попадает в Crashlytics без краша приложения
Crashlytics.crashlytics().record(error: NetworkError.timeout)
// Android
Firebase.crashlytics.setCustomKey("user_id", userId)
Firebase.crashlytics.setCustomKey("last_screen", "checkout")
Firebase.crashlytics.log("CartViewModel: оформление заказа, items=${cart.size}")
Firebase.crashlytics.recordException(NetworkTimeoutException("checkout API"))
recordException / record(error:) — мощный инструмент для отслеживания ошибок, которые не роняют приложение, но влияют на UX: истёкший токен, пустой ответ API, сломанный deeplink.
ANR и non-fatal на Android
На Android Crashlytics автоматически перехватывает ANR (Application Not Responding) с версии SDK 18.3+. Если приложение зависает на >5 секунд — в консоли появится ANR-отчёт с состоянием thread dump. Это отдельная категория от крашей, часто связанная с блокировкой main thread синхронными операциями с диском или сетью.
Crashlytics + Alerts
В консоли Firebase настраиваем velocity alerts: если новая версия набирает crash-free rate ниже порога (обычно 99.5%) в течение часа после релиза — приходит email/Slack-уведомление. Позволяет поймать регрессию до того, как она накроет всю аудиторию.
Типичная ошибка при интеграции
dSYM не загружаются для bitcode-сборок (актуально для старых iOS-проектов). Apple перекомпилирует bitcode на своих серверах, и финальные символы отличаются от локальных. Решение: в Firebase Console → Project Settings → App → «Upload dSYMs» загружаем архив вручную, либо настраиваем fastlane с плагином firebase_app_distribution и upload_symbols_to_crashlytics.
Что входит в работу
- Подключение SDK (SPM / CocoaPods на iOS, Gradle на Android)
- Настройка автозагрузки dSYM / mapping файлов
- Кастомные ключи для контекста: user_id, экран, состояние сессии
-
recordExceptionдля нефатальных ошибок в ключевых потоках - Velocity alert в консоли
Сроки
Полная интеграция с кастомными ключами и нефатальными ошибками: 1 день. Стоимость рассчитывается индивидуально.







