[WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题
1. 什么是AppCenter#
Visual Studio App Center 是几个常见移动开发和云集成服务(如持续集成、持续交付和自动 UI 测试等服务)的集合。 这些 App Center 服务可以针对 iOS、Android、WPF/Winforms、通用 Windows 平台 (UWP) 和 tvOS 应用运行。
App Center 服务使开发人员可以轻松地生成、测试和分发应用程序。 应用由测试人员或客户使用之后,App Center 会提供服务来监视其应用的使用情况和问题。
作为一个桌面软件开发人员我很关心软件的使用情况,但又偏偏很难获取这些内容,App Center 的诊断和分析功能正好满足我的需求,而且这两个功能可以免费使用且十分简单易用。这篇文章将重点介绍如何在 WPF 项目中使用这两个功能。
2. 先决条件#
- 你的项目面向的是 .NET Framework 4.6.1 (或更高版本) 或 .NET Core 3.0 (或更高) 版本。
- 仅当 WPF/WinForms 应用程序在 Windows 上运行时,才支持 .NET Core。
- 如果你使用的是可移植库中的 SDK,则它必须面向 .NET standard 1.0 或更高版本, (不支持 PCL) 。
3. 快速入门#
首先需要在 App Center 上创建一个应用:
- 登录到 Visual Stuido App Center。
- 在页面的右上角单击 Add New,然后在下拉列表中选择 Add new app。
- 在如下图所示的表单中输入应用名称,然后选择 Windows、Wpf
- 点击 Add new app 创建应用。
应用被创建后进入 Overview 页面,在这里可以找到 App Center 的入门指南,如下图所示:
上面打了马赛克的这段字符是 app secret,每个应用有唯一的 app secret。
在 Nuget 安装 Microsoft.AppCenter.Analytics
和 Microsoft.AppCenter.Crashes
两个包。复制上面这段代码到 App.xaml.cs 的 OnStartup
函数里:
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
base.OnStartup(e);
AppCenter.Start("******3c-aa79-44d5-94ae-b00e229876b8", typeof(Analytics), typeof(Crashes));
}
}
}
完成上述步骤后重启应用,应用的运行情况将开始自动发送到 App Center,你可以在 Diagnostics (诊断)和 Analytics (分析)页面看到这些数据。
4. 诊断#
诊断页面中的数据分成两个部分:Crash(崩溃)和 Error(错误)。其中 Crash 由 App Center SDK 自动发送。在使用 App Center SDK,并且应用遇到导致应用崩溃的错误时,详细信息会在应用关闭之前写入本地存储。 由于应用遇到了意外错误,因此应用所处的状态不太可靠,不足以将数据发送到 App Center。 但是,当用户再次启动应用时,它会将诊断数据发送到 App Center。
而 Error 则由用户调用 Crashes.TrackError
函数主动发送。
每一个数据都可以看到详细的错误信息,Stack traces,报告时间,同一类数据的 Most affected devices 和 Most affected OS,以及每一个错误报告的更具体的信息,如果有使用自定义事件,还可以在 EVENTS 标签页中看到 Crash 发生前发生过的事件,以便确定 Crash 发生的原因。
5. 分析#
一旦启用了 App Center SDK,App Center 将自动收集用户的关键指标,包括用户计数、趋势、设备、位置、活动时间、国家、语言、版本等。可以在 analytics/overview
查看这些信息。
还可以使用 App Center SDK 发送 Analytics.TrackEvent
函数发送自定义事件。事件可帮助你识别应用程序崩溃的根本原因。 作为 App Center 崩溃服务的一部分,你可以查看在特定会话崩溃之前发生的所有事件。
6. 主动发送数据#
一般情况下 App Center Sdk 会自动收集 这些数据,除此之外还可以使用 Analytics.TrackEvent
跟踪自定义事件。
Analytics.TrackEvent("Video clicked");
也可以在这个函数中的 properties
附加一个 Dictionary:
Analytics.TrackEvent("Video clicked", new Dictionary<string, string> {
{ "Category", "Music" },
{ "FileName", "favorite.avi"}
});
TrackEvent
有一些限制,它最多支持200个不同的事件名称。每个名称最多支持256个字符,properties
中每个 key 和 value 的限制都为125个字符,超过的部分将被截断。
对于已处理的 Exception,可以使用 Crashes.TrackError
跟踪错误:
try {
// your code goes here.
} catch (Exception exception) {
var properties = new Dictionary<string, string>
{
{ "Category", "Music" },
{ "Wifi", "On"}
};
Crashes.TrackError(exception, properties);
}
它的用法和 Analytics.TrackEvent
类似。虽然官方文档没写,但字符串的长度限制应该和 Analytics.TrackEvent
一样。另外它还支持发送文件和文本作为附件:
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);
}
附件的大小限制为 7 MB,尝试发送更多的附件将触发错误。
7. 处理 Crash#
前面提到,崩溃时记录的数据将再重启应用时发送到 App Center。这时候我们可以对这些崩溃的信息做些操作。
Crashes.HasCrashedInLastSessionAsync
用于检查应用是否再上一次启动时崩溃,Crashes.GetLastSessionCrashReportAsync
用于获取上次崩溃的详细信息。
bool didAppCrash = await Crashes.HasCrashedInLastSessionAsync();
ErrorReport crashReport = await Crashes.GetLastSessionCrashReportAsync();
如果你觉得有些崩溃不需要发送到 App Center,可以在 ShouldProcessErrorReport
回调中返回 false。
Crashes.ShouldProcessErrorReport = (ErrorReport report) =>
{
// Check the report in here and return true or false depending on the ErrorReport.
return true;
};
如果需要发送更详细的崩溃报告,可以使用 GetErrorAttachments
回调添加附件,这个附件将联通 Crash 数据一起发送。
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")
};
};
如果想在发送报告前弹个框问问用户要不要发送,可以在 ShouldAwaitUserConfirmation
回调中返回 true
并构建 UI,然后用 Crashes.NotifyUserConfirmation
通知 SDK 发送消息:
Crashes.ShouldAwaitUserConfirmation = ConfirmationHandler;
private static bool ConfirmationHandler()
{
Current.Dispatcher.InvokeAsync(() =>
{
var dialog = new UserConfirmationDialog();
if (dialog.ShowDialog() ?? false)
{
Crashes.NotifyUserConfirmation(dialog.ClickResult);
}
});
return true;
}
8. 最后#
App Center 通过诊断和分析两个功能监视应用的实际情况,完善应用开发生命周期的最后一步,帮助开发人员构建更好的应用程序。更多的信息可以参考下面的链接:
Visual Studio 应用中心
Visual Studio 应用中心定价
Visual Studio 应用中心常见问题
Visual Studio App Center文档
App Center 简介 - Learn Microsoft Docs
microsoft/appcenter-sdk-dotnet: Development repository for the App Center SDK for .NET platforms, including Xamarin
作者:Dino.C
版权:本文采用「CC BY 4.0」知识共享许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?