停止HockeyApp崩溃我的Xamarin iOS应用程序与UnobservedTaskException
本文关键字:应用程序 UnobservedTaskException iOS Xamarin HockeyApp 崩溃 我的 停止 | 更新日期: 2023-09-27 18:13:20
我们有一个Xamarin iOS应用程序,它位于一个高度异步的PCL库之上。偶尔会有任务在库中出错而未被观察到。因此,我们在TaskScheduler上连接了UnobservedTaskException处理程序,以确保这不一定会使我们的应用程序崩溃。
这个工作很好,直到我们启用HockeyApp集中崩溃报告。Hockey为未观察到的任务异常添加了自己的处理程序,该处理程序总是在向服务器发送崩溃报告后终止应用程序。我对他们为AppDomain UnhandledException处理程序这样做没有问题,但我需要阻止他们在未观察到的任务异常上杀死应用程序。
似乎有一个机制为这些异常安装自定义处理程序,但我不知道如何在Xamarin iOS Hockey SDK中安装它
下面是我们用来启用Hockey
的代码var manager = BITHockeyManager.SharedHockeyManager;
manager.Configure(APPID);
#if DEBUG
manager.DebugLogEnabled = true;
#endif
manager.StartManager();
有没有人知道如何覆盖HockeyApp的默认行为为UnobservedTaskExceptions?
UnobservedTaskException
EventHandler在StartManager
方法中是硬编码的,没有直接的方法可以删除。
TaskScheduler.UnobservedTaskException += (sender, e) => ThrowExceptionAsNative(e.Exception);
裁判:https://github.com/bitstadium/HockeySDK-Xamarin/blob/28e67ecba14d00c8bea8043e08678af6044d33cf/source/HockeySDK.iOSBindings/Additions.cs承办
就我个人而言,我从源代码构建,公开暴露ThrowExceptionAsNative
并添加配置方法以在调用StartManager
时包含/排除默认处理程序。这就像HockeyApp使用HockeySDK-Windows
api一样。
因此,当捕获UnobservedTaskException
时,您可以选择自己处理它或将其作为本机异常抛出。
这很像原来的Xamarin本地绑定,我不明白为什么他们这样做,因为在 HockeySDK-Windows
代码中,他们删除了UnobservedTaskException
的默认处理:
从。net 4.5开始,默认情况下,unobservedtaskexception不再导致应用程序崩溃。SDK还没有为此进行调整,仍然记录日志这些错误并导致程序退出,尽管这可能不是
希望继续使用处理程序的用户应该添加对
RegisterUnobservedTaskExceptionHandler()
或呼叫后的RegisterDefaultUnobservedTaskExceptionHandler()
Configure()
.
对于几个不想要自定义构建HockeySDK.Xamarin
的客户端,我在 StartManager
调用之后通过反射删除EventHandler
,并添加我们的自定义处理程序。使用这种方法,如果需要的话,您将没有一个公共ThrowExceptionAsNative
可用来抛出异常,但是一些更多的反射可以做到这一点:-/
根据这个支持问题,答案是否定的。
https://support.hockeyapp.net/discussions/problems/60521 hockeysdkuwp - 413 -不-方式- - - - - - -禁用unobservedtaskexceptions
和这个提交似乎是试图解决这个问题
https://github.com/bitstadium/HockeySDK-Windows/commit/1c1bc9715e64dd1283b3dc5db40ccdc9e59f4fc3我用这行代码解决了这个问题:
var ex = t.Exception;
当Task抛出异常时我取结果
if ((t.IsFaulted) || (t.IsCanceled))
{
var ex = t.Exception;