Freigeben über


App Center-Abstürze (React Native)

Wichtig

Visual Studio App Center wird am 31. März 2025 eingestellt. Sie können Visual Studio App Center zwar weiterhin verwenden, bis es vollständig eingestellt ist, es gibt jedoch mehrere empfohlene Alternativen, zu denen Sie möglicherweise eine Migration in Erwägung ziehen.

Erfahren Sie mehr über Supportzeitpläne und Alternativen.

App Center-Abstürze generiert automatisch ein Absturzprotokoll, wenn Ihre App abstürzt. Das Protokoll wird zuerst in den Speicher des Geräts geschrieben, und wenn der Benutzer die App erneut startet, wird der Absturzbericht an App Center gesendet. Das Sammeln von Abstürze funktioniert sowohl für Beta- als auch für Live-Apps, d. h. für solche, die an Google Play übermittelt werden. Absturzprotokolle enthalten wertvolle Informationen, die Sie bei der Behebung des Absturzes unterstützen.

Folgen Sie dem Abschnitt Erste Schritte, wenn Sie das SDK noch nicht in Ihrer Anwendung eingerichtet haben.

Unabhängig davon, wo Sie App Center Abstürze verwenden, fügen Sie oben in der Datei den folgenden Import hinzu.

// Import App Center Crashes at the top of the file.
import Crashes from 'appcenter-crashes';

Generieren eines Testabsturzes

App Center Crashes bietet Ihnen eine API zum Generieren eines Testabsturzes zum einfachen Testen des SDK. Diese API kann nur in Test-/Beta-Apps verwendet werden und wird in Produktions-Apps nicht ausgeführt.

Crashes.generateTestCrash();

Es ist auch einfach, einen JavaScript-Absturz zu generieren. Fügen Sie dem Code die folgende Zeile hinzu, wodurch ein JavaScript-Fehler ausgelöst wird und ein Absturz verursacht wird.

throw new Error('This is a test javascript crash!');

Tipp

Ihre React Native-App muss im Releasemodus kompiliert werden, damit dieser Absturz an App Center gesendet wird.

Hinweis

Derzeit unterstützt App Center keine Quellzuordnungen, um JavaScript-Stapelablaufverfolgungen für Android React Native-Apps zu entminieren.

Hinweis

Es empfiehlt sich, eine JavaScript-Anweisung throw mit einem Zeichenfolgenwert (z. B.: ) zu vermeiden, throw 'message'da React Native in diesem Szenario keinen vollständigen JavaScript-Stapel beibewahrt. Stattdessen throw ein JavaScript Error (z. B. ). throw Error('message')

Weitere Informationen zu einem vorherigen Absturz

App Center Crashes verfügt über zwei APIs, die Ihnen weitere Informationen liefern, falls Ihre App abgestürzt ist.

Hat die App in der vorherigen Sitzung eine Warnung zu wenig Arbeitsspeicher erhalten?

Nach dem Starten des SDK können Sie jederzeit überprüfen, ob die App in der vorherigen Sitzung eine Speicherwarnung erhalten hat:

const hadLowMemoryWarning = await Crashes.hasReceivedMemoryWarningInLastSession();

Hinweis

In einigen Fällen sendet ein Gerät mit wenig Arbeitsspeicher möglicherweise keine Ereignisse.

Ist die App in der vorherigen Sitzung abgestürzt?

Nach dem Starten des SDK können Sie jederzeit überprüfen, ob die App beim vorherigen Start abgestürzt ist:

const didCrash = await Crashes.hasCrashedInLastSession();

Dies ist nützlich, wenn Sie das Verhalten oder die Benutzeroberfläche Ihrer App nach einem Absturz anpassen möchten. Einige Entwickler haben sich dafür entschieden, eine zusätzliche Benutzeroberfläche anzuzeigen, um sich bei ihren Benutzern zu entschuldigen, oder möchten nach einem Absturz kontaktieren.

Details zum letzten Absturz

Wenn Ihre App zuvor abgestürzt ist, können Sie Details zum letzten Absturz abrufen.

const crashReport = await Crashes.lastSessionCrashReport();

Anpassen der Nutzung von App Center-Abstürze

