Join us for Firebase Summit on November 10, 2021. Tune in to learn how Firebase can help you accelerate app development, release with confidence, and scale with ease. Register

Обновление до Firebase Crashlytics SDK

Теперь вы можете настроить Crashlytics в своем приложении с помощью нового официального Firebase Crashlytics SDK, который предлагает улучшенные API, которые более совместимы с другими продуктами Firebase и более интуитивно понятны в использовании.

В этом руководстве описывается, как перейти на новый SDK из устаревшего SDK Fabric. В нем описаны изменения, которые происходят с новыми API-интерфейсами, причины изменений и способы обновления кода, если это необходимо.

Прежде чем вы начнете

Шаг 1: Добавление файла конфигурации Firebase

  1. Откройте Настройки проекта . В ваших приложениях карты, выберите расслоение идентификатор приложения , для которого требуется конфигурационный файл.

  2. Нажмите кнопку Загрузить GoogleService-info.plist , чтобы получить ваш конфигурационный файл Firebase IOS ( GoogleService-Info.plist ).

    • Вы можете загрузить конфигурационный файл Firebase IOS снова в любое время.

    • Убедитесь , что конфигурация файл не добавляются с дополнительными символами, например , (2) .

  3. Переместите файл конфигурации в корень вашего проекта Xcode. При появлении запроса выберите добавление файла конфигурации ко всем целевым объектам.

Если у вас есть несколько идентификаторов в пачке вашего проекта, вы должны связать каждый пучок ID с зарегистрированным приложением в консоли Firebase так , что каждое приложение может иметь свой собственный GoogleService-Info.plist файл.

Шаг 2: Добавьте Firebase Crashlytics SDK

  1. В Cocoapods, замените Fabric и Crashlytics стручки с Firebase/Crashlytics стручка во всех целей.

    # Add the pod for Firebase Crashlytics
    pod 'Firebase/Crashlytics'
    # Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'
  2. Непосредственно деинсталлируйте или удалите сторонние зависимости от Fabric, например зависимости от Fabric Answers и сторонних комплектов.

  3. Установка и обновление стручки, затем откройте .xcworkspace файл , чтобы увидеть проект в Xcode:

    pod install
    open YOUR_PROJECT.xcworkspace

Шаг 3: Обновите код

  1. В Xcode перестройте приложение, затем снова откройте файл .xcworkspace.

  2. Просмотрите следующие изменения SDK и внесите соответствующие обновления в свой код:


Crashlytics теперь меняет идентификаторы на основе идентификаторов установки Firebase.

Crashlytics использует UUID установки Crashlytics для идентификации экземпляров вашего приложения и связывания данных ваших пользователей с их устройствами. Ранее Crashlytics меняла UUID установки вашего пользователя при изменении рекламного идентификатора его устройства. Теперь Crashlytics меняет UUID установки на основе идентификатора установки Firebase (FID) пользователя. Для получения дополнительной информации посетите Управление идентификаторов установки Firebase .

Причина изменения

Использование FID совместимо с другими SDK Firebase.


Скрипты run и upload-symbols теперь находятся в FirebaseCrashlytics.

Теперь вы можете получить доступ к run и upload-symbols сценариев из новой FirebaseCrashlytics библиотеки. Обратите внимание , что вы все еще можете назвать upload-symbols из любого места в процессе сборки вручную загрузить dSYMs.

Кроме того, ткань в API_KEY и BUILD_SECRET , больше не включены в новый SDK. Вместо этого Crashlytics теперь использует свое приложение GoogleService-info.plist связать приложение с вашим проектом Firebase и сохранить свои исторические данные о сбоях.

SDK для ткани

${PODS_ROOT}/Fabric/run API_KEY BUILD_SECRET
/path/to/pods/directory/Fabric/upload-symbols

SDK Firebase Crashlytics

${PODS_ROOT}/FirebaseCrashlytics/run
/path/to/pods/directory/FirebaseCrashlytics/upload-symbols

Причина изменения

Crashlytics больше не использует Fabric SDK в качестве зависимости, поэтому мы перемещаем наши инструменты интерфейса командной строки в новую библиотеку.


Библиотека Crashlytics теперь называется FirebaseCrashlytics.

