Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Это важно
Центр приложений Visual Studio был прекращен 31 марта 2025 г., за исключением функций аналитики и диагностики, которые будут поддерживаться до 30 июня 2026 г. Подробнее.
Центр приложений Crashes автоматически создаёт журнал сбоев при каждом сбое вашего приложения. Журнал сначала записывается в хранилище устройства, и когда пользователь снова запускает приложение, отчет о сбоях будет отправлен в Центр приложений. Сбор сбоев работает как для бета-, так и для динамических приложений, т. е. отправленных в Google Play. Журналы сбоев содержат ценные сведения, которые помогут устранить сбой.
Если вы еще не настроили пакет SDK в приложении, следуйте разделу "Начало работы ".
Когда вы используете App Center Crashes, добавьте следующий импорт в начало файла.
// Import App Center Crashes at the top of the file.
import Crashes from 'appcenter-crashes';
Создание тестового сбоя
App Center 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' в этом сценарии. Вместо этого throw JavaScript Error (например: throw Error('message')).
Дополнительные сведения о предыдущем сбое
App Center Crashes предоставляет два API, которые дают вам больше информации в случае сбоя вашего приложения.
Приложение получило предупреждение о низкой памяти в предыдущем сеансе?
В любое время после запуска пакета SDK можно проверить, получено ли приложение предупреждение о памяти в предыдущем сеансе:
const hadLowMemoryWarning = await Crashes.hasReceivedMemoryWarningInLastSession();
Замечание
В некоторых случаях устройство с низкой памятью может не отправлять события.
Произошел сбой приложения в предыдущем сеансе?
В любое время после запуска пакета SDK можно проверить, произошло ли сбой приложения в предыдущем запуске:
const didCrash = await Crashes.hasCrashedInLastSession();
Это удобно, если вы хотите настроить поведение или пользовательский интерфейс приложения после сбоя. Некоторые разработчики решили отобразить дополнительный интерфейс, чтобы извиниться перед своими пользователями, или хотят наладить связь после сбоя.
Сведения о последнем сбое
Если ваше приложение завершилось сбоем, вы можете получить детали о последнем сбое.
const crashReport = await Crashes.lastSessionCrashReport();
Настройте использование функций сбоев в Центре приложений
Сервис сбоев App Center предоставляет обратные вызовы для разработчиков, позволяющие выполнять дополнительные действия перед отправкой журналов сбоев в App Center.
Сбои обработки в JavaScript
Чтобы методы Crash.setListener работали должным образом, необходимо проверить правильность настройки приложения.
- Откройте файл проекта
ios/YourAppName/AppDelegate.mи убедитесь, что у вас[AppCenterReactNativeCrashes register];вместо[AppCenterReactNativeCrashes registerWithAutomaticProcessing];. - Откройте файл проекта
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 предоставляет обратный вызов, который сообщает Центру приложений Crashes ожидать подтверждения от пользователя перед отправкой отчетов о сбоях.
Если вы решили сделать это, вы несете ответственность за получение подтверждения пользователя, например с помощью диалогового окна с одним из следующих параметров: Always Send, Send и Don't send. На основе входных данных вы сообщите App Center Crashes, что делать, и аварийное завершение работы будет обрабатываться соответствующим образом.
Замечание
Пакет 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);
Замечание
Чтобы использовать эту функцию, настройте ваше приложение должным образом для службы Crash. Эта функция зависит от сбоя обработки в JavaScript.
Получите информацию о статусе отправки для журнала сбоев
Иногда необходимо знать состояние сбоя приложения. Распространенный вариант использования заключается в том, что может потребоваться показать пользовательский интерфейс, который сообщает пользователям, что ваше приложение отправляет отчет о сбоях или, если ваше приложение завершает работу быстро после запуска, необходимо настроить поведение приложения, чтобы убедиться, что журналы сбоев можно отправить. Центр приложений (App Center) Crashes предоставляет три различных обратных вызова, которые вы можете использовать в своем приложении, чтобы быть уведомленным о происходящем.
Для этого определите прослушиватель событий в коде, как показано в следующем примере:
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.
});
Все обратные вызовы являются необязательными. Вам не нужно предоставлять все 3 метода в объекте прослушивателя событий, например реализовать только onBeforeSending.
Замечание
Чтобы использовать эту функцию, необходимо правильно настроить приложение для службы аварийной обработки.
Эта функция зависит от сбоев обработки в JavaScript.
Замечание
Если Crashes.setListener вызывается несколько раз, последний вызов имеет преимущество, он заменяет ранее установленных слушателей Crashes.setListener.
Получение onSendingFailed означает, что произошла невосстановимая ошибка, например код 4xx . Например, 401 означает, что appSecret это неправильно.
Этот обратный вызов не активируется, если это проблема с сетью. В этом случае пакет SDK продолжает повторную попытку (а также приостанавливает повторные попытки при отключении сетевого подключения). Если у нас возникли проблемы с сетью или сбой в конечной точке, и вы перезапустите приложение, onBeforeSending активируется снова после перезапуска процесса.
Добавление вложений в отчет о сбое
Двоичные и текстовые вложения можно добавить в отчет о сбое. Пакет SDK отправит их вместе с сбоем, чтобы их можно было увидеть на портале Центра приложений. Следующий обратный вызов вызывается прямо перед отправкой сохраненного сбоя из предыдущих запусков приложения. Он не будет вызываться, когда произойдет сбой. Убедитесь, что файл вложения не называется minidump.dmp, поскольку это имя зарезервировано для минидампов. Вот пример того, как прикрепить текст и изображение к отчету о сбое:
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 вызов для работы с функциями async/await 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);
}
Breakpad
App Center поддерживает сбои Breakpad из Android NDK в приложениях React Native.
Выполните описанные выше обычные действия по настройке, а затем в MainActivity.java переопределите OnCreate, добавьте конфигурацию minidump и вызовите ваш собственный код, который настраивает конфигурацию Breakpad.
Пример:
@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);
}
}
});
}
Включение или отключение сбоев Центра приложений во время выполнения
Вы можете включать и отключать App Center Crashes в процессе работы. Если отключить его, пакет SDK не будет выполнять отчеты о сбоях для приложения.
await Crashes.setEnabled(false);
Чтобы снова включить аварийное завершение работы Центра приложений, используйте тот же API, но передайте true его в качестве параметра.
await Crashes.setEnabled(true);
Состояние сохраняется в хранилище устройства во время запуска приложения.
Проверка включения аварийного сбоя Центра приложений
Кроме того, можно проверить, включена ли функция отслеживания сбоев в Центре приложений.
const enabled = await Crashes.isEnabled();