8. ARQUITECTURA FRONTEND MULTIPLATAFORMA

8.1 Requisitos del Sistema Frontend

El sistema requiere dos aplicaciones en el frontend:

Requisito del Cliente: Desarrollar en un framework multiplataforma con justificación técnica. Se solicitan 3 opciones evaluadas con recomendación final.

8.2 Análisis Comparativo de Frameworks

8.2.1 Opciones Evaluadas

Criterio React Native Flutter Kotlin Multiplatform
Madurez 10+ años (2015) 7 años (2018) 4 años (2020)
Comunidad Muy Grande (118K+ stars) Grande (165K+ stars) Pequeña (7.8K+ stars)
Lenguaje JavaScript/TypeScript Dart Kotlin
Curva de Aprendizaje Baja (JS conocido) Media (Dart nuevo) Media-Alta
Performance Buena (bridge nativo) Excelente (compiled) Excelente (nativo)
Paquetes Disponibles 50,000+ 30,000+ 5,000+
Empresas que lo Usan Meta, Uber, Airbnb, Microsoft Google, Alibaba, BMW JetBrains, Netflix, VMware
Hot Reload ✓ Sí ✓ Sí (ultra rápido) ✓ Sí (limitado)
Acceso APIs Nativas Mediante bridge Via Platform Channels Directo (expect/actual)
Tamaño de App 25-30 MB 15-20 MB 10-15 MB
Tiempo de Desarrollo Rápido Rápido Medio
Costo de Contratación Bajo (devs JS abundantes) Medio (devs Dart escasos) Alto (devs Kotlin especializados)
UI/UX Componentes nativos Material + Cupertino consistente Totalmente nativo
Ideal Para Equipos JS, MVP rápido Apps visuales, UI consistente Apps nativas complejas

8.3 Análisis FODA por Framework

8.3.1 React Native

Fortalezas Debilidades
  • Stack JavaScript compartido con SPA web
  • Reutilización de código entre web y móvil
  • Enorme ecosistema de paquetes
  • Gran comunidad y documentación
  • Fácil contratación de desarrolladores
  • Tiempo de desarrollo rápido
  • Nueva arquitectura Fabric mejora performance
  • Performance inferior a Flutter/Kotlin en animaciones complejas
  • Dependencia de bridge JavaScript-nativo (overhead)
  • Actualizaciones pueden romper compatibilidad
  • Tamaño de app más grande
  • Requiere código nativo ocasionalmente
Oportunidades Amenazas
  • Nueva arquitectura Fabric + TurboModules mejora performance
  • Expo facilita desarrollo y despliegues OTA
  • React Native Web para convergencia total
  • Hermes engine optimizado para móvil
  • Meta podría reducir inversión en el proyecto
  • Flutter ganando cuota de mercado
  • Fragmentación de versiones

8.3.2 Flutter

Fortalezas Debilidades
  • Excelente performance (compilado a código nativo)
  • UI consistente entre plataformas
  • Hot reload extremadamente rápido
  • Respaldado por Google
  • Widget-based arquitectura flexible
  • Ideal para apps con animaciones complejas
  • Requiere aprender Dart (menos común que JS)
  • Contratar talento Dart es más costoso
  • Tamaño de runtime incluido en la app
  • Menor integración con ecosistema web
  • No reutiliza código con SPA web
Oportunidades Amenazas
  • Flutter Web y Desktop en crecimiento
  • Google invierte fuertemente en el proyecto
  • Crecimiento rápido de la comunidad
  • Adopción en empresas grandes
  • Menor adopción que React Native en fintech
  • Dependencia total de Google
  • Ecosistema web menos maduro

8.3.3 Kotlin Multiplatform

Fortalezas Debilidades
  • Performance nativa real (no bridge)
  • Acceso completo a APIs nativas
  • Tamaño de app más pequeño
  • Código compartido solo para lógica de negocio
  • UI totalmente nativa (mejor UX)
  • Tecnología muy joven (solo 4 años estable)
  • Comunidad pequeña, pocos paquetes
  • Requiere devs especializados en Kotlin (costoso)
  • Curva de aprendizaje pronunciada
  • Menor cantidad de recursos y tutoriales
  • No hay reutilización con código web