В своем приложении обновите пути импорта:

SDK для ткани

Быстрый

import Crashlytics

Цель-C

@import Crashlytics

SDK Firebase Crashlytics

Быстрый

import FirebaseCrashlytics

Цель-C

@import FirebaseCrashlytics

Причина изменения

Обновление имени Crashlytics библиотеки делает его в соответствие с другими библиотеками Firebase (например, FirebaseFirestore и FirebaseAuth ).


FirebaseCrashlytics больше не работает с Fabric SDK.

Теперь FirebaseCrashlytics можно инициализировать только с Firebase Crashlytics SDK. Вы можете запустить экземпляр FirebaseCrashlytics по телефону FirebaseApp.configure в Swift или [FIRApp configure] в Objective-C.

В вашей application:didFinishLaunchingWithOptions заменить вызовы на Fabric.with и startWithAPIKey с вызовом FirebaseApp :

SDK для ткани

Быстрый

Fabric.with([Crashlytics.self])

Цель-C

[Fabric with:@[[Crashlytics class]]];
+ startWithAPIKey:
+ startWithAPIKey:delegate:

SDK Firebase Crashlytics

Быстрый

FirebaseApp.configure()

Цель-C

[FIRApp configure];

Причина изменения

Использование новых методов для инициализации Crashlytics больше соответствует тому, как инициализируются другие службы Firebase.


Методы crash и throwException удалены.

Нет Нового SDK больше не включает crash или throwException методы. Вместо этого используйте fatalError в Swift или пустой массив в Objective-C , чтобы заставить аварии.

SDK Firebase Crashlytics

Быстрый

// Force a test crash
fatalError()

Цель-C

// Force a test crash
@[][1];

Причина изменения

Различные виды сбоев могут возникать по разным причинам, и эти методы четко не указали, произошли ли эти сбои во время выполнения или в собственном SDK вашего приложения.


Метод sharedInstance теперь называется crashlytics.

Не новый SDK больше не включает в себя sharedInstance метод. Для инициализации Crashlytics, используйте crashlytics вместо (прочитать справочную документацию для Swift или Objective-C для получения дополнительной информации). В делегате приложения обновите сценарий инициализации:

SDK для ткани

Быстрый

Crashlytics.sharedInstance()

Цель-C

[Crashlytics sharedInstance];

SDK Firebase Crashlytics

Быстрый

Crashlytics.crashlytics()

Цель-C

[FIRCrashlytics crashlytics];

Причина изменения

Мы назвали переименованный метод получения экземпляра, чтобы он соответствовал другим SDK Firebase.


setUserIdentifier теперь setUserID. setUserName и setUserEmail удаляются.

Ранее можно было установить имя или адрес электронной почты , связанный с грохотом использованием setUserName и setUserEmail , но эти методы больше не будут определены. Новый предпочтительный метод идентификаторов набора для пользователей , чтобы использовать setUserID .

SDK для ткани

Быстрый

Crashlytics.sharedInstance().setUserIdentifier("user_id")

Crashlytics.sharedInstance().setUserEmail("user_email")

Crashlytics.sharedInstance().setUserName("user_name")

Цель-C

[[Crashlytics sharedInstance] setUserIdentifier:@"user_id"];

[[Crashlytics sharedInstance] setUserEmail:@"user_email"];

[[Crashlytics sharedInstance] setUserName:@"user_name"];

SDK Firebase Crashlytics

Быстрый

Crashlytics.crashlytics().setUserID("user_id")

Цель-C

[[FIRCrashlytics crashlytics] setUserID:@"user_id"];

Причина изменения

Мы приняли имя метода setUserID , чтобы соответствовать другим Firebase API , и снятом setUserName и setUserEmail препятствовать регистрации PII через Crashlytics.


CLSLogv и CLSNSLogv заменены функциями ведения журнала.

Нет Новый SDK больше не включает в себя CLSLogv или CLSNSLogv функции. Для добавления пользовательских сообщений журнала , использовать новые методы ведения журналов в Crashlytics библиотеке. Обратите внимание , что новые методы больше не печатать на stdout или NSLog (мы рекомендуем писать обертку , если вы хотите сохранить это поведение).

SDK для ткани

Быстрый

