2015-10-18 17 views
13

Sappiamo tutti che il mobile è una piattaforma compatta in cui dobbiamo guardare molte cose mentre costruisci un'applicazione. Potrebbe essere qualsiasi cosa, ad es. MemoryPerformanceResolutionsArchitectureImplementation ecc Non sappiamo mai quando e quali sono le cause app crash un grosso problema durante la riproduzione con l'applicazione, potrebbe accadere in qualsiasi momentoGestione Xamarin eccezione globale | Droid | iOS

esempio Avvio app, Carica schermata, Chiamata API, Dati rilegatura, Caricamento immagini ecc.

E fidatevi di me a volte è davvero difficile trovare dove e quale causa un problema in app. Ho visto molti post su forum, community e gruppi tecnologici relativi allo stesso problema, dove i popoli di solito facevano domande come:

  1. App Blocco al momento dell'avvio.
  2. Caricamento dell'applicazione in crash su schermata iniziale.
  3. Blocco dell'applicazione durante la visualizzazione dell'immagine.
  4. App Si blocca durante il binding dei dati da api.

Come identificare il problema e dove provoca?

risposta

12

Scopo: Il nostro scopo qui per afferrare i dati dello stack trace di un'eccezione che ci aiutano a identificare ciò che provoca esattamente la questione se in Release Mode o Debug Mode. Saremo in grado di comprendere il problema e il motivo che lo causa. Conserveremo questi dati in un file text che verrà archiviato nella memoria del dispositivo.


Soluzione: In alternativa, è possibile creare il proprio grabber intuizione che vi darà voi app intuizione e indizio se qualcosa è andato storto durante il test l'applicazione. Sarà tuo, puoi modificare come vuoi. tuffiamoci a try{} e catch{} a livello globale.

Creare un file Helper Class che abbia un metodo per generare un file di testo per dati di eccezione.

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 
} 

tempo per implementare il codice: Iscriviti seguenti eventi all'interno del file della tua applicazione Application o Splash Activity. Sto usando l'applicazione in questo caso.

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 
} 

Nota: è possibile trovare delle eccezioni file di record nella Storage Device | File Manager> Cartella eccezione> fatal.txt

Evviva !!

Result Video

Full Article

5

fianco di farlo da soli si può anche usare Xamarin.Insights in quanto è libero di utilizzare per gli utenti Xamarin ed ha implementazioni per tutte le piattaforme. Ricevi rapporti di utilizzo, rapporti sugli arresti anomali, ecc. Online senza che l'utente debba inviarti manualmente un file di registro.

L'unica cosa che dovete fare per ricevere segnalazioni di crash è inizializzare Xamarin.Insights all'avvio della vostra applicazione:

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

Naturalmente utilizzabili Grazie per l'aggiunta, ma credo che il suo insieme Business Edition. Per favore correggimi se sbaglio. – RIYAZ

+0

Almeno per oggi è gratuito e illimitato per tutti i clienti Xamarin. Quando Xamarin.Insights è stato annunciato c'è stata questa frase sui prezzi: * I prezzi saranno annunciati alla fine dell'anteprima, ma un piano generoso sarà incluso per gli abbonati Xamarin senza costi aggiuntivi. * Https: //blog.xamarin. com/monitoring-your-apps-with-xamarin-insights/ – Wosi

+0

Beh, è ​​carino :) Grazie per aver condiviso @Wosi. – RIYAZ