Questa pagina è stata tradotta dall'API Cloud Translation.
Switch to English

Esegui l'upgrade all'SDK di Firebase Crashlytics

Ora puoi configurare Crashlytics nella tua app utilizzando il nuovo SDK Firebase Crashlytics ufficiale, che offre API migliorate più coerenti con altri prodotti Firebase e più intuitive da usare. Questa guida descrive come eseguire l'aggiornamento al nuovo SDK da Fabric Crashlytics SDK. Descrive le modifiche fornite con le nuove API, il motivo delle modifiche e come aggiornare il codice, se necessario.

Se hai recentemente migrato la tua app da Fabric, verifica in che modo l'aggiornamento all'SDK di Firebase Crashlytics influisce sui dati di analisi dei crash .

Passaggio 1 : aggiungere un file di configurazione di Firebase

  1. Apri le impostazioni del tuo progetto. Nella scheda Le tue app , seleziona l'ID bundle dell'app per cui hai bisogno di un file di configurazione.
  2. Fai clic su Scarica GoogleService-Info.plist per ottenere il tuo file di configurazione iOS Firebase ( GoogleService-Info.plist ).

    • Puoi scaricare di nuovo il tuo file di configurazione iOS Firebase in qualsiasi momento.

    • Assicurarsi che il nome file di configurazione non sia aggiunto con caratteri aggiuntivi, come (2) .

  3. Sposta il tuo file di configurazione nella radice del tuo progetto Xcode. Se richiesto, selezionare per aggiungere il file di configurazione a tutte le destinazioni.

Se nel progetto sono presenti più ID bundle, è necessario associare ciascun ID bundle a un'app registrata nella console di Firebase in modo che ciascuna app possa avere il proprio file GoogleService-Info.plist .

Passaggio 2 : aggiungere l'SDK di Firebase Crashlytics

  1. In Cocoapods, sostituisci i pod Fabric e Crashlytics con un pod Firebase/Crashlytics in tutti i target. Assicurati di aggiungere la versione 4.0.0 o successive (questo è necessario affinché i rapporti sugli arresti anomali vengano visualizzati nella console di Firebase).

    # Add the pod for Firebase Crashlytics
    pod 'Firebase/Crashlytics'
    # Recommended: Add the Firebase pod for Google Analytics pod 'Firebase/Analytics'
  2. Disinstallare o rimuovere direttamente dipendenze di terze parti da Fabric, ad esempio dipendenze da Fabric Answers e kit di terze parti.

  3. Installa e aggiorna i pod, quindi apri il tuo file .xcworkspace per vedere il progetto in Xcode:

    pod install
    open your-project .xcworkspace

Passaggio 3 : aggiorna il codice

  1. In Xcode, ricostruisci la tua app, quindi riapri nuovamente il tuo file .xcworkspace.

  2. Esamina le seguenti modifiche all'SDK e apporta gli aggiornamenti appropriati al tuo codice:


Gli script di esecuzione e caricamento dei simboli sono ora in FirebaseCrashlytics.

Ora puoi accedere agli script di run e upload-symbols dalla nuova libreria FirebaseCrashlytics . Tieni presente che puoi comunque chiamare upload-symbols da qualsiasi parte del processo di compilazione per caricare manualmente i tuoi dSYM.

Inoltre, API_KEY e BUILD_SECRET non sono più inclusi nel nuovo SDK. Invece, Crashlytics ora utilizza GoogleService-info.plist della tua app per associare la tua app al tuo progetto Firebase e conservare i tuoi dati di crash storici.

SDK in tessuto

