This guide contains instructions for upgrading to the latest version of the Firebase Crashlytics SDK from the legacy Fabric SDK.
Эта страница была переведа с помощью Cloud Translation API.
Switch to English

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

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

Если вы недавно перенесли приложение из Fabric, узнайте, как обновление до Firebase Crashlytics SDK влияет на данные анализа сбоев .

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

  1. Откройте настройки вашего проекта. На карточке « Ваши приложения» выберите идентификатор пакета приложения, для которого вам нужен файл конфигурации.
  2. Нажмите Загрузить GoogleService-Info.plist, чтобы получить файл конфигурации Firebase iOS ( GoogleService-Info.plist ).

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

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

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

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

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

  1. В Cocoapods замените модули Fabric и Crashlytics Firebase/Crashlytics во всех целях. Убедитесь, что вы добавили версию 4.0.0 или новее (это необходимо для отображения отчетов о сбоях в консоли Firebase).

    # 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 из любого места в процессе сборки, чтобы вручную загрузить свои dSYM.

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

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 в качестве зависимости, поэтому мы переносим наши инструменты CLI в новую библиотеку.


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

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

SDK для ткани

Swift

import Crashlytics

Цель-C

@import Crashlytics

SDK Firebase Crashlytics

Swift

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 для ткани

Swift

Fabric.with([Crashlytics.self])

Цель-C

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

SDK Firebase Crashlytics

Swift

FirebaseApp.configure()

Цель-C

[FIRApp configure];

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

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


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

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

SDK Firebase Crashlytics

Swift

// Force a test crash
fatalError()

Цель-C

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

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

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


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

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

SDK для ткани

Swift

Crashlytics.sharedInstance()

Цель-C

[Crashlytics sharedInstance];

SDK Firebase Crashlytics

Swift

Crashlytics.crashlytics()

Цель-C

[FIRCrashlytics crashlytics];

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

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


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

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

SDK для ткани

Swift

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

Swift

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

Цель-C

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

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

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


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

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

SDK для ткани

Swift

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

Swift

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 для ткани

Swift

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

Swift

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 для ткани

Swift

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

Swift

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 теперь постоянно имеет значение true.

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

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

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

SDK для ткани

Swift

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

Swift

/* 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 на false в своем Info.plist , Crashlytics перестает автоматически отправлять отчеты о сбоях при запуске. После первого запуска приложения вы также можете отключить отчеты о setCrashlyticsCollectionEnabled установив для setCrashlyticsCollectionEnabled значение false в вашем Crashlytics.h , но обратите внимание, что setCrashlyticsCollectionEnabled переопределяет этот флаг.

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

  • Ключ: FirebaseCrashlyticsCollectionEnabled

  • Значение: false

After the first run of your app, you can also turn off automatic collection by adding the following to your Crashlytics.h :

Firebase Crashlytics SDK

Swift

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

Objective-C

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

Reason for change

Now you have more control over how Crashlytics handles unsent crash reports when you disable automatic crash reporting. After you set FirebaseCrashlyticsCollectionEnabled to false, you can call checkForUnsentReportsWithCompletion from anywhere in your app and either send or delete unsent reports, depending on what your user chooses.


Now, Crashlytics always uses background sessions.

Previously, you could turn off background sessions if you didn't want to support it in your app by setting crashlyticsCanUseBackgroundSessions to false. Now, crashlyticsCanUseBackgroundSessions is always set to true.

Reason for change

We no longer support iOS versions below 7.0 or macOS versions below OS X 10.9, which do not support background sessions.


Crashlytics can only use data collected by Google Analytics.

You can no longer collect data with Fabric Answers after upgrading to the Firebase Crashlytics SDK. To get metrics for crash-free users and breadcrumbs, switch over to using Google Analytics instead. Note that your historical Answers data cannot migrate to Firebase.

Visit Start using Google Analytics to learn how to add Google Analytics to your app. If you previously used Fabric Answers, find out how to convert your Answers events to Analytics events .

Reason for change

We now offer Google Analytics to help you get more insight into your crash data. With Analytics, you can continue gathering stats for your app in the Firebase console.

Next steps