web-dev-qa-db-ja.com

グローバル例外Xamarinの処理|ドロイド| iOS

モバイルはコンパクトなプラットフォームであるため、アプリケーションを構築する際に多くのことを調べる必要があることは誰もが知っています。それは例えば何でもかまいません。 MemoryPerformanceResolutionsArchitectureImplementationなど。アプリで遊んでいるときに、アプリが大きな問題をいつ、どのような原因でクラッシュさせるかはわかりませんが、それはいつでも起こる可能性があります

例えばアプリの起動、画面の読み込み、API呼び出し、データのバインド、画像の読み込みなど。

そして、いつか私を信頼して、アプリのどこで何が問題を引き起こすのかを見つけるのが本当に難しい。同じ問題に関連するフォーラム、テクノロジーコミュニティ、グループに多くの投稿がありました。人々は通常、次のように質問します。

  1. 起動時にアプリがクラッシュする。
  2. スプラッシュ画面の読み込み時にアプリがクラッシュする。
  3. 画像表示中にアプリがクラッシュする。
  4. APIからのデータのバインド中にアプリがクラッシュします。

問題を特定する方法とそれが発生する場所?

14
Mohammad Riyaz

目的:ここでの目的は、_Release Mode_または_Debug Mode_。問題とその原因を理解することができます。このデータは、デバイスストレージに保存されるtextファイルに保存します。


解決策:または、独自の洞察グラバーを作成して、アプリのテスト中に問題が発生した場合にアプリの洞察と手掛かりを得ることができます。それはあなたになるでしょう、あなたはあなたが望むように微調整することができます。 _try{}_と_catch{}_にグローバルに飛び込もう。

例外データのテキストファイルを生成するメソッドを持つ_Helper Class_ファイルを作成します。

_public static class ExceptionFileWriter
{
    #region Property File Path

    static string FilePath
    {
        get
        {
            string path = string.Empty;
            var _fileName = "Fatal.txt";
#if __IOS__
            string documentsPath = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments); // Documents folder C:\ddddd
            string libraryPath = Path.Combine(documentsPath, "..", "Library"); // Library folder C:\dddd\...\library
            path = Path.Combine(libraryPath, _fileName); //c:\ddddd\...\library\NBCCSeva.db3
#else
#if __Android__
            string dir = Path.Combine(Android.OS.Environment.ExternalStorageDirectory.ToString(), "Exception");
        if (Directory.Exists(dir))
            return Path.Combine(dir, _fileName);
        path= Path.Combine(Directory.CreateDirectory(dir).FullName, _fileName);
#endif
#endif
            return path;
        }
    }

    #endregion

    #region ToLog Exception

    public static void ToLogUnhandledException(this Exception exception)
    {
        try
        {
            var errorMessage = String.Format("Time: {0}\r\nError: Unhandled Exception\r\n{1}\n\n", DateTime.Now, string.IsNullOrEmpty(exception.StackTrace) ? exception.ToString() : exception.StackTrace);
            File.WriteAllText(FilePath, errorMessage);
        }
        catch (Exception ex)
        {
            // just suppress any error logging exceptions
        }
    }

    #endregion
}
_

コードを実装する時間:アプリのApplicationファイルまたは_Splash Activity_内の以下のイベントをサブスクライブします。この場合、アプリケーションを使用しています。

_AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
_

_[Application]
public class ExceptionHandlingApp : Application
{
    #region Constructor

    public ExceptionHandlingApp(IntPtr javaReference, JniHandleOwnership transfer)
        : base(javaReference, transfer)
    {

    }

    #endregion

    #region OnCreate

    public override void OnCreate()
    {
        base.OnCreate();
        AppDomain.CurrentDomain.UnhandledException += CurrentDomainOnUnhandledException;
        TaskScheduler.UnobservedTaskException += TaskSchedulerOnUnobservedTaskException;
    }

    #endregion

    #region Task Schedular Exception

    private static void TaskSchedulerOnUnobservedTaskException(object sender, UnobservedTaskExceptionEventArgs unobservedTaskExceptionEventArgs)
    {
        var newExc = new Exception("TaskSchedulerOnUnobservedTaskException", unobservedTaskExceptionEventArgs.Exception);
        newExc.ToLogUnhandledException();
    }

    #endregion

    #region Current Domain Exception

    private static void CurrentDomainOnUnhandledException(object sender, UnhandledExceptionEventArgs unhandledExceptionEventArgs)
    {
        var newExc = new Exception("CurrentDomainOnUnhandledException", unhandledExceptionEventArgs.ExceptionObject as Exception);
        newExc.ToLogUnhandledException();
    }

    #endregion
}
_

注:例外レコードファイルはデバイスストレージにあります。ファイルマネージャー>例外フォルダー> fatal.txt

乾杯!!

結果ビデオ

記事全体

12
Mohammad Riyaz

自分で行う以外に、 Xamarin.Insights を使用することもできます。Xamarinユーザーは自由に使用でき、すべてのプラットフォームに実装されているからです。ユーザーがログファイルを手動で送信しなくても、使用状況レポート、クラッシュレポートなどをオンラインで受信できます。

クラッシュレポートを受け取るために必要なことは、アプリの起動時にXamarin.Insightsを初期化することだけです。

Insights.HasPendingCrashReport += (sender, isStartupCrash) =>
{
  if (isStartupCrash) {
    Insights.PurgePendingCrashReports().Wait();
  }
};
Insights.Initialize("Your API Key");
6
Wosi