Aller au contenu

SDK React Native + Expo

Le SDK officiel Pionne pour React Native et Expo. Auto-capture des erreurs JS, natives iOS/Android, et Hermes. Compatible Expo managed et bare workflow.

Version actuelle : 0.8.6

Fenêtre de terminal
npm install @pionne/react-native
import { Pionne } from '@pionne/react-native';
Pionne.init({ token: 'pio_live_…' });

Pour ne pas polluer ton dashboard prod avec les events que tu génères en Metro / Expo Go (et éviter le casse-tête du bundle ID mismatch entre host.exp.Exponent et le bundle pinné sur ton projet), passe enableInDev: false :

Pionne.init({
token: 'pio_live_…',
enableInDev: false, // no-op en __DEV__
});

En __DEV__, l’init log [Pionne] Skipped in __DEV__ (enableInDev=false) et toutes les méthodes (captureException, captureMessage, setUser, etc.) deviennent silencieuses pour la durée du process. Aucun handler global installé, aucune session ouverte. Comportement par défaut : enableInDev: true (rétrocompat).

Les handlers JS (ErrorUtils, le tracker de promesses, l’Error Boundary) ne voient que les crashs du thread JS. Un crash natif détruit tout le process, VM JS comprise, avant qu’aucun JS ne tourne. Pionne s’appuie donc sur l’OS pour les enregistrer et les rejoue en événements fatal au lancement suivant.

Activé par défaut. Pour désactiver :

Pionne.init({
token: 'pio_live_…',
captureNativeCrashes: false,
});

Via MetricKit (MXCrashDiagnostic) :

  • NSException Objective-C / Swift — nom de l’exception + message composé sur iOS 17+ (ex. NSInvalidArgumentException)
  • SignauxSIGSEGV, SIGABRT, SIGBUS, SIGILL, SIGFPE, SIGTRAP
  • Kills mémoire (OOM) et terminations watchdog (0x8badf00d)
  • Call stack tree — frames système symbolisées par l’OS ; frames app sous forme binaryName 0xADDRESS (pas de pipeline dSYM)

Via ActivityManager.getHistoricalProcessExitReasons() :

  • REASON_CRASH — exception JVM non catchée
  • REASON_CRASH_NATIVE — crash natif NDK (C/C++)
  • REASON_ANR — Application Not Responding (avec la trace ANR)
  • REASON_LOW_MEMORY — kill mémoire (OOM)

Les crashs natifs arrivent au lancement qui suit le crash (l’OS les livre post-mortem), avec mechanism.type = "native" et un tag native.source (metrickit sur iOS, app_exit sur Android).

Sur la surface très précise iOS 26 + new architecture en production, React Native re-throw les erreurs JS via un void TurboModule sur une dispatch queue asynchrone, que le runtime fait avorter en SIGABRT non rattrapable (RN #54859). Depuis 0.9.1, le SDK détecte cette combinaison précise et supprime le re-throw après avoir capturé l’event — l’app hôte continue de tourner. Tous les autres runtimes (iOS plus anciens, Android, old architecture, mode dev) gardent le comportement React Native par défaut.

Cette page est un alias vers la documentation principale du SDK React Native. Les guides complets sont déjà disponibles :

Pionne peut afficher la ville/région/pays approximatif de l’utilisateur sur chaque event. Désactivé par défaut pour la vie privée :

Pionne.init({
token: 'pio_live_…',
sendGeography: true, // ← opt-in
});

Au boot, un seul appel HTTP vers https://ipapi.co/json/ (timeout 4 s) résout contexts.geo = { city, region, country, country_code } et le résultat est attaché à tous les events suivants. Aucune permission iOS/Android requise (pas de GPS, juste l’inverse-DNS de l’IP). Si le lookup échoue, le SDK continue sans géo.

Tu peux remplacer le fournisseur via geographyEndpoint: '…' — toute URL renvoyant un JSON { city, region, country, country_code } fonctionne.

Le bundle ID (com.tonapp.app) est auto-pinné côté serveur au premier event reçu. Si quelqu’un vole ton token et l’utilise depuis une autre app, les events sont rejetés automatiquement.