Google 致力于为黑人社区推动种族平等。查看具体举措

Personnalisez vos rapports de plantage Firebase Crashlytics

Ce guide explique comment personnaliser vos rapports d'erreur à l'aide du SDK Firebase Crashlytics. Par défaut, Crashlytics recueille automatiquement des rapports pour tous les utilisateurs accident de votre application (vous pouvez désactiver cette fonctionnalité plantage automatique et activer opt-in reporting pour vos utilisateurs à la place). Crashlytics fournit quatre mécanismes de journalisation de la boîte: touches personnalisées , les journaux personnalisés , des identifiants d'utilisateur , et les exceptions rencontrées .

Ajouter des clés personnalisées

Les clés personnalisées vous aident à obtenir l'état spécifique de votre application menant à un plantage. Vous pouvez associer des paires clé/valeur arbitraires à vos rapports de plantage, puis utiliser les clés personnalisées pour rechercher et filtrer les rapports de plantage dans la console Firebase.

  • Dans le tableau de bord Crashlytics , vous pouvez rechercher des questions qui correspondent à une clé personnalisée.
  • Lorsque vous examinez un problème spécifique dans la console, vous pouvez afficher les touches personnalisées associées pour chaque événement (Keys sous - onglet) et même de filtrer les événements par touches personnalisées (menu Filtre en haut de la page).

Utilisez la setCustomValue méthode pour définir des paires clé / valeur. Par exemple:

Rapide

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

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

Objectif c

Lors de la définition des entiers, booléens, ou flotteurs, boîte la valeur @( 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"];

Vous pouvez également modifier la valeur d'une clé existante en appelant la clé et en la définissant sur une valeur différente. Par exemple:

Rapide

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

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

Objectif c

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

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

Ajouter une clé paires / valeur en vrac à l'aide du setCustomKeysAndValues procédé avec un NSDictionary comme le seul paramètre:

Rapide

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)

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

Ajouter des messages de journal personnalisés

Pour vous donner plus de contexte pour les événements menant à un plantage, vous pouvez ajouter des journaux Crashlytics personnalisés à votre application. Crashlytics associe les journaux avec vos données sur les accidents et les affiche dans la page Crashlytics de la console Firebase , sous l'onglet Journaux.

Rapide

Utilisez log() ou log(format:, arguments:) à l' aide de questions Pinpoint. Si vous souhaitez obtenir une sortie de journal utile avec des messages, l'objet que vous passez à log() doit se conformer à la CustomStringConvertible propriété. log() renvoie la propriété de description que vous définissez pour l'objet. Par exemple:

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

.log(format:, arguments:) des valeurs de formats de retour d'appeler getVaList() . Par exemple:

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

Pour plus de détails sur l'utilisation de log() ou log(format:, arguments:) , reportez - vous à la Crashlytics documentation de référence .

Objectif c

Utilisez log ou logWithFormat aux questions de l' aide Pinpoint. Notez que si vous souhaitez obtenir une sortie de journal utile avec des messages, l'objet que vous passez à une ou l' autre méthode doit remplacer la description propriété d'instance. Par exemple:

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

Pour plus de détails sur l'utilisation de log et logWithFormat , reportez - vous à la Crashlytics documentation de référence .

Définir les identifiants des utilisateurs

Pour diagnostiquer un problème, il est souvent utile de savoir lequel de vos utilisateurs a subi un plantage donné. Crashlytics inclut un moyen d'identifier de manière anonyme les utilisateurs dans vos rapports d'erreur.

Pour ajouter des ID utilisateur à vos rapports, attribuez à chaque utilisateur un identifiant unique sous la forme d'un numéro d'ID, d'un jeton ou d'une valeur hachée :

Rapide

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

Objectif c

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

Si vous avez besoin d'effacer un identifiant d'utilisateur après l'avoir défini, réinitialisez la valeur sur une chaîne vide. L'effacement d'un identifiant utilisateur ne supprime pas les enregistrements Crashlytics existants. Si vous avez besoin de supprimer des enregistrements associés à un ID utilisateur, contactez le support Firebase .

Signaler des exceptions non fatales

En plus de signaler automatiquement les plantages de votre application, Crashlytics vous permet d'enregistrer des exceptions non fatales et de vous les envoyer au prochain lancement de votre application.

Vous pouvez enregistrer des exceptions non mortelles en enregistrant NSError objets avec la recordError méthode. recordError capture la pile d'appels du thread en appelant [NSThread callStackReturnAddresses] .

Rapide

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

Objectif c

[[FIRCrashlytics crashlytics] recordError:error];

Lorsque vous utilisez la recordError méthode, il est important de comprendre la NSError structure et comment Crashlytics utilise les données pour les accidents de groupe. Une utilisation incorrecte de la recordError méthode peut provoquer un comportement imprévisible et peut causer Crashlytics à limiter la déclaration des erreurs enregistrées pour votre application.

