App Center Xamarin (崩溃)
App Center崩溃将每次应用崩溃时自动生成崩溃日志。 日志首先写入设备的存储,当用户再次启动应用时,故障报告将发送到App Center。 收集崩溃适用于 beta 应用和实时应用,即提交到 App Store。 故障日志包含有助于修复故障的有用信息。
如果 入门 尚未在应用程序中设置 SDK,请遵循以下部分。
此外,iOS 上的崩溃日志需要符号化,请查看App Center 诊断 文档,其中介绍了如何为应用提供符号。
备注
在 Xamarin.iOS 和 Xamarin.Mac 上,如果附加了调试器,SDK 不会保存任何崩溃日志。 请确保在 iOS 和 macOS 应用崩溃时未附加调试器。 在 Xamarin.Android 上,可以在附加调试器时崩溃,但在中断未处理异常后需要继续执行。
生成测试崩溃
App Center故障提供了一个 API,用于生成测试崩溃,方便测试 SDK。 此 API 检查调试配置与发布配置。 因此,只能在调试时使用它,因为它对发布应用不起作用。
Crashes.GenerateTestCrash();
获取有关上一次崩溃的信息
App Center崩溃有两个 API,在应用崩溃时提供详细信息。
应用在上一会话中是否收到内存不足警告?
启动 SDK 后,你随时都可以检查应用在上一会话中是否收到内存警告:
bool hadMemoryWarning = await Crashes.HasReceivedMemoryWarningInLastSessionAsync();
备注
此方法只能在启动后 Crashes 使用,它始终在启动 false 之前返回。
备注
在某些情况下,内存不足的设备无法发送事件。
应用在上一会话中崩溃吗?
启动 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 之前和时执行其他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. 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;
};
如果返回上述回调,则应用必须使用自己的代码 (用户权限获取) ,然后通过以下 API 向 SDK 发送消息并 true 返回结果。
// 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 一致。
状态在应用程序启动时一直保留于设备的存储中。
备注
此方法只能在启动后 Crashes 使用。
检查App Center崩溃是否已启用
还可以检查是否App Center崩溃:
bool isEnabled = await Crashes.IsEnabledAsync();
备注
此方法只能在启动后 Crashes 使用,它始终在启动 false 之前返回。
已处理的错误
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);
}