Oportunidades Amenazas
  • JetBrains invirtiendo fuertemente
  • Adoptado por empresas grandes
  • Futuro prometedor en enterprise
  • Puede no alcanzar masa crítica de adopción
  • Riesgo de fragmentación del ecosistema
  • Herramientas menos maduras

8.4 Recomendación Final: REACT NATIVE

🏆 Decisión Arquitectónica: React Native

Para el proyecto bancario BP, se recomienda React Native por las siguientes razones estratégicas:

8.4.1 Justificación de la Elección

1. Stack Técnico Actual del Equipo

El documento menciona que JavaScript es el lenguaje principal del equipo. React Native permite:

2. Reutilización de Código con SPA Web

Arquitectura de Código Compartido
graph TB
    SharedLogic["SHARED BUSINESS LOGIC
(NPM Package / Monorepo)

• Validación de formularios
• Formateo de datos
• Utilidades comunes
• Constantes y tipos TypeScript
• Lógica de negocio
• GraphQL queries"] SPA["SPA WEB
(React.js)

• React Router
• Tailwind CSS
• Web APIs"] Mobile["APP MÓVIL
(React Native)

• React Navigation
• Native Base
• Native APIs"] SharedLogic --> SPA SharedLogic --> Mobile style SharedLogic fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15 style SPA fill:#E3F2FD,stroke:#2196F3,stroke-width:3px,rx:15,ry:15 style Mobile fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15

Reutilización estimada: 60-70% del código

3. Time-to-Market

Aspecto React Native Flutter Kotlin MP
Desarrollo MVP 3-4 meses 4-5 meses 6-8 meses
Onboarding de Devs 1 semana 3-4 semanas 6-8 semanas
Prototipado Muy rápido Rápido Lento

4. Ecosistema y Madurez

5. Costo de Contratación

Perfil Disponibilidad Salario Promedio (USD/año)
React Native Developer Alta (abundantes) $60,000 - $90,000
Flutter Developer Media (escasos) $70,000 - $100,000
Kotlin MP Developer Baja (muy escasos) $85,000 - $120,000

6. Casos de Éxito en Banca y Fintech

8.4.2 Comparativa de Costos Totales (3 años)

Concepto React Native Flutter Kotlin MP
Desarrollo Inicial $120,000 $150,000 $200,000
Salarios Team (3 años) $540,000 $630,000 $810,000
Mantenimiento $90,000 $100,000 $120,000
Capacitación $10,000 $30,000 $60,000
TOTAL 3 AÑOS $760,000 $910,000 $1,190,000
Ahorro con React Native: $150,000 vs Flutter y $430,000 vs Kotlin MP en 3 años

8.5 Stack Tecnológico Propuesto

8.5.1 Aplicación Móvil (React Native)

Componente Tecnología Justificación
Framework Base React Native 0.73+ Última versión estable con nueva arquitectura Fabric
Navegación React Navigation 6 Estándar de facto, APIs declarativas, TypeScript support
Estado Global Redux Toolkit + RTK Query Gestión de estado predecible + data fetching optimizado
GraphQL Client Apollo Client Caché inteligente, subscriptions, integración React hooks
UI Components NativeBase o React Native Paper Componentes accesibles y bien diseñados
Biometría react-native-biometrics Soporte Face ID, Touch ID, fingerprint
Almacenamiento Seguro react-native-keychain Keychain (iOS) / Keystore (Android) para tokens
Push Notifications @react-native-firebase/messaging Integración con Firebase Cloud Messaging
Analytics Firebase Analytics Tracking de eventos, funnels, retención
Crash Reporting Sentry Error tracking en producción con source maps
Testing Jest + React Native Testing Library Unit + integration tests con mocking robusto
E2E Testing Detox Tests end-to-end en dispositivos reales/emuladores
Code Quality ESLint + Prettier + TypeScript Linting, formateo automático, type safety

8.5.2 Aplicación Web (SPA)

Componente Tecnología Justificación
Framework Base React.js 18+ Mismo ecosistema que móvil, concurrent rendering
Navegación React Router 6 Routing declarativo con data loading
Estado Global Redux Toolkit + RTK Query Mismo stack que móvil = reutilización
GraphQL Client Apollo Client Mismo que móvil = reutilización de queries
UI Framework Tailwind CSS + Headless UI Utility-first CSS, componentes accesibles
Build Tool Vite Build ultra-rápido, HMR instantáneo
Testing Vitest + React Testing Library Tests rápidos con misma API que Jest

8.6 Arquitectura de la Aplicación Móvil

8.6.1 Estructura de Carpetas

Organización del Código
mobile-app/
├── src/
│   ├── components/        # Componentes reutilizables
│   │   ├── Button.tsx
│   │   ├── Input.tsx
│   │   ├── Card.tsx
│   │   └── AccountCard.tsx
│   │
│   ├── screens/          # Pantallas de la app
│   │   ├── Auth/
│   │   │   ├── LoginScreen.tsx
│   │   │   ├── RegisterScreen.tsx
│   │   │   └── BiometricSetupScreen.tsx
│   │   ├── Home/
│   │   │   ├── HomeScreen.tsx
│   │   │   └── AccountDetailScreen.tsx
│   │   ├── Transfers/
│   │   │   ├── TransferScreen.tsx
│   │   │   └── ConfirmTransferScreen.tsx
│   │   └── Profile/
│   │       └── ProfileScreen.tsx
│   │
│   ├── navigation/       # Configuración de navegación
│   │   ├── RootNavigator.tsx
│   │   ├── AuthNavigator.tsx
│   │   └── MainNavigator.tsx
│   │
│   ├── services/         # Llamadas API y lógica de negocio
│   │   ├── api/
│   │   │   ├── apollo-client.ts
│   │   │   ├── auth.service.ts
│   │   │   └── transfer.service.ts
│   │   └── biometric/
│   │       └── biometric.service.ts
│   │
│   ├── store/            # Redux store
│   │   ├── store.ts
│   │   ├── slices/
│   │   │   ├── authSlice.ts
│   │   │   ├── accountSlice.ts
│   │   │   └── transferSlice.ts
│   │   └── api/
│   │       └── apiSlice.ts  # RTK Query
│   │
│   ├── hooks/            # Custom React hooks
│   │   ├── useAuth.ts
│   │   ├── useBiometric.ts
│   │   └── useTransfer.ts
│   │
│   ├── utils/            # Utilidades
│   │   ├── formatters.ts
│   │   ├── validators.ts
│   │   └── constants.ts
│   │
│   ├── types/            # TypeScript types
│   │   ├── auth.types.ts
│   │   ├── account.types.ts
│   │   └── api.types.ts
│   │
│   └── graphql/          # GraphQL queries y mutations
│       ├── queries/
│       │   ├── accounts.gql.ts
│       │   └── transactions.gql.ts
│       └── mutations/
│           └── transfer.gql.ts
│
├── android/              # Código nativo Android
├── ios/                  # Código nativo iOS
├── shared-logic/         # Lógica compartida con web
│   ├── validators/
│   ├── formatters/
│   └── constants/
│
└── __tests__/            # Tests
    ├── unit/
    ├── integration/
    └── e2e/
        

8.6.2 Flujo de Autenticación con Biometría

Login Flow con Face ID / Touch ID
flowchart TD
    Start([Usuario abre app]) --> CheckSession{Tiene sesión activa
y biometría habilitada?} CheckSession -->|Sí| RequestBiometric[Solicita Face ID / Touch ID] CheckSession -->|No| LoginScreen[LoginScreen] RequestBiometric --> BiometricResult{Biometría exitosa?} BiometricResult -->|Sí| RecoverToken[Recupera token desde Keychain] BiometricResult -->|No| BiometricFailed[LoginScreen
con opción de reintentar] RecoverToken --> ValidateToken[Valida token con backend] ValidateToken --> TokenValid{Token válido?} TokenValid -->|Sí| HomeScreen([HomeScreen]) TokenValid -->|No| LoginScreen LoginScreen --> EnterCredentials[Usuario ingresa credenciales] EnterCredentials --> PostLogin[POST OAuth 2.0 /login] PostLogin --> LoginResult{Login exitoso?} LoginResult -->|Sí| SaveTokens[Guardar tokens en Keychain] SaveTokens --> AskBiometric[Preguntar si desea
habilitar biometría] AskBiometric --> HomeScreen LoginResult -->|No| ShowError[Mostrar error] ShowError --> LoginScreen LoginScreen --> ForgotPassword[Olvidé mi contraseña] style Start fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15 style HomeScreen fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15 style LoginScreen fill:#E3F2FD,stroke:#2196F3,stroke-width:3px,rx:15,ry:15 style RequestBiometric fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15 style RecoverToken fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15 style SaveTokens fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15 style ShowError fill:#FFEBEE,stroke:#F44336,stroke-width:3px,rx:15,ry:15 style BiometricFailed fill:#FFEBEE,stroke:#F44336,stroke-width:3px,rx:15,ry:15

8.7 Patrones de Diseño Implementados

8.7.1 Container/Presentational Pattern

Separación clara entre lógica y presentación:

Tipo Responsabilidad Ejemplo
Container (Smart)
  • Maneja estado y lógica de negocio
  • Conecta con Redux/Apollo
  • Maneja side effects
TransferScreenContainer.tsx
Presentational (Dumb)
  • Solo renderiza UI
  • Recibe datos via props
  • Sin lógica de negocio
  • Fácilmente testeable
TransferForm.tsx

8.7.2 Custom Hooks Pattern

Encapsulación de lógica reutilizable:

8.7.3 Atomic Design

Jerarquía de Componentes
flowchart TB
    subgraph Pages["PAGES (Templates)"]
        TransferScreen[TransferScreen.tsx]
    end
    
    subgraph Organisms["ORGANISMS"]
        TransferForm[TransferForm]
        AccountList[AccountList]
        TransactionHistory[TransactionHistory]
    end
    
    subgraph Molecules["MOLECULES"]
        AccountCard[AccountCard]
        InputGroup[InputGroup]
        TransactionItem[TransactionItem]
    end
    
    subgraph Atoms["ATOMS"]
        Button[Button]
        Input[Input]
        Text[Text]
        Icon[Icon]
        Avatar[Avatar]
    end
    
    Pages --> Organisms
    Organisms --> Molecules
    Molecules --> Atoms
    
    style Pages fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15
    style Organisms fill:#E3F2FD,stroke:#2196F3,stroke-width:3px,rx:15,ry:15
    style Molecules fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15
    style Atoms fill:#FFE5E5,stroke:#E74C3C,stroke-width:3px,rx:15,ry:15
        

8.8 Gestión de Estado

8.8.1 Redux Toolkit Setup

Arquitectura de Estado
classDiagram
    class ReduxStore {
        +State Slices
        +RTK Query API Cache
    }
    
    class StateSlices {
        +auth: AuthState
        +accounts: AccountsState
        +transfers: TransfersState
        +ui: UIState
    }
    
    class AuthState {
        +user: User
        +token: string
        +isAuthenticated: boolean
    }
    
    class AccountsState {
        +list: Account[]
        +selected: Account
        +loading: boolean
    }
    
    class TransfersState {
        +pending: Transfer[]
        +history: Transfer[]
    }
    
    class UIState {
        +theme: string
        +language: string
        +notifications: boolean
    }
    
    class RTKQuery {
        +Automatic caching GraphQL queries
        +Invalidación inteligente
        +Polling y refetch automático
    }
    
    ReduxStore *-- StateSlices
    ReduxStore *-- RTKQuery
    StateSlices *-- AuthState
    StateSlices *-- AccountsState
    StateSlices *-- TransfersState
    StateSlices *-- UIState
    
    style ReduxStore fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15
    style StateSlices fill:#E3F2FD,stroke:#2196F3,stroke-width:3px,rx:15,ry:15
    style RTKQuery fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15
        

8.8.2 Persistencia de Estado

Dato Storage Persistencia
Tokens de autenticación Keychain (iOS) / Keystore (Android) Permanente hasta logout
Preferencias de usuario AsyncStorage Permanente
Caché de datos Redux Persist + AsyncStorage Configurable (ej: 24 horas)
Datos sensibles Solo en memoria (Redux) Solo durante sesión activa

8.9 Performance y Optimizaciones

8.9.1 Técnicas de Optimización

Técnica Implementación Beneficio
Lazy Loading React.lazy() para screens pesadas Reduce bundle inicial en 30-40%
Memoization React.memo, useMemo, useCallback Evita re-renders innecesarios
FlatList Optimization windowSize, maxToRenderPerBatch, initialNumToRender Listas de 1000+ items sin lag
Image Optimization react-native-fast-image con caché Carga de imágenes 3x más rápida
Hermes Engine Motor JS optimizado para React Native Reducción 50% en tiempo de inicio
Code Splitting Separar código por features Downloads bajo demanda

8.9.2 Métricas de Performance

Métrica Objetivo Herramienta de Medición
Time to Interactive < 3 segundos Flipper Performance Monitor
Frame Rate 60 FPS consistente Flipper / Perf Monitor
Bundle Size < 25 MB (APK/IPA) Build analytics
API Response Time < 500ms (p95) Apollo DevTools
Crash-free Rate > 99.5% Sentry

8.10 Seguridad en Frontend

8.10.1 Medidas de Seguridad Implementadas

Aspecto Implementación
Almacenamiento de Tokens
  • Keychain (iOS) con kSecAttrAccessibleWhenUnlockedThisDeviceOnly
  • Keystore (Android) con hardware-backed encryption
  • NUNCA en AsyncStorage sin cifrado
Certificate Pinning
  • Pinning del certificado SSL del backend
  • Previene ataques MITM
  • Implementado con react-native-ssl-pinning
Jailbreak/Root Detection
  • Detectar dispositivos comprometidos
  • Bloquear funciones sensibles (transferencias, cambio de clave)
  • Implementado con react-native-device-info
Ofuscación de Código
  • ProGuard (Android) para ofuscar bytecode
  • Bitcode (iOS) para optimización
  • Remover logs en producción
Input Validation
  • Validación en cliente Y servidor
  • Sanitización de inputs
  • Límites de caracteres
Session Timeout
  • 15 minutos de inactividad
  • Requiere biometría o login para reactivar

8.10.2 Prevención de Ataques Comunes

Ataque Prevención
Screenshot / Screen Recording Bloquear capturas en pantallas con datos sensibles
Clipboard Hijacking No copiar datos sensibles al clipboard
Deep Link Exploitation Validar todos los deep links, nunca ejecutar acciones sensibles directamente
Reverse Engineering Ofuscación + detección de debugging + certificate pinning

8.11 Testing Strategy

8.11.1 Pirámide de Testing

Estrategia de Testing
%%{init: {'theme':'base', 'themeVariables': { 'primaryColor':'#FFE5E5','primaryTextColor':'#2C3E50','primaryBorderColor':'#E74C3C','lineColor':'#34495E','secondaryColor':'#E3F2FD','tertiaryColor':'#FFF9C4'}}}%%
graph BT
    subgraph E2E["E2E Tests (5%)"]
        E2E1[Detox]
        E2E2[Flujos completos]
        E2E3[Login, Transfer]
    end
    
    subgraph Integration["Integration Tests (20%)"]
        Int1[React Native Testing Library]
        Int2[Componentes + Redux]
        Int3[Navigation flows]
    end
    
    subgraph Unit["Unit Tests (75%)"]
        U1[Jest]
        U2[Funciones puras]
        U3[Utils, validators]
    end
    
    Unit --> Integration
    Integration --> E2E
    
    style E2E fill:#FFE5E5,stroke:#E74C3C,stroke-width:3px,rx:15,ry:15
    style Integration fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15
    style Unit fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15
        

8.11.2 Cobertura de Tests

Tipo Cobertura Objetivo Qué se Testea
Unit Tests > 80% Utils, formatters, validators, custom hooks
Integration Tests > 60% Componentes con Redux, navigation, API calls
E2E Tests Flujos críticos Login, transferencias, consultas, cambio clave
Snapshot Tests Componentes UI Prevenir regresiones visuales

8.12 CI/CD Pipeline

8.12.1 Pipeline Automatizado

Flujo de CI/CD
flowchart TD
    Start([Developer Push a Git]) --> TriggerCI[Trigger CI
GitHub Actions / GitLab CI] TriggerCI --> Lint[Lint & Type Check] Lint --> LintItems[ESLint
TypeScript compiler] LintItems --> LintCheck{Pasa?} LintCheck -->|No| BlockPR1[Bloquear PR] LintCheck -->|Sí| Tests Tests[Unit & Integration Tests] --> TestItems[Jest - all tests] TestItems --> TestCheck{Pasa?} TestCheck -->|No| BlockPR2[Bloquear PR] TestCheck -->|Sí| Build Build[Build App] --> BuildItems[Android: gradlew assembleRelease
iOS: xcodebuild archive] BuildItems --> BuildCheck{Pasa?} BuildCheck -->|No| NotifyTeam1[Notificar team] BuildCheck -->|Sí| E2E E2E[E2E Tests - Detox] --> E2EItems[Run en emuladores] E2EItems --> E2ECheck{Pasa?} E2ECheck -->|No| NotifyTeam2[Notificar team] E2ECheck -->|Sí| DeployBeta DeployBeta[Deploy to Beta] --> BetaItems[Android: Firebase App Distribution
iOS: TestFlight
Notificar testers] BetaItems --> QA[Manual QA Approval] QA --> Production[Deploy to Production] Production --> ProdItems[Android: Google Play staged rollout
iOS: App Store phased release] ProdItems --> End([Deployment Completo]) style Start fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15 style End fill:#E8F5E9,stroke:#4CAF50,stroke-width:3px,rx:15,ry:15 style Lint fill:#E3F2FD,stroke:#2196F3,stroke-width:3px,rx:15,ry:15 style Tests fill:#E3F2FD,stroke:#2196F3,stroke-width:3px,rx:15,ry:15 style Build fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15 style E2E fill:#FFF9C4,stroke:#FBC02D,stroke-width:3px,rx:15,ry:15 style DeployBeta fill:#FFE5E5,stroke:#E74C3C,stroke-width:3px,rx:15,ry:15 style Production fill:#FFE5E5,stroke:#E74C3C,stroke-width:3px,rx:15,ry:15 style BlockPR1 fill:#FFEBEE,stroke:#C62828,stroke-width:3px,rx:15,ry:15 style BlockPR2 fill:#FFEBEE,stroke:#C62828,stroke-width:3px,rx:15,ry:15

8.12.2 Estrategia de Releases

Ambiente Frecuencia Estrategia
Beta (Internal) Diaria Automatic deployment on merge to develop
Beta (External) Semanal TestFlight / Firebase App Distribution
Production Bi-semanal Staged rollout: 10% → 25% → 50% → 100% en 3 días

8.13 Accesibilidad (a11y)

8.13.1 Estándares de Accesibilidad

8.13.2 Testing de Accesibilidad

Herramienta Uso
@react-native-community/eslint-plugin Linting de reglas de accesibilidad
Flipper Accessibility Inspector Debug de issues de accesibilidad
Manual Testing Testing con VoiceOver y TalkBack habilitados

8.14 Internacionalización (i18n)

8.14.1 Setup de i18n

Aspecto Implementación
Librería react-i18next
Idiomas Soportados Español (es), Inglés (en)
Detección de Idioma Automática según configuración del dispositivo
Formateo de Números Intl.NumberFormat para montos
Formateo de Fechas date-fns con locale support

8.15 Monitoreo y Analytics

8.15.1 Métricas Trackeadas

Categoría Eventos Herramienta
User Engagement
  • App opens
  • Screen views
  • Session duration
Firebase Analytics
Business Metrics
  • Transfers completed
  • Transfer amounts
  • Login success rate
Firebase Analytics + Custom events
Performance
  • App start time
  • Screen load time
  • API response time
Firebase Performance Monitoring
Errors & Crashes
  • Crash reports
  • Error logs
  • Stack traces
Sentry

8.16 Costos de Desarrollo

Concepto Costo Estimado (USD)
Desarrollo MVP (4 meses) $120,000
Apple Developer Account $99/año
Google Play Developer Account $25 (único)
Firebase (Analytics + Performance) $0 (Spark plan gratis)
Sentry (Crash reporting) $26/mes (Team plan)
CI/CD (GitHub Actions) $0 (incluido en GitHub)
Total Primer Año: ~$120,500 (desarrollo + servicios)

✅ Resumen del Capítulo

La arquitectura frontend propuesta con React Native ofrece:

Decisión final: React Native es la mejor opción considerando el stack actual del equipo, time-to-market, costos y reutilización de código.