App Center Crashes bietet Rückrufe für Entwickler, um zusätzliche Aktionen vor und beim Senden von Absturzprotokollen an App Center auszuführen.

Verarbeitungsabstürze in JavaScript

Damit Ihre Crash.setListener Methoden wie erwartet funktionieren, müssen Sie überprüfen, ob Ihre Anwendung ordnungsgemäß konfiguriert ist.

  1. Öffnen Sie die Projektdatei, ios/YourAppName/AppDelegate.m und vergewissern Sie sich, dass Sie anstelle von [AppCenterReactNativeCrashes registerWithAutomaticProcessing];vorhanden sind[AppCenterReactNativeCrashes register];.
  2. Öffnen Sie die Datei des Projekts, android/app/src/main/res/values/strings.xml und vergewissern Sie sich, dass appCenterCrashes_whenToSendCrashes auf ASK_JAVASCRIPTfestgelegt ist.

Alle verschiedenen Rückrufe des Ereignislisteners werden einzeln in diesem Dokument erläutert, aber Sie müssen einen Ereignislistener festlegen, der alle Rückrufe gleichzeitig definiert.

Sollte der Absturz verarbeitet werden?

Implementieren Sie diesen Rückruf, wenn Sie entscheiden möchten, ob ein bestimmter Absturz verarbeitet werden muss oder nicht. Beispielsweise kann es zu einem Absturz auf Systemebene kommen, den Sie ignorieren möchten und den Sie nicht an App Center senden möchten.

Crashes.setListener({

    shouldProcess: function (report) {
        return true; // return true if the crash report should be processed, otherwise false.
    },

    // Other callbacks must also be defined at the same time if used.
    // Default values are used if a method with return parameter isn't defined.
});

Hinweis

Um dieses Feature verwenden zu können, müssen Sie Ihre Anwendung ordnungsgemäß für den Absturzdienst konfigurieren.

Dieses Feature hängt von Verarbeitungsabstürzen in JavaScript ab.

Wenn Ihnen der Datenschutz der Benutzer wichtig ist, sollten Sie eine Benutzerbestätigung erhalten, bevor Sie einen Absturzbericht an App Center senden. Das SDK macht einen Rückruf verfügbar, der App Center-Abstürze angibt, die Bestätigung des Benutzers abzuwarten, bevor Absturzberichte gesendet werden.

Wenn Sie sich dafür entschieden haben, sind Sie dafür verantwortlich, die Bestätigung des Benutzers zu erhalten, z. B. über eine Dialogaufforderung mit einer der folgenden Optionen: Immer senden, senden und Nicht senden. Basierend auf der Eingabe teilen Sie App Center Abstürze mit, was zu tun ist, und der Absturz wird dann entsprechend behandelt.

Hinweis

Das SDK zeigt dafür kein Dialogfeld an. Die App muss eine eigene Benutzeroberfläche bereitstellen, um die Zustimmung des Benutzers einzuholen.

Der folgende Rückruf zeigt, wie sie das SDK anweisen, auf die Benutzerbestätigung zu warten, bevor Abstürze gesendet werden:

Crashes.setListener({

    shouldAwaitUserConfirmation: function (report) {

        // Build your own UI to ask for user consent here. SDK doesn't provide one by default.

        // Return true if you built a UI for user consent and are waiting for user input on that custom UI, otherwise false.
        return true;
    },

    // Other callbacks must also be defined at the same time if used.
    // Default values are used if a method with return parameter isn't defined.
});

Wenn Sie zurückgeben true, muss Ihre App (unter Verwendung Ihres eigenen Codes) die Berechtigung des Benutzers abrufen und das SDK mit dem Ergebnis mithilfe der folgenden API aktualisieren:

import Crashes, { UserConfirmation } from 'appcenter-crashes';

// Depending on the user's choice, call Crashes.notifyUserConfirmation() with the right value.
Crashes.notifyUserConfirmation(UserConfirmation.DONT_SEND);
Crashes.notifyUserConfirmation(UserConfirmation.SEND);
Crashes.notifyUserConfirmation(UserConfirmation.ALWAYS_SEND);

Hinweis