CLSLogv("%@, %@", getVaList([first_arg, second_arg]))

CLSNSLogv("%@, %@", getVaList([first_arg, second_arg]))

Цель-C

CLSLog(@"%@, %@", first_arg, second_arg);
CLSNSLog(@"%@, %@", first_arg, second_arg);

CLSLogv(@"%@, %@", args_va_list);
CLSNSLogv(@"%@, %@", args_va_list);

CLS_LOG(@"%@, %@", first_arg, second_arg);

SDK Firebase Crashlytics

Быстрый

Crashlytics.crashlytics().log("\(first_arg), \(second_arg)")

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList([first_arg, second_arg]))

Цель-C

[[FIRCrashlytics crashlytics] log:@"first_arg, second_arg"];

[[FIRCrashlytics crashlytics] logWithFormat:@"%@, %@", first_arg, second_arg];

Если вы использовали CLS_LOG , добавьте следующую строку в файл заголовок , чтобы продолжать получать имена файлов и номера строк в операторах журнала:

#define CLS_LOG(__FORMAT__, ...) [[FIRCrashlytics crashlytics] logWithFormat:@"%s line %d $ " __FORMAT__, __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__]

Причина изменения

Для новых методов требуются экземпляры, что упрощает тестирование кода.


setCustomValue заменяет setObjectValue, setIntValue, setFloatValue и setBoolValue.

Пользовательские методы установки больше не включены в новый SDK. Раньше вы могли бы использовать методы для набора пар ключ / значение , чтобы отправить вместе с аварии отчета. Теперь вы можете использовать setCustomValue:forKey для набора пар ключ / значение для всех типов данных.

SDK для ткани

Быстрый

Crashlytics.sharedInstance().setObjectValue("value", forKey: "object_key")

Crashlytics.sharedInstance().setIntValue(100, forKey: "int_key")

Crashlytics.sharedInstance().setFloatValue(99.9, forKey: "float_key")

Crashlytics.sharedInstance().setBoolValue(true, forKey: "bool_key")

Цель-C

[[Crashlytics sharedInstance] setObjectValue:@"key" forKey:@"object_key"];

[[Crashlytics sharedInstance] setIntValue:100 forKey:@"int_key"];

[[Crashlytics sharedInstance] setFloatValue:99.9 forKey:@"float_key"];

[[Crashlytics sharedInstance] setBoolValue:YES forKey:@"bool_key"];

SDK Firebase Crashlytics

Быстрый

Crashlytics.crashlytics().setCustomValue("value", forKey: "object_key")

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

Crashlytics.crashlytics().setCustomValue(99.9, forKey: "float_key")

Crashlytics.crashlytics().setCustomValue(true, forKey: "bool_key")

Цель-C

[[FIRCrashlytics crashlytics] setCustomValue:@"value" forKey:@"object_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@(99.9) forKey:@"float_key"];

[[FIRCrashlytics crashlytics] setCustomValue:@YES forKey:@"bool_key"];

Причина изменения

Новое имя метода является уникальным для Crashlytics и дает понять, что Crashlytics не соответствует параметрам "ключ-значение".


recordCustomExceptionName: reason: frameArray: заменяется API модели исключений.

Если ваше приложение работает в неродной среде (например, JavaScript или Unity), вы можете использовать API модели исключений для сообщения метаданных о сбоях в собственном формате исключений вашего приложения.

SDK для ткани

Быстрый

let topFrame = CLSStackFrame () topFrame.symbol = "doSomethingBad" topFrame.fileName = "bad.cc" topFrame.lineNumber = 23

let middleFrame = CLSStackFrame()
middleFrame.symbol = "doOtherStuff"
middleFrame.fileName = "stuff.cc"
middleFrame.lineNumber = 23;

let bottomFrame = CLSStackFrame()
bottomFrame.symbol = "main"
bottomFrame.fileName = "main.cc"
bottomFrame.lineNumber = 123

Crashlytics.sharedInstance().recordCustomExceptionName("FooException",
                                                       reason: "There was a foo.",
                                                       frameArray: [topFrame, middleFrame, bottomFrame])

Цель-C

CLSStackFrame *topFrame = [[CLSStackFrame alloc] init];
topFrame.symbol = @"doSomethingBad";
topFrame.fileName = @"bad.cc";
topFrame.lineNumber = 23;

CLSStackFrame *middleFrame = [[CLSStackFrame alloc] init];
middleFrame.symbol = @"doOtherStuff";
middleFrame.fileName = @"stuff.cc";
middleFrame.lineNumber = 23;

CLSStackFrame *bottomFrame = [[CLSStackFrame alloc] init];
bottomFrame.symbol = @"main";
bottomFrame.fileName = @"main.cc";
bottomFrame.lineNumber = 123;

[[Crashlytics sharedInstance] recordCustomExceptionName:@"FooException"
                                                 reason:@"There was a foo."
                                             frameArray:@[topFrame, middleFrame, bottomFrame]];

SDK Firebase Crashlytics

Быстрый

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame.init(symbol:"makeError" fileName:"handler.js" lineNumber:495),
  StackFrame.init(symbol:"then" fileName:"routes.js" lineNumber:102),
  StackFrame.init(symbol:"main" fileName:"app.js" lineNumber:12),
]

