Skip to main content
Usa este flujo para capturar fallos nativos y bloqueos del hilo principal en una app de iOS. La captura de bloqueos requiere UIKit. Sube el dSYM correspondiente para ver las ubicaciones del código fuente en los marcos de pila. La app guarda un informe local cuando falla. En un inicio posterior, tu app llama a replay para enviar la evidencia del fallo a LogBrew. LogBrew no envía el informe de Apple sin procesar.
Usa LogBrew Swift 0.1.6 o posterior. Usa la CLI nativa de LogBrew 0.1.24 o posterior para subir artefactos de depuración.
Dentro de la app, usa una configuración de ingesta limitada al proyecto. Usa un inicio de sesión de cuenta para subir artefactos y leer incidencias. Una clave de artefactos del proyecto también puede subir desde una máquina de compilación. Nunca incluyas en la app un token de acceso de la cuenta ni una clave de artefactos.

Planifica el límite de la captura

Comprueba cuándo puede tu app reenviar cada tipo de error. Define el valor del release antes de compilar. Debe identificar la versión y la compilación de la app. Usa el mismo valor en el SDK, en la carga del dSYM y en el filtro de incidencias. No adjuntes a los metadatos del fallo datos de usuarios, cuerpos de solicitudes ni encabezados.

Añade el producto de fallos

Primero, configura la telemetría del SDK para tu app. El reenvío usa ese client y ese transport. Añade el SDK público con Swift Package Manager.
Añade el producto LogBrew para enviar telemetría. Añade LogBrewCrash solo cuando la app active de forma explícita la captura de fallos o bloqueos nativos. La integración de captura admite iOS 15 o posterior. Mantén un único objeto de captura propiedad de la app, porque los manejadores nativos de errores fatales afectan a todo el proceso.

Configura una identidad exacta

Usa el mismo proyecto, release, entorno y servicio en la configuración de ejecución y en la carga de artefactos. LogBrew no deduce ni reemplaza estos valores.
Instala el objeto de captura en el hilo principal antes de crear la interfaz raíz. Crea antes su directorio padre. Mantén el directorio de almacenamiento privado y bajo el control de la app. El objeto de captura registra excepciones Mach, señales, excepciones de C++ y excepciones de Objective-C. El informe local no incluye el contenido de la memoria, los nombres de las colas ni los logs de la consola. El informe de fallo local puede contener datos sensibles de la app y del dispositivo. Déjalo fuera de las copias de seguridad en la nube y de los directorios compartidos. LogBrew envía los UUID, las arquitecturas y los desplazamientos de los marcos en lugar del informe sin procesar. NativeCrashConfiguration tiene dos límites opcionales: Un valor fuera de su rango hace que la configuración lance crash_invalid_configuration.

Activa la captura de bloqueos

La captura de bloqueos está desactivada cuando watchdog es nil. Para activarla, reemplaza la declaración de watchdog anterior antes de llamar a install():
El umbral se indica en segundos, de 1 a 30. La captura de bloqueos también requiere artifactIdentity. Sin ella, la configuración lanza crash_invalid_configuration. Mantén un único objeto crashCapture durante toda la vida del proceso. Un segundo objeto de captura no se puede instalar. Su llamada a install() lanza crash_capture_owned. Para cambiar el umbral, usa el valor nuevo en el siguiente inicio de la app. Un bloqueo recuperado se reenvía con crash.handled en true. Un bloqueo en curso que deja el cierre del proceso se reenvía con crash.handled en false. Las dos formas incluyen los metadatos numéricos durationMs. Conservan la misma identidad de artefacto que usan los marcos de los fallos fatales. El watchdog se pausa mientras la app está inactiva o en un depurador. También suspende la captura cuando hay una presión térmica grave. Un umbral corto puede informar del trabajo normal del hilo principal como bloqueos. Prueba el umbral con la configuración de compilación que publicas. El estado gestionado describe la recuperación. No marca la incidencia como solucionada. Un bloqueo gestionado también bloqueó la interfaz, así que revísalo igualmente.

Reenvía tras el inicio