Um dieses Feature zu verwenden, konfigurieren Sie Ihre Anwendung ordnungsgemäß für den Absturzdienst. Das Feature hängt von Verarbeitungsabstürzen in JavaScript ab.

Abrufen von Informationen zum sendenden status für ein Absturzprotokoll

Manchmal möchten Sie die status Ihres App-Absturzes kennen. Ein häufiger Anwendungsfall ist, dass Sie möglicherweise eine Benutzeroberfläche anzeigen möchten, die den Benutzern mitteilt, dass Ihre App einen Absturzbericht übermittelt, oder, falls Ihre App nach dem Start schnell abstürzt, möchten Sie das Verhalten der App anpassen, um sicherzustellen, dass die Absturzprotokolle übermittelt werden können. App Center Crashes verfügt über drei verschiedene Rückrufe, die Sie in Ihrer App verwenden können, um über die Vorgänge benachrichtigt zu werden.

Definieren Sie hierzu einen Ereignislistener in Ihrem Code, wie im folgenden Beispiel gezeigt:

Crashes.setListener({
    onBeforeSending: function (report) {
        // called after Crashes.process and before sending the crash.
    },
    onSendingSucceeded: function (report) {
        // called when crash report sent successfully.
    },
    onSendingFailed: function (report) {
        // called when crash report couldn't be sent.
    }

    // Other callbacks must also be defined at the same time if used.
    // Default values are used if a method with return parameter isn't defined.
});

Alle Rückrufe sind optional. Sie müssen nicht alle 3 Methoden im Ereignislistenerobjekt bereitstellen. Sie können z. B. nur onBeforeSendingimplementieren.

Hinweis

Um dieses Feature verwenden zu können, müssen Sie Ihre Anwendung ordnungsgemäß für den Absturzdienst konfigurieren.

Dieses Feature hängt von Verarbeitungsabstürzen in JavaScript ab.

Hinweis

Wenn Crashes.setListener mehr als einmal aufgerufen wird, gewinnt der letzte. Er überschreibt Listener, die zuvor von festgelegt wurden Crashes.setListener.

Der onSendingFailed Empfang bedeutet einen nicht wiederherstellbaren Fehler, z. B. ein 4xx-Code . Beispielsweise bedeutet 401, dass falsch appSecret ist.

Dieser Rückruf wird nicht ausgelöst, wenn es sich um ein Netzwerkproblem handelt. In diesem Fall versucht das SDK immer wieder (und hält auch Wiederholungen an, während die Netzwerkverbindung unterbrochen ist). Falls Netzwerkprobleme oder ein Ausfall auf dem Endpunkt auftreten und Sie die App neu starten, onBeforeSending wird nach dem Neustart des Prozesses erneut ausgelöst.

Hinzufügen von Anlagen zu einem Absturzbericht

Sie können Binär- und Textanlagen zu einem Absturzbericht hinzufügen. Das SDK sendet sie zusammen mit dem Absturz, sodass Sie sie im App Center-Portal sehen können. Der folgende Rückruf wird direkt vor dem Senden des gespeicherten Absturzes von früheren Anwendungsstarts aufgerufen. Es wird nicht aufgerufen, wenn der Absturz auftritt. Stellen Sie sicher, dass die Anlagedatei nicht benannt minidump.dmp ist, da dieser Name für Minidump-Dateien reserviert ist. Hier sehen Sie ein Beispiel für das Anfügen von Text und einem Bild an einen Absturz:

import Crashes, { ErrorAttachmentLog } from 'appcenter-crashes';

Crashes.setListener({
    getErrorAttachments(report) {
        const textAttachment = ErrorAttachmentLog.attachmentWithText('Hello text attachment!', 'hello.txt');
        const binaryAttachment = ErrorAttachmentLog.attachmentWithBinary(`${imageAsBase64string}`, 'logo.png', 'image/png');
        return [textAttachment, binaryAttachment];
    }

    // Other callbacks must also be defined at the same time if used.
    // Default values are used if a method with return parameter isn't defined.
});

Der fileName Parameter ist optional (kann nullsein) und wird nur im App Center-Portal verwendet. Bei einem bestimmten Absturzereignis im Portal können Sie Anlagen anzeigen und herunterladen. Wenn Sie einen Dateinamen angegeben haben, ist dies der Dateiname, der heruntergeladen werden soll, andernfalls wird der Dateiname für Sie generiert.

