modal - React-Native ios Accidentes de la aplicación sin informe
react navigation (3)
Como sugirió Chris Geirman, el problema fue un error de JavaScript. No estoy seguro de que las personas con problemas similares encuentren este hilo, pero en caso de que lo hagan, aquí está el extraño error que estaba ocurriendo.
Creé un sistema ORM simple, con un modelo base y un montón de modelos heredados de él. El constructor BaseModel se veía así:
constructor(props = {}, relations = {}) {
Object.keys(props).forEach((k) => {
// Save props to object
this[k] = props[k];
});
this.relations = relations;
this.className = this.constructor.name;
}
Esa última línea fue el problema. En mi simulador local y si construyo la aplicación en mi teléfono conectándolo, esto funciona bien. Como en, si un modelo de mensaje hereda de BaseModel, llama var msg = new Message(data, relations); msg.className
var msg = new Message(data, relations); msg.className
devuelve el Message
.
Pero algo relacionado con empaquetar / archivar / enviar la aplicación a través de TestFlight o Fabric.io minimiza y reutiliza JavaScript, de modo que los nombres de las clases cambian. Entonces, en cambio, si hago esto - var msg = new Message(data, relations); msg.className
var msg = new Message(data, relations); msg.className
- Devolveré un nombre de variable aleatorio, algo así como ''t''.
Esto fue un problema en mi aplicación, porque mi página de inicio contenía una declaración de cambio que funcionaba fuera de className:
iconContent() {
return {
Message: {
icon: <Image style={styles.feedItemIconImage} source={ require(''../assets/img/icon_message.png'') } />,
color: c.grass
}, ...
}[this.props.className] // from the model item
}
Pero ''Message''
no era, como se esperaba, el valor de this.props.className
- ''t''
. Y entonces, si tuviera que tratar de hacer un túnel en, por ejemplo, el valor del color
, me daría un error, porque estaba tratando de acceder a la propiedad de color
de null
.
Por qué eso no informó, no lo sé (seguí las sugerencias de Chris e instalé Sentry, pero todavía parecía no informar ese error).
Pero eso es lo que estaba pasando. La minificación / uglificación ocurrió solo cuando instalé la aplicación en un teléfono mediante TestFlight / Fabric, y es por eso que la aplicación solo se bloqueó en esas condiciones.
Espero que esto evite que cualquiera que se encuentre con un error similar se arranque el pelo.
Estoy construyendo una aplicación de iOS usando React Native e intentando que se pueda probar en los teléfonos.
Si conecto mi teléfono a la computadora y "compilo" directamente en el teléfono, la aplicación se compila correctamente y se abre / funciona correctamente, no hay problema.
Pero si intento archivarlo y enviarlo a teléfonos usando TestFlight o Fabric with Crashlytics de iTunes Connect, la aplicación se bloquea inmediatamente después de abrirse. Muestra brevemente la pantalla de inicio, pero no más.
Además, no hay informes de fallas: en TestFlight, en Crashlytics o en XCode, una vez que vuelvo a enchufar el teléfono. Por lo tanto, estoy trabajando en la oscuridad aquí, sin información sobre lo que está ocurriendo. No he podido encontrar un problema similar en línea, así que pensé que solo lo haría. ¿Alguna idea de lo que podría estar yendo mal?
Por favor, avíseme si hay algún código u otra información que pueda necesitar ver. Parte de esto es confidencial, pero intentaré publicar una versión aproximada.
No estoy seguro de si todavía tienes este problema, pero si lo haces, te recomendaría que revises Bugsnag para reaccionar al informe de errores nativos , que informa bloqueos tanto en la capa de JavaScript como en las capas nativas (java / cocoa).
Uno de los problemas más difíciles de resolver en reaccionar a los informes de fallos nativos (como mencionó Sasha) es restaurar las trazas originales de la pila cuando se usa minificación y / o ofuscación: esto se maneja en Bugsnag proporcionando soporte completo para los mapas fuente JS, así como la simbolización iOS y soporte de Android Proguard en las capas nativas.
Avísame si esto ayuda - Soy un fundador @ Bugsnag
Me gustaría compartir mi propia experiencia de la caída de la etapa de producción, mientras que todo funcionó bien en la etapa de desarrollo.
Tuve el problema similar causado por el registrador Reactotron . Como no lo estoy agrupando en la etapa de producción, una sola línea de console.tron.log bloqueó mi aplicación con sigilo completo. (Es un poco mi culpa, ya que no me importa un comino mi linter con configuración ''sin consola'')
Aquí está el fragmento de código que presento en mi archivo de nivel raíz, root.js.
if (__DEV__) {
...
console.tron = Reactotron;
...
}
Espero que alguien lo encuentre antes de perder el tiempo averiguando qué pasa.