Настройте отчеты о сбоях Firebase Crashlytics

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

Добавить собственные ключи

Пользовательские ключи помогают получить конкретное состояние вашего приложения, ведущее к сбою. Вы можете связать произвольные пары ключ / значение со своими отчетами о сбоях, а затем использовать пользовательские ключи для поиска и фильтрации отчетов о сбоях в консоли Firebase.

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

Используйте setCustomValue метод , чтобы установить пар ключ / значение. Например:

Быстрый

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

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

Цель-C

При установке целых чисел, булевых или поплавков, поле значения как @( value ) .

// Set int_key to 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

Вы также можете изменить значение существующего ключа, вызвав ключ и установив для него другое значение. Например:

Быстрый

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

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

Цель-C

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

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

Добавить пары ключ / значение в массе с помощью setCustomKeysAndValues метод с NSDictionary в качестве единственного параметра:

Быстрый

let keysAndValues = [
               "string key" : "string value",
               "string key 2" : "string value 2",
               "boolean key" : true,
               "boolean key 2" : false,
               "float key" : 1.01,
               "float key 2" : 2.02
              ] as [String : Any]

Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)

Цель-C

NSDictionary *keysAndValues =
  @{@"string key" : @"string value",
    @"string key 2" : @"string value 2",
    @"boolean key" : @(YES),
    @"boolean key 2" : @(NO),
    @"float key" : @(1.01),
    @"float key 2" : @(2.02)};

[[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];

Добавить собственные сообщения журнала

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

Быстрый

Использование log() или log(format:, arguments:) на вопросы , помощь точечным. Если вы хотите , чтобы получить полезный выход журнала с сообщениями, объект , который вы передаете log() должен соответствовать CustomStringConvertible собственности. log() возвращает описание свойства вы определяете для объекта. Например:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")

.log(format:, arguments:) для getVaList() .log(format:, arguments:) форматирует значения , возвращаемые из вызова getVaList() . Например:

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))

Для получения более подробной информации о том , как использовать log() или log(format:, arguments:) , обратитесь к Crashlytics справочной документации .

Цель-C

Использование log или logWithFormat вопросов помощи точечных. Обратите внимание , что если вы хотите , чтобы получить полезный выход журнала с сообщениями, объект , который вы передаете любой метод должен переопределить description свойства экземпляра. Например:

[[FIRCrashlytics crashlytics] log:@"Simple string message"];

[[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict];

[[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments:va_list_arg];

Для получения более подробной информации о том , как использовать log и logWithFormat , обратитесь к Crashlytics справочной документации .

Установить идентификаторы пользователей

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

Чтобы добавить идентификаторы пользователей в отчеты, назначьте каждому пользователю уникальный идентификатор в виде номера идентификатора, токена или хешированного значения:

Быстрый

Crashlytics.crashlytics().setUserID("123456789")

Цель-C

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

Если вам когда-нибудь понадобится очистить идентификатор пользователя после его установки, сбросьте значение на пустую строку. Очистка идентификатора пользователя не удаляет существующие записи Crashlytics. Если вам необходимо удалить записи , связанные с идентификатором пользователя, обратитесь в службу поддержки Firebase .

Сообщать о некритических исключениях

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

Вы можете записывать не фатальные исключения путем записи NSError объектов с recordError методом. recordError захватывает стека вызовов потока путем вызова [NSThread callStackReturnAddresses] .

Быстрый

Crashlytics.crashlytics().record(error: error)

Цель-C

[[FIRCrashlytics crashlytics] recordError:error];

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

NSError объект имеет три аргумента:

  • domain: String
  • code: Int
  • userInfo: [AnyHashable : Any]? = nil

В отличии от аварий со смертельным исходом, которые сгруппированы с помощью анализа стека трассировки, регистрируемые ошибки сгруппированы по domain и code . Это важное различие между фатальными сбоями и зарегистрированными ошибками. Например:

Быстрый

let userInfo = [
NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""),
NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""),
NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""),
"ProductID": "123456",
"View": "MainView"
]