Después de instalar la captura, reenvía los informes pendientes con tu cliente del SDK.
Tu app debe llamar a replay. La recuperación de un bloqueo no envía ningún evento por sí sola. Llama al mismo método después de la recuperación o en el siguiente inicio. El reenvío procesa los informes válidos del más antiguo al más reciente y conserva sus ID de evento estables. Un envío fallido deja su informe pendiente. Un envío aceptado lo elimina. El reenvío descarta los informes que no puede leer y los que superan maxReplayBytes. Revisa los tres recuentos. Un recuento de pendientes en cero no demuestra por sí solo que se enviaran. Activa el envío persistente antes del reenvío cuando una solicitud fallida deba sobrevivir a otro reinicio. No llames a purge() durante una recuperación habitual de la red o de la autenticación.

Sube el dSYM correspondiente

Archiva la app con la información de depuración activada. Conserva el dSYM de la compilación exacta que usan los usuarios. Revisa los UUID de sus imágenes.
Valida el artefacto en local antes de subirlo.
Repite --expect-image-uuid por cada arquitectura necesaria. El comando falla cuando el conjunto de UUID encontrado no coincide con el esperado. Comprueba el acceso de la cuenta. Después ejecuta el mismo comando sin --dry-run.
El comando de carga valida los objetos de Apple admitidos y verifica cada identidad subida. No incluye rutas locales ni nombres de archivo en los metadatos de la API. El status del JSON muestra el resultado: Una máquina de compilación puede subir con una clave de artefactos del proyecto en LOGBREW_TOKEN en lugar del acceso de la cuenta. Crea la clave como se muestra en Crea una clave de artefactos. Esa carga informa uploaded. Verifica cada identidad más tarde con el acceso de la cuenta:
status: "found" confirma el artefacto. status: "missing" significa que LogBrew no tiene ningún artefacto para esa identidad. La resolución compara el UUID de la imagen y la identidad completa del artefacto, no el nombre del archivo fuente. Una nueva compilación del mismo código fuente puede tener UUID distintos. Sube el paquete dSYM exacto, no un directorio de compilación completo.

Verifica la lectura alojada

Filtra la lista de incidencias con el mismo alcance de ejecución. Este ejemplo selecciona incidencias unresolved. Una incidencia resuelta o archivada no aparece.
La respuesta de la lista identifica la incidencia agrupada. Lee su detalle para solicitar la resolución alojada de marcos.
Un artefacto que coincide añade un objeto symbolication. Este ejemplo muestra algunos campos de una incidencia con un marco resuelto, no la respuesta completa.

Lee la evidencia del fallo

Cada marco tiene su propio status. El campo symbolication.status usa los mismos valores: En tus notas, deja un marco sin resolver como sin resolver. No lo informes como una pila vacía. LogBrew resuelve los marcos cuando lees la incidencia. Un dSYM subido más tarde puede resolver marcos de un evento anterior. No puede añadir marcos que el evento no capturó. Un marco de la aplicación acota la búsqueda en el código, pero no demuestra la causa. Para ver los pasos anteriores, la cadena de excepciones y la evidencia de la traza, lee la investigación de la incidencia:
En esa respuesta, un marco con source: "symbolicated" viene de un artefacto subido. Un marco con source: "captured" es la ubicación que envió la app. Consulta Investigar una incidencia para ver los campos de la respuesta. Mantén el alcance completo de proyecto, release, entorno y servicio en cada lectura. No amplíes una búsqueda fallida a otros proyectos.

Verifica la configuración de producción

Usa un error de prueba aprobado en la compilación desplegada. Nunca uses una acción de un cliente como desencadenante. Revisa cada punto en orden y detente en el primer error:
  1. La identidad de ejecución coincide con la identidad del artefacto subido.
  2. Un inicio posterior reenvía un evento confirmado, con cero informes descartados y cero pendientes.
  3. La lista de incidencias con el alcance devuelve la incidencia de prueba con el estado gestionado esperado.
  4. El marco de la aplicación esperado se resuelve.
  5. Un inicio limpio posterior no añade otra ocurrencia.

Recupérate de forma segura

Para investigar incidencias en general, usa Investigar una incidencia.