Los simuladores son rápidos; los dispositivos físicos son veraces. La depuración por USB e inalámbrica conectan tu app de SDK 57 al hardware real, y la distribución interna envía compilaciones instalables a QA sin revisión de App Store - el ciclo que todo equipo móvil necesita antes de producción.
Tarjeta de referencia rápida - lista para copiar y pegar.
# Android USB - verifica que el dispositivo sea visibleadb devices# Esperado: <serial> device# Ejecuta una compilación de desarrollo directamente en el teléfono conectadonpx expo install expo-dev-clientnpx expo run:android --device# iOS USB - selecciona el iPhone conectado en Xcode o:npx expo run:ios --device# Inicia Metro para un dev client instalado (misma Wi-Fi o USB)npx expo start --dev-client --lan# Depuración inalámbrica de Android (Android 11+) después del emparejamiento USB inicialadb pair <ip>:<pairing-port> # una sola vez, desde Opciones de Desarrolladoradb connect <ip>:5555adb devices# Compilación QA interna (instalable .ipa / .apk)eas build --profile preview --platform all
Cuándo usarlo:
Validación de cámara, biometría, notificaciones push o háptica que los simuladores falsifican u omiten.
Medición del rendimiento de desplazamiento y memoria en SoCs reales.
QA necesita una compilación instalable sin lanzamiento público en la tienda.
Depuración de problemas de LAN - USB (--localhost / adb reverse) evita Wi-Fi inestable.
Dogfooding de un candidato a lanzamiento en los teléfonos de compañeros a través de TestFlight o pruebas internas de Play.
# Después de que existe eas.json:eas logineas build:configure # si no se ha hecho ya# Desarrollo diario en tu teléfonoeas build --profile development --platform android# Instala desde el código QR/enlace, luego:npx expo start --dev-client# Entregar a QA - distribución interna (sin revisión de tienda)eas build --profile preview --platform ioseas build --profile preview --platform android# iOS → grupo interno de TestFlight; Android → APK directo o pista interna de Play
// App.tsx - muestra el modo de conexión para que QA pueda informar del entorno con precisiónimport { useEffect, useState } from "react";import { StyleSheet, Text, View } from "react-native";import * as Device from "expo-device";import Constants from "expo-constants";export default function App() { const [info, setInfo] = useState("Cargando…"); useEffect(() => { const model = Device.modelName ?? "unknown"; const os = `${Device.osName} ${Device.osVersion}`; const build = Constants.expoConfig?.version ?? "0.0.0"; const channel = Constants.expoConfig?.extra?.eas?.channel ?? "local"; setInfo(`${model} · ${os} · v${build} · channel:${channel}`); }, []); return ( <View style={styles.container}> <Text style={styles.title}>Sonda de dispositivo QA</Text> <Text style={styles.body}>{info}</Text> <Text style={styles.hint}>Agita el dispositivo - menú de desarrollo - Recarga después de que Metro se reconecte.</Text> </View> );}const styles = StyleSheet.create({ container: { flex: 1, justifyContent: "center", alignItems: "center", padding: 24 }, title: { fontSize: 20, fontWeight: "700", marginBottom: 8 }, body: { fontSize: 14, textAlign: "center", color: "#334155" }, hint: { marginTop: 16, fontSize: 12, color: "#64748b" },});
Lo que esto demuestra:
adb devices como la puerta antes de implementaciones Android USB.
npx expo run:android --device / npx expo run:ios --device para compilaciones nativas locales en hardware.
Perfiles eas.json separando desarrollo (dev client + debug) de vista previa (QA interna).
Metadatos de expo-device en pantalla para que los reportes de errores incluyan modelo y SO.
La depuración USB expone el dispositivo a adb (Android) o devicectl/ios-deploy de Xcode (iOS). Expo CLI y npx expo run:* reenvían el bundle de Metro sobre la conexión.
npx expo start --dev-client sirve JavaScript a una compilación de desarrollo instalada - el shell nativo permanece en el teléfono; JS hot recarga sobre LAN, túnel o reenvío de puerto USB.
La depuración inalámbrica mantiene la misma URL de Metro después de emparejar una vez - Android usa adb pair + adb connect; iOS usa emparejamiento inalámbrico de Xcode Window > Devices and Simulators (flujo de iOS 17+ en Xcode 15+).
La distribución interna (distribution: "internal" en eas.json) produce IPAs ad-hoc de iOS (dispositivos registrados) o APKs de Android / cargas de pista interna de Play - no listados públicos en la tienda.
El canal de vista previa se combina bien con EAS Update para que QA pueda recibir bundles OTA de JS después de que el shell nativo está instalado.
Configuración > Acerca del teléfono - toca Número de compilación 7×
Desbloquea menús de desarrollo
Depuración USB
Configuración > Opciones de Desarrollador
Activa
Verificar conexión
Terminal: adb devices
Acepta la huella digital RSA en el teléfono
Ejecutar app
npx expo run:android --device
Compila APK de depuración, instala, inicia Metro
# Reversa de puerto USB - dispositivo llega a localhost de la computadora portátil (funciona cuando LAN está bloqueada)adb reverse tcp:8081 tcp:8081npx expo start --dev-client --localhost
Configuración > Privacidad y Seguridad > Modo de Desarrollador (iOS 16+) - requiere reinicio
Registrar dispositivo
Xcode Window > Devices and Simulators - aprovisionamiento de equipo
Ejecutar app
npx expo run:ios --device o selecciona dispositivo en Xcode
Las Apple IDs gratuitas pueden implementarse en tu propio dispositivo para pruebas limitadas; la distribución de equipo requiere una membresía del Programa de Desarrolladores de Apple.
Conecta por USB - Xcode Devices - casilla de verificación Connect via network
Misma red Mac; dispositivo se muestra como inalámbrico en Xcode
Después de adb connect inalámbrico, ejecuta npx expo start --dev-client --lan y asegúrate de que el teléfono y la computadora portátil compartan una subred (la Wi-Fi de invitados a menudo bloquea el tráfico entre pares).
APK de QA/candidato de lanzamiento o TestFlight interno
production
false
store
App Store / Play producción
# Registra dispositivos de prueba de iOS antes de compilaciones ad-hoc/internas de iOSeas device:create# Envía compilación de vista previa de iOS a probadores internos de TestFlighteas build --profile preview --platform ioseas submit --platform ios --latest
import * as Device from "expo-device";if (__DEV__ && Device.isDevice) { console.log(`Dispositivo físico: ${Device.modelName}, SO ${Device.osVersion}`);}
Instala con npx expo install expo-device - las versiones se alinean con SDK 57 automáticamente.
adb devices muestra unauthorized - El mensaje RSA fue descartado. Solución: Revoca autorizaciones de depuración USB en el teléfono, vuelve a conectar USB, acepta el mensaje.
Compilación de iOS falla con errores de aprovisionamiento - UDID del dispositivo no está en el perfil. Solución: Ejecuta eas device:create y recompila, o registra el dispositivo en el portal de Desarrolladores de Apple.
Metro inalcanzable en LAN - Las redes de invitados bloquean tráfico entre dispositivo y computadora portátil. Solución: Usa adb reverse + --localhost en Android, o --tunnel en ambas plataformas.
Expo Go en dispositivo no coincide con SDK 57 - Expo Go de App Store puede quedarse atrás de tu SDK de proyecto. Solución: Usa una compilación de desarrollo; Expo Go no puede cargar módulos nativos arbitrarios de todos modos.
adb inalámbrico se cae silenciosamente - El teléfono se durmió o cambió de IP. Solución:adb connect de nuevo; mantén habilitada la depuración inalámbrica en Opciones de Desarrollador.
Compilación interna de iOS no se instala - Dispositivo de probador no registrado. Solución: Recopila UDIDs a través de enlace eas device:create antes de compilaciones de preview.
QA prueba rendimiento de depuración - Las compilaciones de depuración incluyen sobrecarga de herramientas de desarrollo. Solución: Envía compilaciones preview o release para aprobación de rendimiento.
¿Cómo verifico que mi teléfono Android está conectado?
adb devices
Deberías ver tu número de serie con el estado device. Si dice unauthorized, acepta el mensaje de depuración en el teléfono.
¿Cómo ejecuto mi app de Expo en un iPhone físico?
Instala Xcode, habilita Modo de Desarrollador en el teléfono, confía en la Mac, luego ejecuta npx expo run:ios --device o selecciona el dispositivo en Xcode. Para compilaciones en la nube, usa eas build --profile development --platform ios e instala desde el enlace.
¿Cuál es la diferencia entre expo start y expo start --dev-client?
--dev-client se enfoca en tu compilación de desarrollo personalizada en lugar de Expo Go. Requerido una vez que expo-dev-client y módulos nativos personalizados están en el proyecto.
¿Cómo funciona la depuración inalámbrica en Android?
En Opciones de Desarrollador > Wireless debugging, empareja con adb pair <ip>:<port> usando el código de seis dígitos, luego adb connect <ip>:5555. El dispositivo debe aparecer en adb devices sin USB.
¿Cómo habilito la depuración inalámbrica en iOS?
Conecta por USB, abre Xcode Window > Devices and Simulators, selecciona tu iPhone, y marca Connect via network. Después del emparejamiento, Xcode y npx expo run:ios --device pueden apuntar al dispositivo inalámbrico.
¿Qué es la distribución interna en EAS?
"distribution": "internal" en eas.json produce compilaciones para probadores registrados - IPAs ad-hoc de iOS, APKs de Android, o pista interna de Play - sin lanzamiento público en la tienda.
¿Cuándo debo usar el perfil preview vs development?
development - ingenieros con menús de desarrollo e iteración rápida. preview - compilaciones de QA más cerca de la producción, instalables a través de TestFlight interno o enlace de APK.
Metro no puede conectar en Wi-Fi - ¿qué ahora?
Intenta npx expo start --dev-client --tunnel, o en Android ejecuta adb reverse tcp:8081 tcp:8081 e inicia con --localhost.
¿Necesito expo-dev-client para pruebas en dispositivo físico?
Solo si usas módulos nativos más allá del bundle de Expo Go. Para picos de solo SDK, escanea el código QR con Expo Go. La mayoría de las apps de producción superan rápidamente a Expo Go.
¿Cómo registro dispositivos iOS para compilaciones internas?
eas device:create
Comparte la URL de registro con los probadores antes de ejecutar eas build --profile preview --platform ios.
¿Puedo instalar una compilación de vista previa de Android sin Google Play?
Sí - establece "buildType": "apk" bajo el perfil de Android. EAS proporciona un enlace de descarga directo que puedes compartir en Slack o por correo electrónico.
¿Por qué mi dispositivo físico es más lento que el simulador?
Las compilaciones de depuración incluyen herramientas de desarrollo, sobrecarga de red de Metro y regulación térmica real. Usa compilaciones release o preview para rendimiento representativo.
¿Qué características de hardware deben probarse en un dispositivo real?
Cámara, notificaciones push, biometría, háptica, GPS preciso, barómetro y tareas en segundo plano. Los simuladores omiten o falsifican estos.
¿Cómo comparto una compilación con QA no-desarrollador?
Ejecuta eas build --profile preview, distribuye el enlace de instalación o invitación de TestFlight, y documenta el canal de Metro si también presionas bundles de EAS Update.