Un NSError objet a trois arguments:

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

Contrairement à des accidents mortels, qui sont regroupées par l' intermédiaire de l' analyse de traces de la pile, les erreurs enregistrées sont regroupées par domain et le code . Il s'agit d'une distinction importante entre les plantages fatals et les erreurs enregistrées. Par exemple:

Rapide

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)

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

Lorsque vous vous connectez l'erreur ci - dessus, il crée une nouvelle question qui est regroupé par NSSomeErrorDomain et -1001 . Les erreurs enregistrées supplémentaires qui utilisent les mêmes valeurs de domaine et de code sont regroupées sous le même problème. Les données contenues dans le userInfo objet sont converties en paires clé-valeur et affichées dans les touches / logs section dans un problème individuel.

Journaux et clés personnalisées

Tout comme rapports d' erreur, vous pouvez intégrer des journaux et des clés personnalisés pour ajouter du contexte à la NSError . Cependant, il existe une différence entre les journaux associés aux plantages et les erreurs enregistrées. Lorsqu'un plantage se produit et que l'application est relancée, les journaux que Crashlytics récupère à partir du disque sont ceux qui ont été écrits jusqu'au moment du plantage. Lorsque vous vous connectez un NSError , l'application n'a pas immédiatement fin. Parce que Crashlytics envoie uniquement le rapport d'erreur enregistrée sur le prochain lancement de l' application et doit limiter la quantité d'espace alloué pour les journaux sur le disque, il est possible de se connecter assez après un NSError est enregistré de telle sorte que tous les journaux concernés sont mis en rotation par le temps Crashlytics envoie le rapport de l'appareil. Gardez cet équilibre à l' esprit lors de la connexion NSErrors et à l' aide des journaux et des clés personnalisés dans votre application.

Considérations relatives aux performances

Gardez à l' esprit que l' enregistrement d' un NSError peut être assez cher. Au moment où vous effectuez l'appel, Crashlytics capture la pile d'appels du thread en cours à l'aide d'un processus appelé déroulement de la pile. Ce processus peut être gourmand en CPU et en E/S, en particulier sur les architectures qui prennent en charge le déroulement DWARF (arm64 et x86). Une fois le déroulement terminé, les informations sont écrites sur le disque de manière synchrone. Cela évite la perte de données si la ligne suivante venait à planter.

Bien qu'il soit sûr d'appeler cette API sur un thread d'arrière-plan, n'oubliez pas que l'envoi de cet appel à une autre file d'attente perd le contexte de la trace de pile actuelle.

Qu'en est-il des NSExceptions ?

Crashlytics n'offre pas une installation pour la connexion et l' enregistrement NSException instances directement. De manière générale, les API Cocoa et Cocoa Touch ne sont pas protégées contre les exceptions. Cela signifie que l'utilisation de @catch peut avoir de très graves effets secondaires indésirables dans votre processus, même lorsqu'ils sont utilisés avec un soin extrême. Vous ne devez jamais utiliser @catch déclarations dans votre code. S'il vous plaît se référer à la documentation d'Apple sur le sujet.

Activer les rapports d'activation

Par défaut, Crashlytics collecte automatiquement les rapports de plantage pour tous les utilisateurs de votre application. Pour donner aux utilisateurs plus de contrôle sur les données qu'ils envoient, vous pouvez activer la création de rapports opt-in en désactivant la création de rapports automatiques et en n'envoyant des données à Crashlytics que lorsque vous le souhaitez dans votre code :

  1. Désactivez la collecte automatique en ajoutant une nouvelle clé de votre Info.plist fichier:

    • Légende: FirebaseCrashlyticsCollectionEnabled
    • Valeur: false
  2. Activez la collecte pour certains utilisateurs en appelant le remplacement de collecte de données Crashlytics au moment de l'exécution. La valeur de remplacement persiste lors des lancements de votre application afin que Crashlytics puisse automatiquement collecter des rapports.

    Pour retirer des rapports de collision automatique, passer false que la valeur de remplacement. Lorsqu'il est réglé sur false , la nouvelle valeur ne s'applique pas avant la prochaine exécution de l'application.

    Rapide

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
    

    Objectif c

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
    

Gérer les données Crash Insights

Crash Insights vous aide à résoudre les problèmes en comparant vos traces de pile anonymisées aux traces d'autres applications Firebase et en vous indiquant si votre problème fait partie d'une tendance plus large. Pour de nombreux problèmes, Crash Insights fournit même des ressources pour vous aider à déboguer le crash.

Crash Insights utilise des données de crash agrégées pour identifier les tendances de stabilité courantes. Si vous préférez ne pas partager vos données de l' application, vous pouvez choisir de Insights crash dans le menu Insights crash en haut de votre liste d'émission Crashlytics dans la console Firebase .