2012-06-04 11 views
16

Me gustaría que mi aplicación se restablezca a la configuración estándar si se bloqueó durante el inicio. Preferiblemente también si se estrelló la última vez que se ejecutó.¿La aplicación de detección se colgó durante la carga/la última vez que se ejecutó?

EDIT: Crittercism tiene un método crittercismDidCrashOnLastLoad, pero sólo maneja el caso de estrellarse durante la carga. No funcionó correctamente en la versión de la biblioteca que utilicé, pero desde entonces se solucionó.

Sugerencias?

Respuesta

27

realizar 2 funciones en el archivo de AppDelegate.m:

void HandleException(NSException *exception) { 
    NSLog(@"App crashing with exception: %@", exception); 
    //Save somewhere that your app has crashed. 
} 

void HandleSignal(int signal) { 
    NSLog(@"We received a signal: %d", signal); 
    //Save somewhere that your app has crashed. 
} 

Luego, en su -(BOOL)application:didFinishLaunchingWithOptions antes que nada puso:

NSSetUncaughtExceptionHandler(&HandleException); 

struct sigaction signalAction; 
memset(&signalAction, 0, sizeof(signalAction)); 
signalAction.sa_handler = &HandleSignal; 

sigaction(SIGABRT, &signalAction, NULL); 
sigaction(SIGILL, &signalAction, NULL); 
sigaction(SIGBUS, &signalAction, NULL); 
+2

Hmm, parece útil. ¿Interactuará mal con Crittercism? –

+2

OK, lo he probado y, de hecho, desactivará Crittercism. Creo que trataré de convencerlos de que agreguen esta característica a su producto. Gracias por su consejo, fue de lo más útil. –

+0

Es bueno saber que no he usado 'Crittercism', pero probablemente lo manejen de manera similar, esta es también la forma en que' TestFlight' maneja el registro de errores. En realidad, puedes preguntarles cómo usar su controlador de excepción no capturado junto con el tuyo ... – graver

4

Usando Crashlytics a continuación, puede establecer CrashlyticsDelegate para detectar un accidente en Swift o ObjC código.

import Fabric 
import Crashlytics 
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey: Any]?) -> Bool 
{ 
    Crashlytics.sharedInstance().delegate = self 
    Fabric.with([Crashlytics.self]) 
    return true 
} 

//MARK: - CrashlyticsDelegate 

func crashlyticsDidDetectReport(forLastExecution report: CLSReport, completionHandler: @escaping (Bool) -> Void) 
{ 
    completionHandler(true) 
} 

a partir de documentos Crashlytics

su delegado debe invocar el completionHandler, pero no es necesario que hacerlo de forma sincrónica, o incluso en el hilo principal. Invocar finalHandler con NO provocará que el informe detectado se elimine y no se envíe a Crashlytics. Esto es útil para implementar solicitudes de permiso , u otras formas de lógica más complejas alrededor de que presenten bloqueos.

Asegúrese de que el delegado esté configurado antes de iniciar Crashlytics con startWithAPIKey: ... o mediante [Fabric with: ...]. Si no lo hace, se perderá cualquier devolución de llamada delegada que se produzca de forma síncrona durante el inicio.

Cuestiones relacionadas