Сбои Центра приложений (React Native)

Важно!

Прекращение поддержки Центра приложений Visual Studio запланировано на 31 марта 2025 г. Хотя вы можете продолжать использовать Центр приложений Visual Studio, пока он не будет полностью выведен из эксплуатации, существует несколько рекомендуемых вариантов, на которые вы можете рассмотреть возможность миграции.

Узнайте больше о сроках поддержки и альтернативных вариантах.

Сбои Центра приложений автоматически создают журнал сбоев при каждом сбое приложения. Журнал сначала записывается в хранилище устройства, и когда пользователь снова запустит приложение, отчет о сбоях будет отправлен в Центр приложений. Сбор сбоев работает как для бета-, так и для динамических приложений, т. е. тех, которые отправлены в Google Play. Журналы сбоев содержат ценные сведения, которые помогут устранить сбои.

Если вы еще не настроили пакет SDK в приложении, следуйте инструкциям в разделе начало работы.

Где бы вы ни использовали сбои Центра приложений, добавьте следующий импорт в начало файла.

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

Создание тестового сбоя

Сбои Центра приложений предоставляют API для создания тестового сбоя для простого тестирования пакета SDK. Этот API можно использовать только в тестовых или бета-версиях приложений и не будет выполнять никаких действий в рабочих приложениях.

Crashes.generateTestCrash();

Кроме того, можно легко создать сбой JavaScript. Добавьте в код следующую строку, которая вызывает ошибку JavaScript и вызывает сбой.

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

Совет

Чтобы этот сбой был отправлен в Центр приложений, приложение React Native должно быть скомпилировано в режиме выпуска.

Примечание

В настоящее время Центр приложений не поддерживает карты источников для отмены трассировок стека JavaScript для приложений Android React Native.

Примечание

Рекомендуется избегать оператора JavaScript throw со строковым значением (например, throw 'message'), так как React Native не сохраняет полный стек JavaScript в этом сценарии. Вместо этого— throw JavaScript Error (например, throw Error('message')).

Дополнительные сведения о предыдущем сбое

При сбоях центра приложений есть два API, которые предоставляют дополнительные сведения на случай сбоя приложения.

Приложение получило предупреждение о нехватке памяти в предыдущем сеансе?

В любой момент после запуска пакета SDK можно проверка, если приложение получило предупреждение о памяти в предыдущем сеансе:

const hadLowMemoryWarning = await Crashes.hasReceivedMemoryWarningInLastSession();

Примечание

В некоторых случаях устройство с недостаточным объемом памяти может не отправлять события.

Произошел сбой приложения в предыдущем сеансе?

В любой момент после запуска пакета SDK можно проверка, если приложение не произошло при предыдущем запуске:

const didCrash = await Crashes.hasCrashedInLastSession();

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

Сведения о последнем сбое

Если приложение ранее завершалось сбоем, вы можете получить сведения о последнем сбое.

const crashReport = await Crashes.lastSessionCrashReport();

Настройка использования сбоев Центра приложений

Сбои Центра приложений предоставляют разработчикам обратные вызовы для выполнения дополнительных действий до и при отправке журналов сбоев в Центр приложений.

Сбои обработки в JavaScript

Чтобы методы Crash.setListener работали должным образом, необходимо проверка, правильно ли настроено приложение.

  1. Откройте файл проекта ios/YourAppName/AppDelegate.m и убедитесь, что вместо у вас есть [AppCenterReactNativeCrashes register];[AppCenterReactNativeCrashes registerWithAutomaticProcessing];.
  2. Откройте файл проекта android/app/src/main/res/values/strings.xml и убедитесь, что appCenterCrashes_whenToSendCrashes для задано значение ASK_JAVASCRIPT.

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

Следует ли обрабатывать сбой?

Реализуйте этот обратный вызов, если вы хотите решить, нужно ли обрабатывать конкретный сбой. Например, может произойти сбой на уровне системы, который вы хотите игнорировать и не хотите отправлять в Центр приложений.

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

Примечание

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

Эта функция зависит от сбоев обработки в JavaScript.

Если конфиденциальность пользователей важна для вас, вы должны получить подтверждение пользователя перед отправкой отчета о сбоях в Центр приложений. Пакет SDK предоставляет обратный вызов, который сообщает о сбоях Центра приложений о том, что ожидает подтверждения пользователя перед отправкой отчетов о сбоях.