Um den getErrorAttachments Rückruf so einzurichten, dass er mit Async/await-Funktionen von ES2017 funktioniert, geben Sie stattdessen eine erfüllte Zusage zurück. Im folgenden Beispiel werden ein Text und ein Bild asynchron an einen Absturz angefügt:

import Crashes, { ErrorAttachmentLog } from 'appcenter-crashes';

Crashes.setListener({
    getErrorAttachments(report) {
        return (async () => {
            const textContent = await readTextFileAsync(); // use your async function to read text file
            const binaryContent = await readBinaryFileAsync(); // use your async function to read binary file
            const textAttachment = ErrorAttachmentLog.attachmentWithText(textContent, 'hello.txt');
            const binaryAttachment = ErrorAttachmentLog.attachmentWithBinary(binaryContent, 'logo.png', 'image/png');
            return [textAttachment, binaryAttachment];
        })();
    }

    // Other callbacks must also be defined at the same time if used.
    // Default values are used if a method with return parameter isn't defined.
});

Hinweis

Um dieses Feature verwenden zu können, müssen Sie Ihre Anwendung ordnungsgemäß für den Absturzdienst konfigurieren.

Dieses Feature hängt von Verarbeitungsabstürzen in JavaScript ab.

Hinweis

Die Größenbeschränkung beträgt derzeit 1,4 MB unter Android und 7 MB unter iOS. Beim Versuch, eine größere Anlage zu senden, wird ein Fehler ausgelöst.

Behandelte Fehler

Mit App Center können Sie auch Fehler mithilfe von behandelten Ausnahmen über trackError die -Methode nachverfolgen. Eine App kann optional Eigenschaften oder/und Anlagen an einen behandelten Fehlerbericht anfügen, um weiteren Kontext bereitzustellen.

try {
    // Throw error.
} catch (error) {

    // Prepare properties.
    const properties = { 'Category' : 'Music', 'Wifi' : 'On' };

    // Prepare attachments.
    const textAttachment = ErrorAttachmentLog.attachmentWithText('Hello text attachment!', 'hello.txt');
    const attachments = [textAttachment];

    // Create an exception model from error.
    const exceptionModel1 = ExceptionModel.createFromError(error);

    // ..or generate with your own error data.
    const exceptionModel2 = ExceptionModel.createFromTypeAndMessage("type", "message", "stacktrace");

    // Track error with custom data.
    Crashes.trackError(exceptionModel1, properties, attachments);
    Crashes.trackError(exceptionModel1, properties, nil);
    Crashes.trackError(exceptionModel2, nil, attachments);
    Crashes.trackError(exceptionModel2, nil, nil);
}

Breakpad

App Center unterstützt Breakpadabstürze von Android NDK in einem React Native Apps.

Führen Sie die oben beschriebenen normalen Setupschritte aus, und fügen Sie MainActivity.javaOnCreate die Minidumpkonfiguration hinzu, und rufen Sie in Ihren nativen Code auf, der Ihre Breakpadkonfiguration einrichtet.

Beispiel:

  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Crashes.getMinidumpDirectory().thenAccept(new AppCenterConsumer<String>() {
      @Override
      public void accept(String path) {
        // Path is null when Crashes is disabled.
        if (path != null) {
          // links to NDK
          setupBreakpadListener(path);
        }
      }
    });
  }

Aktivieren oder Deaktivieren von App Center-Abstürze zur Laufzeit

Sie können App Center-Abstürze zur Laufzeit aktivieren und deaktivieren. Wenn Sie sie deaktivieren, erstellt das SDK keine Absturzberichte für die App.

await Crashes.setEnabled(false);

Um App Center-Abstürze erneut zu aktivieren, verwenden Sie dieselbe API, übergeben true Sie jedoch als Parameter.

await Crashes.setEnabled(true);

Der Zustand wird über Anwendungsstarts hinweg im Speicher des Geräts beibehalten.

Überprüfen, ob App Center-Abstürze aktiviert ist

Sie können auch überprüfen, ob App Center-Abstürze aktiviert ist oder nicht:

const enabled = await Crashes.isEnabled();