React-Native ios App se bloque sans rapport

Je construis une application iOS en utilisant React Native et en essayant de la tester sur les téléphones.

Si je twig mon téléphone dans l'ordinateur et "construit" directement sur le téléphone, l'application est construite correctement et ouvre / fonctionne correctement, pas de problème.

Mais si j'essaie de l'archiver et de l'envoyer vers des téléphones à l'aide de TestFlight ou de Fabric with Crashlytics d'iTunes Connect, l'application se bloque dès son ouverture. Il montre brièvement l'écran de lancement, mais pas plus.

De plus, il n'y a pas de rapports de crash – dans TestFlight, dans Crashlytics, ou dans XCode, une fois que je twig le téléphone. Donc, je fonctionne dans l'obscurité ici, sans aucune information sur ce qui se brise. Je n'ai pas été capable de find un problème similaire en ligne, alors j'ai pensé que je requestrais juste. Des idées sur ce qui pourrait mal tourner?

S'il vous plaît laissez-moi savoir s'il y a un code ou d'autres données que vous pourriez avoir besoin de voir. Une partie est confidentielle, mais je vais essayer de postr une version approximative.

    Comme l'a suggéré Chris Geirman, le problème était une erreur JavaScript. Je ne suis pas sûr que les gens ayant des problèmes similaires findont ce fil, mais au cas où ils le font, voici l'erreur étrange qui se produisait.

    J'avais créé un simple système ORM, avec un BaseModel et un tas de templates qui en ont hérité. Le constructor BaseModel ressemblait à ceci:

    constructor(props = {}, relations = {}) { Object.keys(props).forEach((k) => { // Save props to object this[k] = props[k]; }); this.relations = relations; this.className = this.constructor.name; } 

    Cette dernière ligne était le problème. Sur mon simulateur local et si je construis l'application sur mon téléphone en la branchant, cela fonctionne bien. Comme dans, si un model Message hérite de BaseModel, appelez var msg = new Message(data, relations); msg.className var msg = new Message(data, relations); msg.className renvoie Message .

    Mais quelque chose sur le regroupement / l'archivage / l'envoi de l'application via TestFlight ou Fabric.io minimise et corrige le JavaScript, de sorte que les noms de classs sont modifiés. Donc, à la place, si je fais cela – var msg = new Message(data, relations); msg.className var msg = new Message(data, relations); msg.className – Je vais récupérer un nom de variable random, quelque chose comme 't'.

    Cela a été un problème dans mon application, car ma page d'accueil contenait une instruction switch qui fonctionnait avec 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 } 

    Mais 'Message' n'était pas, comme prévu, la valeur de this.props.className't' était. Et donc, si je devais essayer de creuser un tunnel dans, disons, la valeur de la color , j'atteindrais une erreur, parce que j'essayais d'accéder à la propriété de color de null .

    Pourquoi cela n'a pas rapporté, je ne sais pas (j'ai suivi les suggestions de Chris et installé Sentry, mais il semblait toujours ne pas signaler cette erreur).

    Mais c'est ce qui se passait. La minimisation / amélioration s'est produite uniquement lorsque j'ai installé l'application sur un téléphone via TestFlight / Fabric, et c'est pourquoi l'application ne s'est plantée que dans ces conditions.

    J'espère que cela évitera à tous ceux qui se heurtent à un problème similaire de se déchirer les cheveux.

    Je ne sais pas si vous avez toujours ce problème – mais si vous le faites, je vous recommand de vérifier Bugsnag pour réagir aux rapports d'erreurs natives – qui signale des plantages dans la couche JavaScript ainsi que dans les calques natifs (java / cacao).

    L'un des problèmes les plus difficiles à résoudre est de restaurer les traces de la stack d'origine lors de l'utilisation de la minification et / ou de l'obfuscation – cela est géré dans Bugsnag en fournissant un support complet pour les maps source JS, ainsi que la symbolisation iOS et le support Android Proguard sur les couches natives.

    Faites-moi savoir si cela aide – je suis un fondateur @ Bugsnag

    Je voudrais partager ma propre expérience de crash de la scène de production, alors que tout a bien fonctionné en phase de développement.

    J'ai eu le problème semblable qui a provoqué par le logger Reactotron . Comme je ne l'empackagete pas en production, une seule ligne de console.tron.log a planté mon application en mode furtif. (C'est un peu ma faute, puisque je me foutais de mon linter avec le réglage 'no-console')

    Voici l'extrait de code que je présente dans mon file racine, root.js.

      if (__DEV__) { ... console.tron = Reactotron; ... } 

    J'espère que quelqu'un finda cela avant de perdre du time à find ce qui ne va pas.