Если вы решили сделать это, вы несете ответственность за получение подтверждения пользователя, например с помощью диалогового запроса с одним из следующих вариантов: Всегда отправлять, отправлять и не отправлять. В зависимости от входных данных вы сообщите Центру приложений, что делать, а затем будет обработано соответствующим образом.

Примечание

Пакет SDK не отображает диалоговое окно для этого, приложение должно предоставить собственный пользовательский интерфейс, чтобы запросить согласие пользователя.

В следующем обратном вызове показано, как сообщить пакету SDK о необходимости дождаться подтверждения пользователя перед отправкой сбоев:

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

Если вы возвращаете trueзначение , приложение должно получить (с помощью собственного кода) разрешение пользователя и обновить пакет SDK с помощью следующего API:

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

Примечание

Чтобы использовать эту функцию, настройте приложение правильно для службы аварийного завершения работы. Эта функция зависит от сбоев обработки в JavaScript.

Получение сведений о состоянии отправки для журнала сбоев

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

Для этого определите прослушиватель событий в коде, как показано в следующем примере:

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

Все обратные вызовы являются необязательными. Вам не нужно предоставлять все три метода в объекте прослушивателя событий, например можно реализовать только onBeforeSending.

Примечание

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

Эта функция зависит от сбоев обработки в JavaScript.

Примечание

Если Crashes.setListener вызывается несколько раз, побеждает последний; он переопределяет прослушиватели, ранее заданные .Crashes.setListener

Получение onSendingFailed означает, что произошла невосстановимая ошибка, например код 4xx . Например, 401 означает, что appSecret неправильно.

Этот обратный вызов не активируется, если это проблема с сетью. В этом случае пакет SDK продолжает повторять попытки (а также приостанавливает повторные попытки, пока сетевое подключение не работает). Если у нас возникли проблемы с сетью или сбой в конечной точке и вы перезапустили приложение, onBeforeSending активируется снова после перезапуска процесса.

Добавление вложений в отчет о сбое

В отчет о сбоях можно добавлять двоичные и текстовые вложения. Пакет SDK отправит их вместе с аварийным завершением, чтобы их можно было увидеть на портале Центра приложений. Следующий обратный вызов вызывается непосредственно перед отправкой сохраненного сбоя из предыдущих запусков приложения. Он не будет вызываться при сбое. Убедитесь, что файл вложения не называется minidump.dmp , так как это имя зарезервировано для файлов minidump. Ниже приведен пример вложения текста и изображения в сбой:

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

Параметр fileName является необязательным (может быть null) и используется только на портале Центра приложений. В конкретном случае сбоя на портале можно просмотреть вложения и скачать их. Если вы указали имя файла, оно будет именем файла для скачивания, в противном случае будет создано имя файла.

Чтобы настроить обратный getErrorAttachments вызов для работы с асинхронными и ожидающих функциями ES2017, верните выполненное обещание. В следующем примере текст и изображение присоединяется к аварийному завершению в асинхронном режиме:

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

Примечание

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

Эта функция зависит от сбоев обработки в JavaScript.

Примечание

В настоящее время максимальный размер составляет 1,4 МБ для Android и 7 МБ для iOS. Попытка отправить вложение большего размера вызовет ошибку.

Обработано ошибок

Центр приложений также позволяет отслеживать ошибки с помощью обрабатываемых исключений с помощью trackError метода . При необходимости приложение может присоединять свойства или (и) вложения к обработанной ошибке, чтобы предоставить дополнительный контекст.

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

Брейк-панель

Центр приложений поддерживает аварийное завершение работы из Android NDK в React Native приложениях.

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

Пример

  @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);
        }
      }
    });
  }

Включение или отключение сбоев Центра приложений во время выполнения

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

await Crashes.setEnabled(false);

Чтобы снова включить сбои центра приложений, используйте тот же API, но передайте true в качестве параметра.

await Crashes.setEnabled(true);

Состояние сохраняется в хранилище устройства при запуске приложений.

Проверьте, включен ли сбой центра приложений

Вы также можете проверка, включены ли сбои Центра приложений:

const enabled = await Crashes.isEnabled();