UWP/WinUI (App Center 崩溃)
每次应用崩溃时,App Center 崩溃都将自动生成崩溃日志。 日志首先写入设备的存储,当用户再次启动应用时,系统会将故障报告发送到 App Center。 收集故障适用于 beta 应用和提交到 Windows 存储的应用。 崩溃日志包含有价值的信息,可帮助解决此故障。
App Center SDK 只收集未处理的 .NET 异常导致的故障。 当使用 C 或 c + + 时,它不会收集本机崩溃。 但是,如果应用程序的 c + + 发生故障,则可以通过 上传崩溃 API将其上传到 App Center。
如果尚未在应用程序中设置 SDK,请按照 入门 部分进行操作。
备注
目前,我们不支持检测 UWP/WinUI 平台上的内存不足警告。
添加崩溃模块
程序包管理器控制台
- 在Visual Studio中打开控制台。 为此,请选择 "工具" > NuGet 程序包管理器 > 程序包管理器 "控制台。
- 键入以下命令:
Install-Package Microsoft.AppCenter.Crashes
添加 using 语句
使用 Api 之前,请添加相应的命名空间。
using Microsoft.AppCenter.Crashes;
修改 Start() 方法
添加或编辑对应用程序的 构造函数 的以下调用以包含崩溃模块:
AppCenter.Start("{Your App Secret}", typeof(Crashes));
生成测试崩溃
App Center 崩溃将为你提供一个 API,用于生成测试崩溃以便轻松测试 SDK。 此 API 检查调试和发布配置。 因此,你只能在调试时使用它,因为它不适用于发布应用程序。
Crashes.GenerateTestCrash();
获取有关以前的故障的详细信息
App Center 崩溃具有两个 Api,可提供有关应用崩溃情况的详细信息。
应用在上一个会话中是否崩溃?
启动 SDK 之后,可以随时检查应用是否在上一次启动时崩溃:
bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();
如果你想要在发生崩溃后调整应用的行为或 UI,这会很方便。 某些开发人员选择向其用户显示额外的 UI,或者希望在发生崩溃后进行触摸。
备注
此方法只能在启动后使用, Crashes 它在开始之前将始终返回 false 。
有关最后一个崩溃的详细信息
如果你的应用此前崩溃,你可以获取有关最后一个崩溃的详细信息。
ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();
备注
此方法只能在启动后使用, Crashes 它在开始之前将始终返回 null 。
此 API 有很多用例,最常见的用例是调用此 API 并实现其自定义 崩溃委托或侦听器的用户。
自定义 App Center 崩溃的使用情况
App Center 崩溃为开发人员提供回调,以便在向 App Center 发送崩溃日志之前和时执行其他操作。
备注
在调用之前 设置回调 AppCenter.Start() ,因为 App Center 在启动后立即开始处理崩溃。
是否应处理崩溃?
如果需要确定是否需要处理特定的故障,请设置此回调。 例如,可能存在要忽略的系统级崩溃,并且不希望发送到 App Center。
Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
// Check the report in here and return true or false depending on the ErrorReport.
return true;
};
要求用户同意发送崩溃日志
如果用户隐私对你很重要,你可能想要在将故障报告发送到 App Center 之前获得用户确认。 SDK 公开了一个回调,该回调指示在发送任何崩溃报告之前,App Center 崩溃等待用户确认。
如果你选择这样做,你将负责获取用户的确认,例如通过使用以下选项之一的对话提示符: 始终发送、 发送 和 不发送。 基于输入,你会告诉 App Center 崩溃要执行的操作,然后将相应地处理崩溃。
备注
SDK 不显示此对话框,应用必须提供自己的 UI 来要求用户同意。
备注
NotifyUserConfirmation如果应用未实现用户确认对话框,则该应用不应显式调用; 崩溃模块将隐式处理发送日志。
以下回调演示了如何在发送故障之前通知 SDK 等待用户确认:
Crashes.ShouldAwaitUserConfirmation = () =>
{
// Build your own UI to ask for user consent here. The 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;
};
如果你在 true 上面的回调中返回,你的应用程序必须使用你自己的代码) 用户权限获取 (,并使用以下 API 通过该结果向 SDK 发送消息。
// Depending on the user's choice, call Crashes.NotifyUserConfirmation() with the right value.
Crashes.NotifyUserConfirmation(UserConfirmation.DontSend);
Crashes.NotifyUserConfirmation(UserConfirmation.Send);
Crashes.NotifyUserConfirmation(UserConfirmation.AlwaysSend);
获取有关崩溃日志的发送状态的信息
有时,您需要了解应用程序崩溃的状态。 常见的用例是,你可能希望显示 UI,告诉用户应用正在提交故障报告,或者,如果你的应用程序在启动后很快崩溃,你需要调整应用程序的行为,以确保能够提交故障日志。 App Center 崩溃提供三个不同的回调,你可以在应用中使用这些回调来通知你发生了什么情况:
在 SDK 发送崩溃日志之前,将调用以下回调
Crashes.SendingErrorReport += (sender, e) =>
{
// Your code, e.g. to present a custom UI.
};
如果在终结点上出现网络问题或中断,重新启动应用程序, SendingErrorReport 则会在进程重新启动后再次触发。
SDK 成功发送故障日志后将调用以下回调
Crashes.SentErrorReport += (sender, e) =>
{
// Your code, e.g. to hide the custom UI.
};
如果 SDK 未能发送崩溃日志,将调用以下回调
Crashes.FailedToSendErrorReport += (sender, e) =>
{
// Your code goes here.
};
接收 FailedToSendErrorReport 意味着出现错误,如发生 4xx 代码。 例如, 401 表示 appSecret 错误。
如果这是网络问题,则不会触发此回调。 在这种情况下,SDK 会继续重试 (,还会在网络连接关闭) 时暂停重试。
向崩溃报表添加附件
您可以向崩溃报表添加二进制和文本附件。 SDK 会将它们连同崩溃一起发送,以便您可以在 App Center 门户中查看它们。 在从以前的应用程序启动中发送存储的崩溃之前,将直接调用以下回调。 发生故障时,不会调用此方法。 请确保附件文件 未 命名 minidump.dmp ,因为该名称已保留用于小型转储文件。 下面的示例演示如何将文本和图像附加到崩溃:
Crashes.GetErrorAttachments = (ErrorReport report) =>
{
// Your code goes here.
return new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
};
备注
大小限制目前为 7 MB。 如果尝试发送更大的附件,则会触发错误。
在运行时启用或禁用 App Center 崩溃
可以在运行时启用和禁用 App Center 崩溃。 如果禁用该功能,SDK 将不会对应用执行任何崩溃报告。
Crashes.SetEnabledAsync(false);
若要使 App Center 再次崩溃,请使用相同的 API,但将 true 作为参数传递。
Crashes.SetEnabledAsync(true);
不需要等待此调用来进行其他 API 调用 (如 IsEnabledAsync) 一致。
在应用程序启动期间,状态将保留在设备的存储中。
检查是否已启用 App Center 崩溃
还可以检查是否已启用 App Center 崩溃:
bool isEnabled = await Crashes.IsEnabledAsync();
处理的错误
App Center 还允许使用已处理的异常跟踪错误。 为此,请使用 TrackError 方法:
try {
// your code goes here.
} catch (Exception exception) {
Crashes.TrackError(exception);
}
应用可以选择将属性附加到已处理的错误报告,以提供更多上下文。 将属性作为键/值对的字典传递 (仅) 的字符串,如下面的示例中所示。
try {
// your code goes here.
} catch (Exception exception) {
var properties = new Dictionary<string, string>
{
{ "Category", "Music" },
{ "Wifi", "On"}
};
Crashes.TrackError(exception, properties);
}
您还可以选择向已处理的错误报告中添加二进制文件和文本附件。 将附件作为对象的数组传递 ErrorAttachmentLog ,如以下示例中所示。
try {
// your code goes here.
} catch (Exception exception) {
var attachments = new ErrorAttachmentLog[]
{
ErrorAttachmentLog.AttachmentWithText("Hello world!", "hello.txt"),
ErrorAttachmentLog.AttachmentWithBinary(Encoding.UTF8.GetBytes("Fake image"), "fake_image.jpeg", "image/jpeg")
};
Crashes.TrackError(exception, attachments: attachments);
}