Інтеграція Crashlytics для відстеження крашів мобільного додатка
Firebase Crashlytics — стандарт де факто для збору краш-репортів на iOS та Android. Головне переважество перед конкурентами: автоматична символізація стектрейсів без ручної загрузки dSYM на iOS та mapping-файлів на Android. Коли Xcode Cloud або Fastlane відають білд у Firebase App Distribution або TestFlight, Crashlytics сам підтягує символи через Run Script у Build Phases.
Підключення на iOS
Через Swift Package Manager додаємо firebase-ios-sdk, потім у AppDelegate:
import FirebaseCrashlytics
import FirebaseCore
@main
struct MyApp: App {
init() {
FirebaseApp.configure()
}
}
Це все, що потрібно для базового краш-репортингу — SDK перехоплює необроблені винятки та сигнали (SIGABRT, EXC_BAD_ACCESS) автоматично.
Критичний момент — dSYM upload. В Xcode переконайтесь, що Build Settings → DEBUG_INFORMATION_FORMAT = DWARF with dSYM File для Release. Без цього у панелі управління будуть адреси пам'яті замість імен функцій. Для CI додаємо в Fastfile:
upload_symbols_to_crashlytics(
dsym_path: "./build/MyApp.app.dSYM.zip",
gsp_path: "./GoogleService-Info.plist"
)
Підключення на Android
// build.gradle (app)
implementation("com.google.firebase:firebase-crashlytics:18.+")
implementation("com.google.firebase:firebase-crashlytics-ndk:18.+") // для C++ крашів
Плагін com.google.firebase.crashlytics у build.gradle автоматично загружає R8/ProGuard mapping-файл після кожної release-сборки. Без плагіна — завантажувати mapping вручну через Firebase CLI.
Користувацькі ключі та логи для діагностики
Голий стектрейс часто не пояснює, чому упало. Crashlytics дозволяє прикріплювати контекст:
// iOS
Crashlytics.crashlytics().setCustomValue(userId, forKey: "user_id")
Crashlytics.crashlytics().setCustomValue("checkout", forKey: "last_screen")
Crashlytics.crashlytics().log("CartViewModel: початок оплати")
// Android
Firebase.crashlytics.setCustomKey("user_id", userId)
Firebase.crashlytics.setCustomKey("last_screen", "checkout")
Firebase.crashlytics.log("CartViewModel: початок оплати")
Ці дані з'являються в табах Keys та Logs кожного краш-репорту. На практиці це скорочує час діагностики: одразу видно, що упало у анонімного користувача на екрані оплати, а не просто у URLSession.dataTask.
Non-fatal ошибки
Не всі проблеми — краші. Мережева помилка, неудачний парсинг JSON, timeout — все це варто логувати без завершення сесії:
Crashlytics.crashlytics().record(error: NetworkError.timeout)
У панелі управління non-fatal помилки попадають у окремий розділ Non-fatals. Зручно для мониторингу деградації API без зростання crash-free rate.
Crash-free rate та алерти
Firebase Console показує crash-free users — відсоток сесій без краху. Норма для production — вище 99,5%. Налаштовуємо email-алерт при падінні нижче порогу через Firebase Alerts, або підключаємо webhook у PagerDuty через Firebase Extensions.
Що входить до роботи
- Додавання залежностей (CocoaPods / SPM / Gradle)
- Налаштування dSYM upload для iOS через Fastlane або скрипт в Xcode
- Налаштування ProGuard/R8 mapping upload для Android
- Додавання користувацьких ключів для User ID, сесії, навігаційного шляху
- Логування non-fatal помилок у ключевих точках додатка
- Налаштування алертів в Firebase Console
Сроки
Базова інтеграція з dSYM/mapping upload: 0,5–1 день. Додавання користувацьких ключів та non-fatal у кодовій базі — ще 0,5–1 день залежно від розміру проекту. Вартість розраховується індивідуально.







