App Center (Cordova) 崩溃

重要

Visual Studio App Center 计划于 2025 年 3 月 31 日停用。 虽然可以继续使用 Visual Studio App Center,直到它完全停用,但你可以考虑迁移到几个建议的替代方法。

详细了解支持时间线和替代方法。

注意

对 Cordova Apps 的支持已于 2022 年 4 月结束。 有关详细信息,请参阅 App Center 博客

每次应用崩溃时,App Center 崩溃都会自动生成崩溃日志。 日志首先写入设备的存储,当用户再次启动应用时,故障报告将发送到 App Center。 收集崩溃适用于 beta 应用和实时应用,即提交到App Store的应用。 故障日志包含有助于修复崩溃的重要信息。

如果尚未在应用程序中设置 SDK,请按照入门部分进行操作。

生成测试崩溃

App Center 崩溃提供了一个 API,用于生成测试崩溃,以便轻松测试 SDK。 此 API 只能在测试/beta 应用中使用,不会在生产应用中执行任何操作。

AppCenter.Crashes.generateTestCrash();

注意

需要在发布模式下编译 Cordova 应用,才能将此崩溃发送到 App Center。

获取有关上一次故障的详细信息

App Center 崩溃有两个 API,可在应用崩溃时为你提供详细信息。

应用在上一个会话中是否收到内存不足警告?

启动 SDK 后,可以随时检查应用是否在上一个会话中收到内存警告:

var success = function(hadLowMemoryWarning) {
    console.log(`there was ${hadLowMemoryWarning ? "a" : "no"} memory warning`);
}

var error = function(error) {
    console.error(error);
}

AppCenter.Crashes.hasReceivedMemoryWarningInLastSession(success, error);

注意

在某些情况下,运行设备内存不足可能不会触发可跟踪事件。

应用在上一个会话中是否崩溃?

启动 SDK 后,可以随时检查应用是否在上一次启动中崩溃:

var success = function(didCrash) {
    console.log("there was " + (didCrash ? "a" : "no") + " crash");
}

var error = function(error) {
    console.error(error);
}

AppCenter.Crashes.hasCrashedInLastSession(success, error);

如果想要在崩溃后调整应用的行为或 UI,这将派上用场。 某些开发人员可能希望向用户道歉,或在发生崩溃后取得联系。

有关上次崩溃的详细信息

如果你的应用以前崩溃,你可以获取有关上次崩溃的详细信息。

var success = function(crashReport) {
    //do something with crash report
}

var error = function(error) {
    console.error(error);
}

AppCenter.Crashes.lastSessionCrashReport(success, error);

自定义 App Center 崩溃的使用情况

App Center 崩溃为开发人员提供了在将崩溃日志发送到 App Center 之前和向 App Center 发送时执行其他操作的功能。

JavaScript 中的处理崩溃

可以通过更改 config.xml中的首选项APPCENTER_CRASHES_ALWAYS_SEND值,将 SDK 配置为自动发送故障报告或在 JavaScript 中处理崩溃。 若要在 JavaScript 中处理崩溃,请将其设置为 false

<preference name="APPCENTER_CRASHES_ALWAYS_SEND" value="false" />

然后,可以使用 AppCenter.Crashes.process(processFunction, errorCallback) 方法自定义崩溃过程。

是否应处理崩溃?

sendCallback如果要确定是否需要处理特定崩溃,请将 传递给 false 。 例如,可能存在你想要忽略的系统级崩溃,并且不希望发送到 App Center。

var errorCallback = function(error) {
    console.error(error);
};

var processFunction = function(attachments, sendCallback) {
    sendCallback(false); //crash won't be sent
};

AppCenter.Crashes.process(processFunction, errorCallback);

否则,将 传递给 truesendCallback 函数,并发送崩溃。

var errorCallback = function(error) {
    console.error(error);
};

var processFunction = function(attachments, sendCallback) {
    sendCallback(true); //crash will be sent
};

AppCenter.Crashes.process(processFunction, errorCallback);

注意

若要使用此功能,需要将 config.xml 中的首选项值设置为 falseAPPCENTER_CRASHES_ALWAYS_SEND

因此,此功能依赖于 JavaScript 中的 处理崩溃

将附件添加到崩溃报告

可以将二进制和文本附件添加到故障报告。 SDK 将随故障一起发送它们,以便你可以在 App Center 门户中查看它们。 在从上一个应用程序启动时发送存储的故障之前,将立即调用以下回调,但不会在崩溃时调用。 请确保 附件文件未 命名 minidump.dmp ,因为该名称是为小型转储文件保留的。 下面是如何将文本和图像附加到崩溃的示例:

var errorCallback = function(error) {
    console.error(error);
};

var processFunction = function(attachments, sendCallback) {
    for (var i = 0; i < attachments.length; i++) {
        attachments[i].addTextAttachment('Hello text attachment!', 'hello.txt');
        var imageAsBase64string = '...';
        attachments[i].addBinaryAttachment(imageAsBase64string, 'logo.png', 'image/png');
    }
    sendCallback(true); //crash will be sent
};

AppCenter.Crashes.process(processFunction, errorCallback);

注意

若要使用该功能,需要将 config.xml 中的首选项值设置为 falseAPPCENTER_CRASHES_ALWAYS_SEND

因此,此功能依赖于 JavaScript 中的 处理崩溃

注意

大小限制目前在 Android 上为 1.4 MB,在 iOS 上为 7 MB。 尝试发送更大的附件将触发错误。

启用或禁用 App Center 在运行时崩溃

可以在运行时启用和禁用 App Center 崩溃。 如果禁用它,SDK 不会对应用执行任何故障报告。

var success = function() {
    console.log("crashes disabled");
}

var error = function(error) {
    console.error(error);
}

AppCenter.Crashes.setEnabled(false, success, error);

若要再次启用 App Center 崩溃,请使用同一 API,但将 作为参数传递 true

var success = function() {
    console.log("crashes enabled");
}

var error = function(error) {
    console.error(error);
}

AppCenter.Crashes.setEnabled(true, success, error);

在应用程序启动时,状态将保留在设备的存储中。

检查是否启用了 App Center 崩溃

还可以检查是否启用了 App Center 崩溃:

var success = function(result) {
    console.log("crashes " + (result) ? "enabled" : "disabled");
}

var error = function(error) {
    console.error(error);
}
AppCenter.Crashes.isEnabled(success, error);