Эта страница была переведа с помощью 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 : Добавьте Firebase Crashlytics SDK

  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 и внесите соответствующие изменения в свой код:


Сценарии запуска и загрузки символов теперь находятся в FirebaseCrashlytics.

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

Кроме того, API_KEY BUILD_SECRET Fabric и 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

Firebase Crashlytics SDK

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

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

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


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

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

Ткань SDK

стриж

 import Crashlytics
 

Objective-C

 @import Crashlytics
 

Firebase Crashlytics SDK

стриж

 import FirebaseCrashlytics
 

Objective-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])
 

Objective-C

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

Firebase Crashlytics SDK

стриж

 FirebaseApp.configure()
 

Objective-C

 [FIRApp configure];
 

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

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


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

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

Firebase Crashlytics SDK

стриж

 // Force a test crash
fatalError()
 

Objective-C

 // Force a test crash
assert(NO);
 

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

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


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

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

Ткань SDK

стриж

 Crashlytics.sharedInstance()
 

Objective-C

 [Crashlytics sharedInstance];
 

Firebase Crashlytics SDK

стриж

 Crashlytics.crashlytics()
 

Objective-C

 [FIRCrashlytics crashlytics];
 

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

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


Crashlytics больше не поворачивает идентификаторы при изменении рекламного идентификатора.

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

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

Использование идентификаторов экземпляров согласуется с другими SDK Firebase. Теперь вы можете единообразно управлять своими данными идентификатора экземпляра через другие службы Firebase


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

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

Ткань SDK

стриж

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

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

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

Objective-C

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

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

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

Firebase Crashlytics SDK

стриж

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

Objective-C

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

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

Мы приняли имя метода setUserID чтобы оно было совместимо с другими API-интерфейсами Firebase, и удалили 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]))
 

Objective-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);
 

Firebase Crashlytics SDK

стриж

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

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

Objective-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")
 

Objective-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"];
 

Firebase Crashlytics SDK

стриж

 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")
 

Objective-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])
 

Objective-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]];
 

Firebase Crashlytics SDK

стриж

 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)
 

Objective-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 о didFinishLaunchingWithOptions . Теперь, когда вы вызываете setCrashlyticsCollectionEnabled=false чтобы отключить автоматическое создание отчетов о сбоях, Crashlytics вызывает checkForUnsentReportsWithCompletion , который позволяет вашим пользователям выбирать, отправлять ли отчеты о сбоях при сбое вашего приложения. Затем вы можете вызвать sendUnsentReports если пользователь deleteUnsentReports или deleteUnsentReports если пользователь 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
  }
}
 

Objective-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
 

Firebase Crashlytics SDK

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.
}
 

Objective-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.
}
 

Reason for change

The new set of methods give you more control over your app's crash reporting behavior. Also, you no longer need to set up the CrashlyticsDelegate before initializing Crashlytics.


firebase_crashlytics_collection_enabled is replaced by FirebaseCrashlyticsCollectionEnabled.

When you set FirebaseCrashlyticsCollectionEnabled to false in your Info.plist , Crashlytics stops automatically sending crash reports at startup. After your app's first run, you can also disable crash reporting by setting setCrashlyticsCollectionEnabled to false in your Crashlytics.h , but note that setCrashlyticsCollectionEnabled overrides this flag.

Turn off automatic collection by replacing the firebase_crashlytics_collection_enabled key in your Info.plist :

  • Key: FirebaseCrashlyticsCollectionEnabled

  • Value: 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