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 上创建一个应用:

  1. 登录到 Visual Stuido App Center
  2. 在页面的右上角单击 Add New,然后在下拉列表中选择 Add new app
  3. 在如下图所示的表单中输入应用名称,然后选择 WindowsWpf
  4. 点击 Add new app 创建应用。

应用被创建后进入 Overview 页面,在这里可以找到 App Center 的入门指南,如下图所示:

上面打了马赛克的这段字符是 app secret,每个应用有唯一的 app secret。

在 Nuget 安装 Microsoft.AppCenter.AnalyticsMicrosoft.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-b00e229876b8t", 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

[WPF] 使用 Visual Studio App Center 持续监视应用使用情况和问题的更多相关文章

  1. Visual Studio App Center 中的 Bug 跟踪服务

    我在之前的一篇文章 <使用 Visual Studio App Center 持续监视应用使用情况和问题> 中介绍了 App Center 的基本功能及使用入门,其中 诊断 可以自动手机用 ...

  2. 走进 Visual Studio Mobile Center for Xamarin.Forms

    前几篇分别介绍了 Xamarin.Forms 的 MVVM 的 Prism,UITest,Nuint Test,那这样算下来,代码部分基本结构都有了(逻辑就先忽略吧) 那接下来就应该是自动 Build ...

  3. 使用Visual Studio Team Services持续集成(四)——使用构建运行测试

    使用Visual Studio Team Services持续集成(四)--使用构建运行测试 使用构建来运行测试来验证集成是一个很好的实践. MyHealth.API.IntegrationTests ...

  4. 使用Visual Studio Team Services持续集成(三)——使用工件

    使用Visual Studio Team Services持续集成(三)--使用工件 工件是应用程序的可部署组件.Visual Studio Team Services有能力在构建过程中显式地管理工件 ...

  5. 使用Visual Studio Team Services持续集成(二)——为构建定义属性

    使用Visual Studio Team Services持续集成(二)--为构建定义属性 1.从VSTS帐户进入到Build 2.编辑构建定义并单击Options Description:如果这里明 ...

  6. 使用Visual Studio Team Services持续集成(一)——构建ASP.NET Core

    使用Visual Studio Team Services持续集成(一)--构建ASP.NET Core 概述 持续集成(CI)是将代码尽可能频繁地集成到共享仓库中的过程.在代码集成期间,构建中断或测 ...

  7. Visual Studio Team Services持续集成到Github仓库

    Devops如何用VSTS持续集成到Github仓库!   工欲善其事,必先利其器.在开始正式的教程之前我们先来聊聊准备工作. 管理工具会VSTS. 代码管理会用GITHUB. 服务器会用Azure. ...

  8. Visual Studio断点调试, 无法监视变量, 提示无法计算表达式

    在使用Visual Studio 2012进行断点调试时,对某个变量添加监视,出现"无法计算表达式"的提示. 解决办法:依次点击菜单栏中的"调试"→" ...

  9. Visual Studio 调试系列6 监视变量(使用监视窗口和快速监视窗口)

    系列目录     [已更新最新开发文章,点击查看详细] 当你进行调试时,可以使用 监视窗口 和 快速监视窗口 来监视变量和表达式. 仅在调试会话期间,这两个窗口才可用. 监视窗口可以在调试时一次显示多 ...

随机推荐

  1. Django(51)drf渲染模块源码分析

    前言 渲染模块的原理和解析模块是一样,drf默认的渲染有2种方式,一种是json格式,另一种是模板方式. 渲染模块源码入口 入口:APIView类中dispatch方法中的:self.response ...

  2. 视觉SLAM技术应用

    视觉SLAM技术应用 SLAM技术背景 SLAM技术全称Simultaneous localization and mapping,中文为"同时定位与地图构建".SLAM可以在未知 ...

  3. GPU上的基本线性代数

    GPU上的基本线性代数 cuBLAS库提供了基本线性代数子例程(BLAS)的GPU加速实现.cuBLAS通过针对NVIDIA GPU进行了高度优化的嵌入式行业标准BLAS API来加速AI和HPC应用 ...

  4. 记 Ant Designer Vue 2.0.1 layout 丢失样式类名问题分析

    现象 <a-layout-sider /> 渲染到页面上会变成 <section class="undefined-has-sider"> 丢失了 layo ...

  5. 手把手教你彻底理解MySQL的explain关键字

    数据库是程序员必备的一项基本技能,基本每次面试必问.对于刚出校门的程序员,你只要学会如何使用就行了,但越往后工作越发现,仅仅会写sql语句是万万不行的.写出的sql,如果性能不好,达不到要求,可能会阻 ...

  6. Java并发:乐观锁

    作者:汤圆 个人博客:javalover.cc 简介 悲观锁和乐观锁都属于比较抽象的概念: 我们可以用拟人的手法来想象一下: 悲观锁:像有些人,凡事都往坏的想,做最坏的打算:在java中就表现为,总是 ...

  7. .Net Core with 微服务 - Seq 日志聚合

    上一次我们介绍并演示了如果使用 Consul 做为我们微服务的注册中心,来实现服务的注册与发现.那么本次我们讲会演示如何做日志聚合.日志聚合比较常用的有 ELK 等,但是这次我想要介绍的是一款比较小众 ...

  8. Netty 框架学习 —— 编解码器框架

    编解码器 每个网络应用程序都必须定义如何解析在两个节点之间来回传输的原始字节,以及如何将其和目标应用程序的数据格式做相互转换.这种转换逻辑由编解码器处理,编解码器由编码器和解码器组成,它们每种都可以将 ...

  9. 基于ABP落地领域驱动设计-04.领域服务和应用服务的最佳实践和原则

    目录 系列文章 领域服务 应用服务 学习帮助 系列文章 基于ABP落地领域驱动设计-00.目录和前言 基于ABP落地领域驱动设计-01.全景图 基于ABP落地领域驱动设计-02.聚合和聚合根的最佳实践 ...

  10. 番外篇:使用nssm工具将ES、Kibana、Logstash或者其他.bat文件部署为Windows后台服务的方法

    使用NSSM工具安装bat文件为Windows服务 nssm是一个可以把bat批处理文件部署为Windows服务的小工具.例如很多.net项目可能还是在Windows服务器上面跑的,但是很多组件只提供 ...