crashlytics.record(exceptionModel:ex)

Цель-C

model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" fileName:@"handler.js" lineNumber:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" fileName:@"routes.js" lineNumber:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" fileName:@"app.js" lineNumber:12],
];

Причина изменения

Эта функция давно востребована и позволяет расширить Crashlytics на другие платформы, такие как Unity, Flutter или React Native.



CrashlyticsDelegate заменен отдельными методами для обработки отчетов о сбоях.

Теперь вы можете использовать новый набор методов для обработки отчетов о сбоях:

  • didFinishLaunchingWithOptions теперь заменен новым обработчиком checkForUnsentReportsWithCompletion .

  • crashlyticsDidDetectReportForLastExecution теперь заменен didCrashDuringPreviousExecution . didCrashDuringPreviousExecution позволяет удобно обнаружить сбои , которые происходят во время последнего запуска приложения.

  • crashlyticsCanUseBackgroundSessions теперь постоянно установлен верно.

  • Мы больше никакой поддержки не осматривая CLSReport объект делегата.

По умолчанию, Crashlytics автоматически загружает отчеты о сбоях при запуске, и вы можете предварительно позвонить didFinishLaunchingWithOptions , чтобы позволить пользователям отказаться в краш отчетности. Теперь, когда вы называете setCrashlyticsCollectionEnabled=false , чтобы отключить автоматическую отправку отчетов аварии, Crashlytics называет checkForUnsentReportsWithCompletion , которая позволяет пользователям выбирать или не отправлять отчеты о сбоях , когда ваше приложение падает. Затем можно вызвать sendUnsentReports если таковые в ОПТС пользователя в или deleteUnsentReports , если пользователь выбирает из.

Обратите внимание , что вы также можете позвонить sendUnsentReports и deleteUnsentReports вне checkForUnsentReportsWithCompletion . Например, вы можете захотеть навсегда настроить или отключить отчеты о сбоях, если ваши пользователи дали вам полное согласие или неодобрение на отправку отчетов о сбоях. Имейте в виду, что вы можете никогда не получать отчеты о сбоях, если ваше приложение выйдет из строя на ранней стадии своего жизненного цикла.

SDK для ткани

Быстрый

class YourClassName: CrashlyticsDelegate {

  func application(_ application: UIApplication, didFinishLaunchingWithOptions

    ...
    Crashlytics.sharedInstance().delegate = self
    ...

    return true
  }

  func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) {
    /* ... handle unsent reports */
  }

  func crashlyticsCanUseBackgroundSessions(_ crashlytics: Crashlytics) -> Bool {
    return true
  }
}

Цель-C

@interface YourClassName <CrashlyticsDelegate> ()
@end

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

  ...
  [[Crashlytics sharedInstance] setDelegate:self];
  ...

  return YES;
}

-(void)crashlyticsDidDetectReportForLastExecution:(CLSReport *)report completionHandler:(void (^)(BOOL submit))completionHandler {
  // ... handle unsent reports
}

-(BOOL)crashlyticsCanUseBackgroundSessions:(Crashlytics *)crashlytics {
  return YES;
}

@end

SDK Firebase Crashlytics