${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

ragione per cambiare

Crashlytics non utilizza più Fabric SDK come dipendenza, quindi stiamo spostando i nostri strumenti della CLI in una nuova libreria.


La libreria Crashlytics ora si chiama FirebaseCrashlytics.

Nella tua app, aggiorna i tuoi percorsi di importazione:

SDK in tessuto

veloce

 import Crashlytics
 

Objective-C

 @import Crashlytics
 

Firebase Crashlytics SDK

veloce

 import FirebaseCrashlytics
 

Objective-C

 @import FirebaseCrashlytics
 

ragione per cambiare

L'aggiornamento del nome della libreria Crashlytics lo rende coerente con le altre librerie Firebase (ad es. FirebaseFirestore e FirebaseAuth ).


FirebaseCrashlytics non funziona più con Fabric SDK.

Ora, FirebaseCrashlytics può essere inizializzato solo con l'SDK di Firebase Crashlytics. È possibile avviare un'istanza di FirebaseCrashlytics chiamando FirebaseApp.configure in Swift o [FIRApp configure] in Objective-C.

All'interno application:didFinishLaunchingWithOptions , sostituisci le chiamate a Fabric.with e startWithAPIKey con una chiamata a FirebaseApp :

SDK in tessuto

veloce

 Fabric.with([Crashlytics.self])
 

Objective-C

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

Firebase Crashlytics SDK

veloce

 FirebaseApp.configure()
 

Objective-C

 [FIRApp configure];
 

ragione per cambiare

L'uso dei nuovi metodi per inizializzare Crashlytics è più coerente con la modalità di inizializzazione di altri servizi Firebase.


I metodi crash e throwException vengono rimossi.

Il nuovo SDK non include più i metodi crash o throwException . Invece, usa fatalError in Swift o assert in Objective-C per forzare un arresto anomalo.

Firebase Crashlytics SDK

veloce

 // Force a test crash
fatalError()
 

Objective-C

 // Force a test crash
assert(NO);
 

ragione per cambiare

Diversi tipi di arresti anomali possono verificarsi per diversi motivi e questi metodi non hanno specificato chiaramente se gli arresti risultanti si sono verificati durante il runtime o nell'SDK nativo dell'app.


Il metodo sharedInstance ora è chiamato crashlytics.

Il nuovo SDK non include più il metodo sharedInstance . Per inizializzare Crashlytics, utilizzare invece crashlytics (leggere la documentazione di riferimento per Swift o Objective-C per ulteriori informazioni). Nel delegato dell'app, aggiorna lo script di inizializzazione:

SDK in tessuto

veloce

 Crashlytics.sharedInstance()
 

Objective-C

 [Crashlytics sharedInstance];
 

Firebase Crashlytics SDK

veloce

 Crashlytics.crashlytics()
 

Objective-C

 [FIRCrashlytics crashlytics];
 

ragione per cambiare

Abbiamo rinominato il metodo getter dell'istanza in modo che sia coerente con altri SDK Firebase.


Crashlytics non ruota più gli ID quando cambia l'ID pubblicità.

Crashlytics ora utilizza gli ID istanza anziché gli ID pubblicità per identificare le istanze della tua app e associare i dati degli utenti ai loro dispositivi. Puoi utilizzare gli ID istanza per aiutare i tuoi utenti a controllare i dati delle loro app.

ragione per cambiare

L'uso degli ID istanza è coerente con altri SDK Firebase. Ora puoi gestire in modo uniforme i dati dell'ID istanza su altri servizi Firebase.


setUserIdentifier è ora setUserID. setUserName e setUserEmail sono stati rimossi.

In precedenza, è possibile impostare un nome o un indirizzo e-mail associato a un arresto anomalo utilizzando setUserName e setUserEmail , ma questi metodi non saranno più definiti. Il nuovo metodo preferito per impostare gli ID per i tuoi utenti è usare setUserID .

SDK in tessuto

veloce

 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

veloce

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

Objective-C

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

ragione per cambiare

Abbiamo adottato il nome del metodo setUserID per setUserID coerente con altre API di Firebase e rimosso setUserName e setUserEmail per scoraggiare la registrazione delle informazioni personali tramite Crashlytics.


CLSLogv e CLSNSLogv sono sostituiti da funzioni di registrazione.

Il nuovo SDK non include più le funzioni CLSLogv o CLSNSLogv . Per aggiungere messaggi di registro personalizzati , utilizzare i nuovi metodi di registrazione nella libreria Crashlytics . Si noti che i nuovi metodi non vengono più stampati su stdout o NSLog (si consiglia di scrivere un wrapper se si desidera mantenere questo comportamento).

SDK in tessuto

veloce

 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

veloce

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

Se hai utilizzato CLS_LOG , aggiungi quanto segue a un file di intestazione per continuare a ottenere nomi di file e numeri di riga nelle istruzioni del registro:

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

ragione per cambiare

I nuovi metodi richiedono istanze, il che semplifica il test del codice.


setCustomValue sta sostituendo setObjectValue, setIntValue, setFloatValue e setBoolValue.

I metodi setter personalizzati non sono più inclusi nel nuovo SDK. In precedenza, era possibile utilizzare i metodi per impostare coppie chiave / valore da inviare insieme al rapporto sugli arresti anomali. Ora puoi usare setCustomValue:forKey per impostare coppie chiave / valore per tutti i tipi di dati.

SDK in tessuto

veloce

 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

veloce

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

ragione per cambiare

Il nuovo nome del metodo è unico per Crashlytics e chiarisce che Crashlytics non è conforme al valore-chiave.


recordCustomExceptionName: reason: frameArray: viene sostituito dall'API del modello di eccezione.

Se l'app viene eseguita in un ambiente non nativo (ad esempio JavaScript o Unity), è possibile utilizzare l'API del modello di eccezione per segnalare i metadati di arresto anomalo nel formato di eccezione nativo dell'app.

SDK in tessuto

veloce

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

veloce

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

ragione per cambiare

Questa funzione è stata richiesta da molto tempo e ti consente di estendere Crashlytics su altre piattaforme come Unity, Flutter o React Native.



Il delegato Crashlytics è sostituito da metodi separati per la gestione dei rapporti sugli arresti anomali.

Ora puoi utilizzare un nuovo set di metodi per gestire i rapporti sugli arresti anomali:

  • didFinishLaunchingWithOptions ora è sostituito dal nuovo gestore checkForUnsentReportsWithCompletion .

  • crashlyticsDidDetectReportForLastExecution ora è sostituito da didCrashDuringPreviousExecution . didCrashDuringPreviousExecution ti consente di rilevare comodamente gli arresti anomali che si verificano durante l'ultima esecuzione della tua app.

  • crashlyticsCanUseBackgroundSessions ora è permanentemente impostato su true.

  • Non supportiamo più l'ispezione dell'oggetto CLSReport nel delegato.

Per impostazione predefinita, Crashlytics carica automaticamente i rapporti sugli arresti anomali all'avvio e in precedenza didFinishLaunchingWithOptions chiamare didFinishLaunchingWithOptions per consentire agli utenti di attivare la segnalazione degli arresti didFinishLaunchingWithOptions . Ora, quando chiami setCrashlyticsCollectionEnabled=false per disattivare la segnalazione automatica degli arresti anomali, Crashlytics chiama checkForUnsentReportsWithCompletion , che consente agli utenti di scegliere se inviare o meno i rapporti sugli arresti anomali quando l'app si arresta in modo anomalo. È quindi possibile chiamare sendUnsentReports se l'utente deleteUnsentReports o deleteUnsentReports se l'utente deleteUnsentReports .

Nota che puoi anche chiamare sendUnsentReports ed deleteUnsentReports al di fuori di checkForUnsentReportsWithCompletion . Ad esempio, potresti voler impostare o disabilitare in modo permanente la segnalazione degli arresti anomali se i tuoi utenti ti hanno dato l'approvazione generale o non approvano l'invio di segnalazioni sugli arresti anomali. Tieni presente che potresti non ricevere mai rapporti sugli arresti anomali se l'app si arresta in modo anomalo all'inizio del suo ciclo di vita.

SDK in tessuto

veloce

 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