2011-05-26 14 views
28

¿Cómo puede mi aplicación iOS leer los mensajes del registro de la consola de los dispositivos? Quiero leer de forma programática estas entradas de registro (como leer un archivo?), Seleccionar algunas y enviarlas por correo electrónico a la asistencia.Uso del objetivo C para leer los mensajes de registro publicados en la consola del dispositivo

Conozco una aplicación de iPhone que le permite ver el registro. Su nombre es consola. Sin embargo, no puedo entender qué clases o API usó. Una persona sugirió que se hizo usando las funciones de ASL, pero no sé cuáles son o dónde están documentadas.

También conozco varias alternativas al uso de NSLog como NSLogger y CocoaLumberJack, pero no estamos preparados para implementarlas en este momento.

Muchas gracias por cualquier ayuda!

+1

Leer http://boredzo.org/blog/archives/2008-01-19/next-week-apple-system -logger le dará una buena idea de todo el ASL. – Jano

+0

+1 ¡Gracias! Leeré sobre eso. –

Respuesta

28

This entry en los blogs Cocoanetics tiene código de ejemplo para tener acceso al registro del sistema en iOS utilizando el ASL (Registrador de Apple System) API (man page):

aslmsg q, m; 
int i; 
const char *key, *val; 

q = asl_new(ASL_TYPE_QUERY); 

aslresponse r = asl_search(NULL, q); 
while (NULL != (m = aslresponse_next(r))) 
{ 
    NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary]; 

    for (i = 0; (NULL != (key = asl_key(m, i))); i++) 
    { 
     NSString *keyString = [NSString stringWithUTF8String:(char *)key]; 

     val = asl_get(m, key); 

     NSString *string = [NSString stringWithUTF8String:val]; 
     [tmpDict setObject:string forKey:keyString]; 
    } 

    NSLog(@"%@", tmpDict); 
} 
aslresponse_free(r); 

en cuenta que necesita para sondear ASL para leer el último mensajes. El código anterior también fallará cuando se ejecute en el simulador de iPhone, pero funciona bien en un dispositivo real.

Si no desea luchar contra la API C ASL, eche un vistazo a este contenedor Objective-C llamado ASLogger.

+0

Esto se ve perfecto. ¡Gracias! –

+2

En realidad hay un problema con este código. La mayoría de los mensajes que se escriben en la consola en iOS están marcados como sensitivos. Y solo las aplicaciones del sistema pueden leerlos. Entonces, terminará pudiendo leer solo sus propios registros. –

7

A partir de iOS 7, este método no funcionará más. Apple eliminó el acceso a ASL debido a razones de seguridad.

+0

¿De verdad? En IOS7, todavía puedo leer mensajes de ASL que están escritos por NSLog. Pero para los mensajes registrados por DDLog, no puede funcionar en un dispositivo real. – Andrew

+12

En iOS 7, puede usar ASL para leer mensajes emitidos por su propia aplicación, incluso en versiones anteriores de la misma compilación de su aplicación, pero no mensajes emitidos por el sistema o por cualquier otra aplicación. – sup

+0

Gracias sup. Spot on. Usted respondió antes de que pudiera. – Trung

3

Aquí hay una rápida aplicación si alguien está buscando una:

static func systemLogs() -> [[String: String]] { 
    let q = asl_new(UInt32(ASL_TYPE_QUERY)) 
    var logs = [[String: String]]() 
    let r = asl_search(nil, q) 
    var m = asl_next(r) 
    while m != nil { 
     var logDict = [String: String]() 
     var i: UInt32 = 0 
     while true { 
      if let key = String.fromCString(asl_key(m, i)) { 
       let val = String.fromCString(asl_get(m, key)) 
       logDict[key] = val 
       i++ 
      } else { 
       break 
      } 
     } 
     m = asl_next(r) 
     logs.append(logDict) 
    } 
    asl_release(r) 
    return logs 
} 
+0

Gracias pero aún no puedo capturar los registros enviados por la "impresión" de swift, solo captura los de NSLog, ¿alguna idea? – Jimmar

+1

@JiMMaR No podrás capturarlos. La impresión de Swift omite por completo la función de registro de Apple. Si desea que esos registros vayan a las instalaciones de registro de Apple, use NSLog o cree su propio contenedor para ambos. –

+2

Esto es genial, pero ahora si solo tuviéramos algo que fuera compatible con iOS 10 y el nuevo os_log. Usted no tendría eso, ¿verdad? –

Cuestiones relacionadas