Быстрый

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Crashlytics.crashlytics().checkForUnsentReports { hasUnsentReport in
  let hasUserConsent = false
  // ...get user consent.

  if hasUserConsent && hasUnsentReport {
    Crashlytics.crashlytics().sendUnsentReports()
  } else {
    Crashlytics.crashlytics().deleteUnsentReports()
  }
}

// Detect when a crash happens during your app's last run.
if Crashlytics.crashlytics().didCrashDuringPreviousExecution() {
  // ...notify the user.
}

Цель-C

/* You must set setCrashlyticsCollectionEnabled to false in order to use
checkForUnsentReportsWithCompletion. */

[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

[[FIRCrashlytics crashlytics] checkForUnsentReportsWithCompletion:^(BOOL hasUnsentReports) {
  BOOL hasConsent = false;
  // ...get consent from user.

  if (hasConsent && hasUnsentReports) {
    [[FIRCrashlytics crashlytics] sendUnsentReports];
  } else {
    [[FIRCrashlytics crashlytics] deleteUnsentReports];
  }
}];

// Detect when a crash happens during your app's last run.
if ([[FIRCrashlytics crashlytics] didCrashDuringPreviousExecution]) {
  // ...notify the user.
}

Причина изменения

Новый набор методов дает вам больше контроля над поведением отчетов о сбоях вашего приложения. Кроме того, вам больше не нужно настраивать CrashlyticsDelegate перед инициализацией Crashlytics.


firebase_crashlytics_collection_enabled заменяется на FirebaseCrashlyticsCollectionEnabled.

При установке FirebaseCrashlyticsCollectionEnabled к ложному в вашем Info.plist , Crashlytics автоматически прекратит посылать отчеты о сбоях при запуске. После первого запуска вашего приложения, вы можете также отключить отчеты аварии, установив setCrashlyticsCollectionEnabled в false в вашем Crashlytics.h , но заметьте , что setCrashlyticsCollectionEnabled переопределяет этот флаг.

Выключите автоматический сбор, заменив firebase_crashlytics_collection_enabled ключ в Info.plist :

  • Ключ: FirebaseCrashlyticsCollectionEnabled

  • Значение: false

После первого запуска вашего приложения, вы также можете отключить автоматический сбор, добавив следующую строку в ваш Crashlytics.h :

SDK Firebase Crashlytics

Быстрый

// setCrashlyticsCollectionEnabled is set to true by default.
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(false)

Цель-C

// setCrashlyticsCollectionEnabled is set to true by default.
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:false];

Причина изменения

Теперь у вас есть больше контроля над тем, как Crashlytics обрабатывает неотправленные отчеты о сбоях, когда вы отключите автоматические отчеты о сбоях. После того, как вы установили FirebaseCrashlyticsCollectionEnabled к ложным, вы можете позвонить checkForUnsentReportsWithCompletion из любого места в вашем приложении и либо отправить или удалить неотправленные отчеты, в зависимости от того, что ваш выбирает пользователь.


Теперь Crashlytics всегда использует фоновые сеансы.

Раньше вы могли отключить фоновые сессии , если вы не хотите , чтобы поддержать его в приложение, установив crashlyticsCanUseBackgroundSessions к ложным. Теперь crashlyticsCanUseBackgroundSessions всегда устанавливается истина.

Причина изменения

Мы больше не поддерживаем версии iOS ниже 7.0 или версии macOS ниже OS X 10.9, которые не поддерживают фоновые сеансы.


Crashlytics может использовать только данные, собранные Google Analytics.

Вы больше не можете собирать данные с помощью Fabric Answers после обновления до Firebase Crashlytics SDK. Чтобы получить метрики для пользователей, у которых не возникало сбоев, и хлебных крошек, переключитесь на использование Google Analytics. Обратите внимание, что ваши исторические данные об ответах не могут быть перенесены в Firebase.

Визит Начните использовать Google Analytics , чтобы узнать , как добавить Google Analytics в свое приложение.

Причина изменения

Теперь мы предлагаем Google Analytics, чтобы помочь вам получить более полное представление о ваших данных о сбоях. С помощью Analytics вы можете продолжить сбор статистики для своего приложения в консоли Firebase.

Следующие шаги