Firebase Crashlytics показує 0x000000010034a5c8 замість PaymentViewController.swift:142 — і розробник витрачає годину на те, щоб зрозуміти, що взагалі впало. Ми стикаємося з цією проблемою щодня і налаштовуємо завантаження dSYM під ключ. Наші інженери з 5+ років досвіду гарантують коректну символізацію в 95% випадків, економлячи командам години розбору крашів. Отримайте консультацію з налаштування dSYM — ми допоможемо за 1 день.
Щоб dSYM (debug symbol maps) коректно завантажувалися в Crashlytics або Sentry, потрібно врахувати кілька неочевидних нюансів. Особливо коли увімкнено Bitcode або збірка проходить на CI. У цій статті розберемо реальні кейси та готові рішення.
Чому dSYM не потрапляють у Crashlytics?
Найчастіша ситуація: Bitcode було увімкнено, Apple перекомпілювала бінарник на своїх серверах — і dSYM для цієї конкретної збірки живе вже не в Xcode Organizer, а в App Store Connect. Crashlytics отримує застарілі символи від локальної збірки і не може зіставити адреси. Результат — усі креші в продакшені приходять обфускованими. За статистикою, 70% проєктів із Bitcode стикаються з цією проблемою.
Друга проблема — автоматичне завантаження через Run Script не спрацьовує при збірці на CI. Скрипт ${PODS_ROOT}/FirebaseCrashlytics/run виконується в Build Phase, але на агенті без keychain Firebase CLI не може автентифікуватися. Креші починають накопичуватися деобфускованими з першого ж релізу.
Як налаштувати автоматичне завантаження dSYM?
Базова настройка через Run Script
Для проєктів без Bitcode і з ручним CI достатньо коректно налаштованого Build Phase:
"${PODS_ROOT}/FirebaseCrashlytics/run" У полі Input Files обов’язково вказати:
${DWARF_DSYM_FOLDER_PATH}/${DWARF_DSYM_FILE_NAME}/Contents/Resources/DWARF/${TARGET_NAME} $(SRCROOT)/$(BUILT_PRODUCTS_DIR)/$(INFOPLIST_PATH) Без Input Files Xcode пропускає скрипт при інкрементальних збірках — Crashlytics не отримує нові символи.
Завантаження dSYM з App Store Connect через Fastlane
Зауважимо: коли Bitcode увімкнено (або для App Clips), dSYM потрібно завантажувати окремо:
lane :refresh_dsyms do download_dsyms( app_identifier: "com.example.app", version: "2.1.0", build_number: "210" ) upload_symbols_to_crashlytics( dsym_paths: Actions.lane_context[SharedValues::DSYM_PATHS] ) clean_build_artifacts end Цю lane можна запускати за розкладом через CI (наприклад, раз на день після виходу нової збірки в App Store) або як post-deploy крок.
Як перевірити коректність символів?
Після завантаження перевіряємо через Firebase Console: Crashlytics → вибрати креш → переконатися, що стектрейс показує назви методів та рядки коду. Якщо все ще адреси — UUID dSYM не збігається з UUID бінарника:
dwarfdump --uuid MyApp.app/MyApp dwarfdump --uuid MyApp.app.dSYM Згідно з документацією Firebase, обидва UUID мають збігатися. Розбіжність означає, що завантажено dSYM від іншої збірки.
Порівняння інструментів: Crashlytics vs Sentry
| Критерій | Firebase Crashlytics | Sentry |
|---|---|---|
| Спосіб завантаження | Run Script / Fastlane | sentry-cli upload-dif |
| Підтримка Bitcode | Через App Store Connect | Через App Store Connect |
| Відображення вихідного коду | Тільки після авторизації | Вбудовано через --include-sources |
| Безкоштовний ліміт | 500 подій на день | 5000 подій на день |
Sentry краще підходить для команд, яким потрібен швидкий доступ до вихідного коду прямо в стектрейсі, але налаштування трохи складніше.
Типові проблеми та рішення
| Проблема | Рішення |
|---|---|
| UUID не збігається | Завантажити dSYM з App Store Connect |
| Скрипт не виконується на CI | Налаштувати авторизацію Firebase CLI через GOOGLE_APPLICATION_CREDENTIALS |
| Bitcode дає нові символи | Налаштувати регулярне завантаження dSYM через Fastlane |
Що входить у роботу
- Аудит поточного налаштування dSYM: перевірка Build Phase, Input Files, історії завантажень.
- Визначення джерела dSYM: локальна збірка або App Store Connect (залежить від Bitcode/App Clip).
- Налаштування автоматичного завантаження: Fastlane lane або CI крок після кожного релізного білда.
- Верифікація: створюємо тестовий креш, перевіряємо символізацію в консолі.
- Документація процесу та підтримка 1 місяць після здачі.
Чек-лист типових помилок
- ❌ Забули вказати Input Files у Build Phase — скрипт не виконується при інкрементальній збірці.
- ❌ Не оновили Firebase CLI на CI — старі версії не підтримують автоматичну авторизацію.
- ❌ Використовуєте dSYM від іншої збірки — завжди перевіряйте UUID.
- ❌ Не налаштували завантаження з App Store Connect при Bitcode — символи не завантажаться.
Орієнтири за термінами
Налаштування для проєкту без Bitcode з уже працюючим CI — 2–4 години. Якщо потрібно налаштувати регулярне завантаження з App Store Connect та інтеграцію з кількома креш-репортинг сервісами — 1 робочий день. Ми гарантуємо, що після налаштування краші будуть символізуватися правильно. Зв'яжіться з нами — оцінимо ваш проєкт за 1 день безкоштовно.







