-
Siempre añade módulos Expo con npx expo install: npm install simple puede extraer ABIs nativas no probadas contra tu pin de expo - ejecuta npx expo install --fix después de cada bump del SDK.
-
Trata expo ~57.0.4 como el contrato: Cada versión de expo-* se valida contra SDK 57 - mezclar generaciones causa fallos de compilación nativa, no errores JS elegantes.
-
Ejecuta npx expo doctor antes de compilaciones nativas: Detecta copias duplicadas de React Native, versiones de módulos incorrectas y plugins de configuración faltantes antes de que se quemen minutos costosos de EAS.
-
Los plugins de configuración requieren un nuevo binario: Las cadenas de permisos, modos de fondo e iconos de notificación no son seguros para OTA - planifica lanzamientos en la tienda cuando cambien los plugins.
-
Pre-indicación antes de diálogos de permiso del SO: Muestra rationale en la aplicación (por qué - beneficio) en una pantalla dedicada - solicitar en el primer montaje maximiza los rechazos permanentes.
-
Coincide el plugin con copias en la aplicación: iOS App Review compara descripciones de uso en Info.plist con la interfaz - la copia vaga "necesita ubicación" falla en la revisión.
-
Ofrece caminos de rechazo elegantes: Cuando los usuarios rechazan, muestra la guía de Linking.openSettings() y un modo degradado que siga entregando valor principal sin la capacidad.
-
Solicita el nivel de permiso más estrecho primero: Ubicación Cuando-En-Uso antes de Siempre; cámara solo cuando el usuario toca capturar; biblioteca de fotos solo para selecciones de galería.
-
Registra tareas de TaskManager en alcance global: defineTask en la entrada de la aplicación - nunca dentro de componentes - o los despertares en frío de fondo no encuentran manejador.
-
Importa manejadores de notificación antes del primer push: setNotificationHandler efecto secundario en index.ts o _layout.tsx arriba - no perezosamente dentro de una pantalla.
-
Crea canales de notificación de Android antes de publicar: Android 8+ silenciosamente descarta notificaciones sin un canal - separa canales transaccionales vs de marketing.
-
Registra tokens push en el servidor por dispositivo: Upsert al reinstalar; elimina al cerrar sesión - tokens en estado React solo no sobreviven la muerte del proceso.
-
Prueba push y ubicación de fondo en compilaciones de desarrollo: Expo Go es insuficiente para QA final de credenciales, iconos y UIBackgroundModes.
-
Detén observadores de ubicación al desmontar: subscription.remove() en limpieza de useEffect - observadores olvidados agotan la batería y filtran devoluciones de llamada.
-
Reduce la escala de imágenes antes de vista previa y carga: Las URIs de resolución completa en <Image> causan OOM en Android de nivel medio - cambia el tamaño a 1280-1920px y JPEG 0.7-0.8.
-
Almacena rutas de archivo en SQLite, no blobs: Las fotos y PDFs viven en expo-file-system; las bases de datos contienen solo URIs y metadatos.
-
Prefiere SDK 57 File / Directory / Paths: Usa expo-file-system/legacy solo durante la migración - la concatenación de cadenas de URI es un error de ruta común en Android.
-
Nunca almacenes tokens de actualización en AsyncStorage o archivos simples: Usa expo-secure-store con WHEN_UNLOCKED_THIS_DEVICE_ONLY - ver ../auth-session/securestore-and-keychain-keystore/securestore-and-keychain-keystore.md.
-
Usa expo-crypto para aleatoriedad y resúmenes: Los verificadores de PKCE y los nonces necesitan getRandomBytes - nunca Math.random(); hash de claves de caché, no contraseñas para auth del servidor.
-
Limpia SecureStore al cerrar sesión y cambiar de cuenta: Claves de espacio de nombres por userId; empareja con queryClient.clear() y reinicio de navegación - las entradas de bóveda antiguas son un defecto de seguridad.
-
Las actualizaciones OTA cambian solo JS: Las adiciones de módulos nativos, cadenas de permisos y bumps del SDK necesitan un binario de tienda - usa expo-updates check/fetch/reload solo para correcciones de paquetes.
-
Solicita antes de reloadAsync: La recarga a mitad del formulario pierde estado - busca silenciosamente, recarga en pantallas ociosas o después del consentimiento explícito del usuario.
-
Trata tareas de fondo como una red de seguridad: El flush de NetInfo en primer plano es primario; minimumInterval: 15 minutos no es en tiempo real - trabajo en lote y devuelve Success/Failed honestamente.
-
Mantén manejadores de fondo libres de React: Abre SQLite y fetch de manera imperativa dentro de defineTask - hooks y Query clients no existen en la entrada de despertar del SO.
-
Documenta matrices de capacidad por variante de compilación: Mantén una tabla de qué características del SDK funcionan en dev client vs producción - evita enviar características que solo funcionaron en Expo Go.
Versiones de pila: Esta página fue escrita para React 19.2.3, React Native 0.86.0 y Expo SDK 57 (expo ~57.0.4).