let error = NSError.init(domain: NSCocoaErrorDomain,
                       code: -1001,
                       userInfo: userInfo)

Цель-C

NSDictionary *userInfo = @{
NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil),
NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil),
NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil),
@"ProductID": @"123456",
@"View": @"MainView",
};

NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                   code:-1001
                               userInfo:userInfo];

При входе ошибки выше, он создает новую проблему , которая группируется по NSSomeErrorDomain и -1001 . Дополнительные зарегистрированные ошибки, использующие тот же домен и значения кода, сгруппированы по одной и той же проблеме. Данные , содержащиеся в userInfo объекта преобразуются в пар ключ-значение и отображается в ключах / журналы раздела внутри отдельного вопроса.

Журналы и пользовательские ключи

Так же , как отчеты о сбоях, вы можете вставлять журналы и пользовательские ключи , чтобы добавить контекст к NSError . Однако есть разница в том, какие журналы прикрепляются к сбоям, а какие - к зарегистрированным ошибкам. Когда происходит сбой и приложение перезапускается, Crashlytics получает с диска журналы, которые были записаны непосредственно до сбоя. При входе в NSError , приложение не немедленно прекратить. Поскольку Crashlytics только отправляет вошедший отчет об ошибке на следующем запуске приложения и должен ограничить объем пространства , выделенное для журналов на диске, можно войти достаточно после NSError записывается так , чтобы все соответствующие журналы поворачиваются к тому времени Crashlytics посылает отчет с устройства. Имейте это в виду баланс при входе NSErrors и с помощью журналов и пользовательских ключей в приложении.

Соображения производительности

Имейте в виду , что вход в NSError может быть довольно дорогим. Во время вызова Crashlytics захватывает стек вызовов текущего потока, используя процесс, называемый раскручиванием стека. Этот процесс может быть интенсивным для ЦП и ввода-вывода, особенно в архитектурах, поддерживающих раскручивание DWARF (arm64 и x86). После завершения раскрутки информация синхронно записывается на диск. Это предотвращает потерю данных в случае сбоя следующей строки.

Хотя вызывать этот API в фоновом потоке безопасно, помните, что при отправке этого вызова в другую очередь теряется контекст текущей трассировки стека.

А как насчет NSExceptions?

Crashlytics не предлагает средство для регистрации и записи NSException экземпляров непосредственно. Вообще говоря, API-интерфейсы Cocoa и Cocoa Touch не являются безопасными в отношении исключений. Это означает , что использование @catch может иметь очень серьезные непреднамеренные побочные эффекты в вашем процессе, даже при использовании с крайней осторожностью. Вы никогда не должны использовать @catch заявления в своем коде. Пожалуйста , обратитесь к документации компании Apple по данной теме.

Включить отчеты о подписке

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

  1. Выключите автоматический сбор, добавив новый ключ к вашему Info.plist файла:

    • Ключ: FirebaseCrashlyticsCollectionEnabled
    • Значение: false
  2. Включите сбор данных для избранных пользователей, вызвав переопределение сбора данных Crashlytics во время выполнения. Значение переопределения сохраняется при запуске вашего приложения, поэтому Crashlytics может автоматически собирать отчеты.

    Чтобы отказаться от автоматической отчетности аварии, передать false как корректирующее значение. Если установлено значение false , то новое значение не не применяется до следующего запуска приложения.

    Быстрый

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    

    Цель-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
    

Управление данными Crash Insights

Crash Insights помогает решать проблемы, сравнивая анонимные трассировки стека с трассировками из других приложений Firebase и сообщая вам, является ли ваша проблема частью более широкой тенденции. По многим вопросам Crash Insights даже предоставляет ресурсы, которые помогут вам отладить сбой.

Crash Insights использует агрегированные данные о сбоях для определения общих тенденций стабильности. Если вы не хотите делиться данные приложения, вы можете отказаться от Крушения Insights из меню Краш Insights в верхней части списка проблем Crashlytics в консоли Firebase .