MedTime - Modulo de Modo Offline
Identificador: MTS-OFF-001
Version: 1.5.0
Fecha: 2025-12-02
Ultima Revision: Iteracion 10 - ACL9-001 Migracion automatica Free a Pro
Autor: SpecQueen
Prioridad: CRITICA (Esencial para v1.0)
1. Descripción General
El Modo Offline garantiza que MedTime funcione completamente sin conexión a Internet. Esta es una funcionalidad ESENCIAL para v1.0, especialmente crítica para usuarios del tier Free que operan 100% en local.
Referencia Canónica (Iteración 11): Las reglas de negocio centrales para modo offline se encuentran en 06-reglas-de-negocio.md.
Ver RN-OFF-001 a RN-OFF-006, RN-BCK-001 a RN-BCK-015, y RN-PER-001 a RN-PER-005 en el documento central.
2. Objetivos
| ID |
Objetivo |
Métrica |
| OFF-OBJ-001 |
Operación completa sin Internet |
100% funcionalidades core disponibles offline |
| OFF-OBJ-002 |
Alertas confiables sin conexión |
0% de alertas perdidas por falta de conexión |
| OFF-OBJ-003 |
Sincronización transparente |
< 5 segundos para sincronizar cambios al reconectar |
| OFF-OBJ-004 |
Integridad de datos |
0% de pérdida de datos por conflictos |
3. Arquitectura Offline
graph TB
subgraph DISPOSITIVO_LOCAL["DISPOSITIVO LOCAL"]
UI["UI/UX Layer"]
LOGIC["Lógica Negocio"]
SCHEDULER["Scheduler Local"]
UI --> BD_LOCAL
LOGIC --> BD_LOCAL
SCHEDULER --> BD_LOCAL
BD_LOCAL["BASE DE DATOS LOCAL<br/>(SQLite / Realm)"]
BD_LOCAL --> COLA_SYNC
COLA_SYNC["COLA DE SINCRONIZACIÓN<br/>(Operaciones pendientes)"]
end
COLA_SYNC -->|Cuando hay conexión<br/>Pro/Perfect| SERVIDOR_CLOUD
SERVIDOR_CLOUD["SERVIDOR CLOUD<br/>(Solo para Pro/Perfect)"]
4. Funcionalidades Offline
4.1. Funcionalidades Disponibles Sin Conexión
| Funcionalidad |
Disponibilidad Offline |
Notas |
| Ver calendario de tomas |
✅ Completa |
Datos locales |
| Confirmar toma de medicamento |
✅ Completa |
Se registra localmente |
| Posponer toma |
✅ Completa |
Reprograma localmente |
| Ver lista de medicamentos |
✅ Completa |
Datos locales |
| Agregar medicamento (manual) |
✅ Completa |
Sin validación de catálogo |
| Editar medicamento |
✅ Completa |
Cambios locales |
| Recibir alertas/recordatorios |
✅ Completa |
Scheduler local |
| Ver estadísticas de adherencia |
✅ Completa |
Cálculo local |
| Ver historial de tomas |
✅ Completa |
Datos locales |
| Gamificación (puntos, rachas) |
✅ Completa |
Cálculo local |
| Gestionar citas |
Completa |
Datos locales |
| Ver recetas guardadas |
Completa |
Almacenamiento local |
| Registrar mediciones |
Completa |
Sin importacion Health Connect |
| Registrar tratamientos |
Completa |
Datos locales |
| Ver historial de eventos |
Completa |
Datos locales |
| Recibir alertas de mediciones |
Completa |
Scheduler local |
4.2. Funcionalidades Degradadas Sin Conexión
| Funcionalidad |
Comportamiento Offline |
Comportamiento Online |
| OCR de recetas |
No disponible |
Procesamiento cloud (Pro/Perfect) |
| Verificación de interacciones |
Última versión cacheada |
Verificación en tiempo real |
| Busqueda en catalogo de medicamentos |
Catalogo local (limitado) |
Catalogo completo |
| Sincronizacion con cuidadores |
Ver seccion 7.5 |
Tiempo real |
| Notificaciones push |
Alertas locales |
Push + locales |
| Importacion Health Connect/HealthKit |
No disponible |
Automatica si configurada |
| Graficas avanzadas de mediciones |
Datos locales ultimos 30 dias |
Historial completo |
| Alertas de valores criticos a cuidadores |
Solo local |
Push inmediato |
Importante: Los calendarios de tomas se sincronizan con los dispositivos de los cuidadores. Si el paciente no registra la toma o no hay conexión, la alerta se generará localmente en los dispositivos de los cuidadores (ver sección 7.5).
4.3. Funcionalidades No Disponibles Offline
| Funcionalidad |
Razón |
Alternativa Offline |
| Crear cuenta nueva |
Requiere verificación |
N/A - Debe estar online |
| Login inicial |
Requiere autenticación |
N/A - Debe estar online primero |
| Compartir con médico |
Requiere envío de datos |
Exportar PDF local |
| Pago de suscripción |
Requiere procesamiento |
N/A |
5. Almacenamiento Local
5.1. Base de Datos Local
| Plataforma |
Tecnología |
Capacidad |
| iOS |
SQLite + Core Data / Realm |
Ilimitado (espacio dispositivo) |
| Android |
SQLite + Room / Realm |
Ilimitado (espacio dispositivo) |
5.2. Datos Almacenados Localmente
| Entidad |
Datos |
Cifrado |
| Usuario |
Perfil completo |
✅ AES-256 |
| Medicamentos |
Todos los activos e históricos |
✅ AES-256 |
| Calendario |
Próximos 30 días + histórico |
✅ AES-256 |
| Tomas |
Registro completo |
✅ AES-256 |
| Recetas |
Imágenes y datos estructurados |
✅ AES-256 |
| Citas |
Todas las programadas |
✅ AES-256 |
| Analisis |
Resultados guardados |
AES-256 |
| Configuracion |
Preferencias del usuario |
AES-256 |
| Catalogo medicamentos |
Version offline (ultima sync) |
No (datos publicos) |
| Mediciones de salud |
Historial completo |
AES-256 |
| Tratamientos |
Historial completo |
AES-256 |
| Fotos de tratamientos |
Almacenamiento local |
AES-256 |
| Recordatorios de eventos |
Proximos 7 dias |
AES-256 |
5.3. Seguridad del Almacenamiento Local
| Aspecto |
Implementación |
| Cifrado en reposo |
AES-256 con clave derivada de biometría/PIN |
| Acceso a datos |
Requiere autenticación biométrica/PIN |
| Borrado seguro |
Sobreescritura al eliminar cuenta |
| Backup local |
Opcional, cifrado con contraseña adicional |
6. Sistema de Alertas Offline
6.1. Arquitectura de Alertas Locales
graph TB
subgraph SCHEDULER_LOCAL["SCHEDULER LOCAL"]
CALENDARIO["Calendario de Tomas"]
GENERADOR["Generador de Alertas<br/>(Calcula próximas)"]
COLA["Cola de Alertas<br/>(Próximos 7 días)"]
DISPARADOR["Disparador de Alerta<br/>- Notificación local<br/>- Sonido<br/>- Vibración"]
CALENDARIO --> GENERADOR
GENERADOR --> COLA
COLA --> DISPARADOR
DISPARADOR --> IOS_NOT["iOS: Local Notifications"]
DISPARADOR --> ANDROID_ALARM["Android: AlarmManager"]
end
6.2. Programación de Alertas
| Plataforma |
Tecnología |
Límite de Alertas |
Persistencia |
| iOS |
UNUserNotificationCenter |
64 pendientes |
Sobrevive reinicio |
| Android |
AlarmManager + WorkManager |
Sin límite práctico |
Sobrevive reinicio |
6.3. Regeneración de Alertas
| Evento |
Acción |
| Apertura de app |
Recalcular y reprogramar próximas 7 días |
| Cambio de medicamento |
Actualizar alertas afectadas |
| Reinicio de dispositivo |
Android: BroadcastReceiver regenera alertas |
| Cambio de zona horaria |
Recalcular todos los horarios |
7. Sincronización (Pro/Perfect)
7.1. Estrategia de Sincronización
flowchart TD
A[Acción del usuario] --> B[Guardar en BD local]
B --> C[Agregar a cola de sync]
D[Detectar conexión] --> E[Procesar cola]
C -.->|Cuando hay conexión| E
E --> F[Enviar al servidor]
F --> G[Confirmar sync]
G --> H[Marcar como sincronizado]
7.2. Cola de Sincronización
| Campo |
Descripción |
| id |
Identificador único de operación |
| tipo |
CREATE, UPDATE, DELETE |
| entidad |
medicamento, toma, cita, etc. |
| datos |
JSON con los datos de la operación |
| timestamp_local |
Momento de la acción (reloj local) |
| intentos |
Número de intentos de sincronización |
| estado |
pendiente, en_proceso, completado, error |
7.3. Resolución de Conflictos
| Escenario |
Estrategia |
Resultado |
| Mismo registro modificado |
Última escritura gana (timestamp) |
Se mantiene el más reciente |
| Registro eliminado remotamente |
Se elimina localmente |
Notificar al usuario |
| Registro creado offline duplicado |
Merge por campos únicos |
Combinar sin duplicar |
| Conflicto no resoluble |
Log de discrepancia |
Usuario decide |
7.4. Límites de Operación Offline
| Tier |
Máximo Offline |
Acción al Exceder |
| Free |
Ilimitado |
N/A (100% local) |
| Pro |
30 días |
Advertencia, degradar a lectura |
| Perfect |
30 días |
Advertencia, degradar a lectura |
7.5. Sincronización de Calendarios con Cuidadores (Pro/Perfect)
7.5.1. Descripción
Los calendarios de tomas del paciente se sincronizan con los dispositivos de los cuidadores que tienen permiso de "recibir alertas". Esto permite que las alertas se generen localmente en el dispositivo del cuidador incluso si:
- El paciente no registra la toma
- No hay conexión entre el servidor y el dispositivo del paciente
- El paciente está offline
7.5.2. Arquitectura
graph TB
subgraph PACIENTE["Dispositivo del Paciente"]
CAL_PAC["Calendario de Tomas"]
ALERT_PAC["Alertas locales para paciente"]
end
subgraph CUIDADOR["Dispositivo del Cuidador"]
CAL_CUID["Calendario de Tomas (copia)"]
ALERT_CUID["Alertas locales para cuidador"]
end
CAL_PAC <-->|sync| CAL_CUID
PACIENTE -->|si hay conexión| SERVIDOR
CUIDADOR -->|si hay conexión| SERVIDOR
SERVIDOR["SERVIDOR<br/>(Coordina sincronización)"]
7.5.3. Flujo de Sincronización
- Paciente configura medicamento con horarios
- Sistema sincroniza calendario al servidor
- Servidor envía calendario a dispositivos de cuidadores con permiso
- Cuidadores programan alertas locales en sus dispositivos
- Si paciente confirma toma → servidor notifica → cuidadores cancelan alerta
- Si paciente NO confirma (o está offline) → alerta local del cuidador se dispara
7.5.4. Configuración de Tiempos
| Parámetro |
Tier Pro |
Tier Perfect |
| Frecuencia de sync de calendario |
Cada cambio + cada 24h |
Cada cambio + cada 12h |
| Ventana de espera antes de alerta a cuidador |
Configurable (15-90 min) |
Configurable (15-90 min) |
| Máximo de cuidadores con sync de calendario |
1 |
5 |
| Máximo de cuidadores totales |
10 |
10 |
Nota para Tier Free: No hay sincronización con cuidadores ya que el tier Free opera 100% local sin conexión a servidor.
7.5.5. Manejo de Background Killers (Android)
Algunos fabricantes (Xiaomi, Huawei, Samsung, OPPO) tienen sistemas agresivos de ahorro de batería que pueden afectar las alertas.
| Paso |
Acción |
| 1 |
Detección de fabricante al instalar la app |
| 2 |
Mostrar guía específica por fabricante para configurar permisos |
| 3 |
Alerta si app no puede ejecutar en background |
| 4 |
Canal especial de notificaciones con alta prioridad |
| 5 |
Documentación detallada en FAQ y onboarding |
7.5.6. Fabricantes con guías específicas
- Xiaomi/Redmi: Permisos de autostart, sin restricción de batería
- Huawei/Honor: Gestión de aplicaciones, arranque automático
- Samsung: Optimización de batería, aplicaciones sin monitorear
- OPPO/OnePlus: Gestión de batería, aplicaciones protegidas
7.5.7. Comportamiento Offline del Cuidador
| Escenario |
Comportamiento |
| Cuidador online, paciente offline |
Cuidador recibe alerta local tras tiempo de espera |
| Cuidador offline, paciente offline |
Ambos tienen alertas locales programadas |
| Cuidador online, paciente confirma |
Cuidador recibe notificación de confirmación |
| Calendario actualizado mientras cuidador offline |
Se sincroniza cuando cuidador reconecta |
8. Tier Free: Operación 100% Local
8.1. Características Específicas
| Aspecto |
Comportamiento |
| Almacenamiento |
100% en dispositivo |
| Sincronización cloud |
No disponible |
| Backup |
Solo local (exportar archivo) |
| Cuidadores |
No disponibles (requiere sync) |
| OCR/IA |
No disponible |
| Múltiples dispositivos |
No (datos en un solo dispositivo) |
8.2. Migracion a Pro/Perfect (ACL9-001)
Decision del Director Round 9 (PREG-R9-001): Migracion automatica desde app Free con verificacion de identidad.
8.2.1. Flujo de Migracion Automatica (Upgrade desde App)
| Paso |
Descripcion |
| 1 |
Usuario Free selecciona "Upgrade a Pro/Perfect" |
| 2 |
Sistema solicita verificacion PIN/Biometria |
| 3 |
Usuario crea cuenta con email y telefono |
| 4 |
Sistema verifica email y telefono |
| 5 |
Sistema sube datos locales cifrados al cloud |
| 6 |
Se activa suscripcion y sincronizacion |
| 7 |
Funciones Pro/Perfect disponibles inmediatamente |
8.2.2. Flujo Alternativo (Cuenta creada en otro dispositivo)
| Paso |
Descripcion |
| 1 |
Usuario ya tiene cuenta Pro (creada en web/otro dispositivo) |
| 2 |
En app Free, selecciona "Ya tengo cuenta Pro" |
| 3 |
Sistema solicita verificacion PIN/Biometria para exportar |
| 4 |
Usuario exporta archivo .medtime con contrasena |
| 5 |
Usuario hace login con cuenta Pro |
| 6 |
Usuario importa archivo .medtime |
| 7 |
Datos migrados a cuenta Pro |
8.2.3. Reglas de Migracion
| ID |
Regla |
| RN-MIG-001 |
Verificacion PIN/Biometria obligatoria antes de migracion |
| RN-MIG-002 |
Datos locales se mantienen hasta confirmar exito de subida |
| RN-MIG-003 |
Si falla subida, se ofrece exportar archivo como alternativa |
| RN-MIG-004 |
Migracion preserva fechas originales de todos los registros |
8.3. Portabilidad de Datos (Free)
| Funcionalidad |
Descripcion |
| Exportar datos |
Archivo cifrado con contrasena del usuario |
| Importar datos |
Restaurar en mismo u otro dispositivo |
| Formato |
JSON cifrado o PDF (solo lectura) |
8.4. Sistema de Backup Offline para Free (ACL6-003)
Decision ACL6-003: Backup hibrido simple por tier (Free manual, Pro/Perfect automatico).
8.4.1. Descripcion
Los usuarios Free tienen un sistema de backup completamente local que les permite proteger sus datos sin conexion a internet.
8.4.2. Funcionalidades de Backup Free
| Funcionalidad |
Disponible |
Notas |
| Backup manual |
Si |
Usuario inicia el proceso |
| Backup automatico |
No |
Solo para Pro/Perfect |
| Exportar archivo .medtime |
Si |
Archivo cifrado portable |
| Importar backup |
Si |
Restaurar en cualquier dispositivo |
| Almacenamiento cloud |
No |
Solo local |
8.4.3. Flujo de Backup Manual (Free)
flowchart TD
A[Usuario accede a Configuracion > Backup] --> B[Selecciona Crear Backup]
B --> C[Sistema muestra contenido a respaldar]
C --> D[Usuario define contrasena de cifrado]
D --> E[Confirmar contrasena]
E --> F[Sistema genera archivo .medtime]
F --> G[Sistema comprime y cifra datos]
G --> H{Destino del backup?}
H -->|Almacenamiento local| I[Guardar en Descargas]
H -->|Compartir| J[Abrir selector de destino]
H -->|Cloud personal| K[Guardar en iCloud/Google Drive]
I --> L[Mostrar confirmacion con ubicacion]
J --> L
K --> L
L --> M[Registrar fecha de ultimo backup]
8.4.4. Recordatorios de Backup (Free)
| Evento |
Recordatorio |
| 30 dias sin backup |
Notificacion suave |
| 60 dias sin backup |
Notificacion prominente |
| 90 dias sin backup |
Alerta en pantalla principal |
| Cambio de dispositivo detectado |
Sugerir backup inmediato |
8.5. Persistencia de Datos en Desinstalacion (ACL9-005)
Decision del Director Round 9 (PREG-R9-005): Opcion C - Backup manual antes de desinstalar. Si no exporta, datos se pierden.
8.5.1. Descripcion
Cuando un usuario Free desinstala la app, los datos almacenados localmente se pierden a menos que haya exportado un backup previamente. El sistema ofrece un flujo de advertencia y exportacion antes de la desinstalacion.
| Plataforma |
Comportamiento |
Deteccion de Desinstalacion |
| iOS |
Datos se eliminan con la app |
No detectable (limitacion OS) |
| Android |
Datos se eliminan con la app |
Parcialmente detectable |
8.5.3. Estrategias de Proteccion
| Estrategia |
Descripcion |
Implementacion |
| Recordatorios periodicos |
Sugerir backup cada 30 dias |
Notificacion local |
| Alerta al desinstalar (Android) |
Mostrar advertencia si es posible |
BroadcastReceiver |
| Persistencia externa (opcional) |
Guardar en almacenamiento externo |
Usuario decide |
8.5.4. Flujo de Proteccion Pre-Desinstalacion (Android)
flowchart TD
A[Usuario inicia desinstalacion] --> B{Android puede interceptar?}
B -->|Si - algunas versiones| C[Mostrar alerta]
B -->|No| D[App se desinstala sin aviso]
C --> E[Has exportado tus datos?]
E --> F{Usuario responde}
F -->|Si, continuar| G[Desinstalar app]
F -->|No, exportar primero| H[Abrir app en pantalla de backup]
F -->|Ignorar| G
H --> I[Usuario exporta backup]
I --> J[Usuario puede desinstalar manualmente]
8.5.5. Pantalla de Recordatorio de Backup
+--------------------------------------------------+
| PROTEGE TUS DATOS |
+--------------------------------------------------+
Han pasado [X] dias desde tu ultimo backup.
Si desinstalar la app sin exportar tus datos,
los perderas permanentemente.
Datos en riesgo:
- 5 medicamentos activos
- 127 registros de tomas
- 3 recetas guardadas
[Exportar backup ahora] [Recordar manana]
+--------------------------------------------------+
8.5.6. Opciones de Almacenamiento Externo (Opcional)
| Opcion |
Descripcion |
Pros |
Contras |
| iCloud (iOS) |
Almacenar en carpeta de usuario |
Sobrevive reinstalacion |
Ocupa espacio iCloud |
| Google Drive |
Almacenar en carpeta de app |
Sobrevive reinstalacion |
Requiere conexion |
| Descargas locales |
Archivo en carpeta Descargas |
Persiste en dispositivo |
Usuario puede borrarlo |
8.6. Mitigación de Limitaciones iOS (UF-BCK-001)
Decisión Director Iteración 11: Opción B - Recordatorios frecuentes + backup automático a iCloud personal.
8.6.1. Problema
iOS no permite interceptar la desinstalación de apps, lo que significa que los usuarios Free que no exportan backup pierden todos sus datos permanentemente.
8.6.2. Solución Implementada
| Componente |
Descripción |
| Recordatorios frecuentes |
Notificaciones periódicas para hacer backup |
| Backup a iCloud personal |
Guardar en carpeta Documents de iCloud del usuario |
| Guía en onboarding |
Explicar importancia del backup desde el inicio |
8.6.3. Flujo de Backup Automático a iCloud Personal (Free - iOS)
flowchart TD
A[Usuario Free iOS] --> B{Primera configuración?}
B -->|Sí| C[Mostrar guía de backup en onboarding]
C --> D{Usuario activa backup a iCloud?}
D -->|Sí| E[Configurar backup automático semanal]
D -->|No| F[Recordar cada 30 días]
E --> G[Guardar en iCloud/MedTime/backups/]
G --> H[Archivo cifrado con PIN del usuario]
F --> I[Notificación: Protege tus datos]
I --> J{Usuario activa?}
J -->|Sí| E
J -->|No| K[Repetir en 30 días]
8.6.4. Recordatorios de Backup (iOS Free)
| Evento |
Frecuencia |
Mensaje |
| Sin backup configurado |
Cada 7 días |
"Protege tus datos médicos" |
| Backup antiguo (>14 días) |
Cada 3 días |
"Tu backup tiene X días" |
| Cambios significativos |
Inmediato |
"Nuevos medicamentos sin respaldar" |
| Post-onboarding |
Día 1, 3, 7 |
"¿Ya configuraste tu backup?" |
8.6.5. Pantalla de Configuración iCloud (iOS Free)
+--------------------------------------------------+
| BACKUP A ICLOUD PERSONAL |
+--------------------------------------------------+
Tu iPhone puede guardar automáticamente una copia
de seguridad de MedTime en tu iCloud personal.
[ ] Activar backup automático a iCloud
└─ Frecuencia: [Semanal v]
└─ Cifrado: Con tu PIN de MedTime
└─ Ubicación: iCloud Drive/MedTime/
Espacio usado: 2.3 MB de tu iCloud personal
[!] IMPORTANTE:
Si desinstalar la app sin backup, tus datos
se perderán permanentemente.
[Activar backup a iCloud] [Ahora no]
+--------------------------------------------------+
8.6.6. Ubicación del Backup en iCloud
iCloud Drive/
└── MedTime/
└── backups/
├── medtime_backup_2025-12-01.medtime (cifrado)
└── medtime_backup_2025-11-24.medtime (cifrado)
8.6.7. Reglas de Negocio Mitigación iOS
| ID |
Regla |
| RN-IOS-001 |
Backup a iCloud personal es opcional pero altamente recomendado |
| RN-IOS-002 |
Frecuencia mínima de backup: semanal |
| RN-IOS-003 |
Archivos cifrados con PIN del usuario (AES-256) |
| RN-IOS-004 |
Máximo 4 versiones de backup en iCloud (auto-limpieza) |
| RN-IOS-005 |
Recordatorio persistente si backup > 14 días |
| RN-IOS-006 |
Onboarding iOS Free debe enfatizar importancia del backup |
8.6.8. Reglas de Negocio Persistencia
| ID |
Regla |
| RN-PER-001 |
Datos Free se eliminan al desinstalar si no hay backup |
| RN-PER-002 |
Sistema recomienda backup cada 30 dias |
| RN-PER-003 |
Alerta de desinstalacion solo disponible en Android (si OS lo permite) |
| RN-PER-004 |
Usuario puede optar por almacenamiento externo para mayor seguridad |
| RN-PER-005 |
Pro/Perfect: datos persisten en cloud independiente de la app |
8.6.9. Restauracion de Backup (Free)
- Usuario instala MedTime en nuevo dispositivo
- Selecciona "Tengo un backup"
- Selecciona archivo .medtime
- Ingresa contrasena de cifrado
- Sistema verifica integridad
- Sistema restaura todos los datos
- Usuario configura alertas locales
8.6.10. Reglas de Backup Offline
| ID |
Regla |
| RN-BCK-011 |
Backup Free siempre es manual (nunca automatico) |
| RN-BCK-012 |
Archivo .medtime incluye cifrado AES-256 |
| RN-BCK-013 |
Contrasena de backup es definida por usuario |
| RN-BCK-014 |
Recordatorio de backup a los 30/60/90 dias |
| RN-BCK-015 |
Restauracion verifica integridad antes de aplicar |
9. Indicadores de Estado
9.1. Indicador de Conexión
| Estado |
Indicador Visual |
Comportamiento |
| Online |
✓ Verde (sutil) |
Sincronización activa |
| Offline |
○ Gris |
Modo offline activo |
| Sincronizando |
↻ Azul |
Procesando cola |
| Error de sync |
⚠ Amarillo |
Reintentos pendientes |
9.2. Indicador de Datos Pendientes
| Elementos |
Indicador |
| 0 pendientes |
Sin indicador |
| 1-10 pendientes |
Badge pequeño |
| 11+ pendientes |
Badge con número |
| Error de sync |
Badge rojo |
10. Casos de Uso
10.1. Usuario Sin Internet Todo el Día
1. Usuario despierta, abre app (offline)
2. Ve calendario del día normalmente
3. Recibe alerta de medicamento (notificación local)
4. Confirma toma desde notificación
5. Registro se guarda localmente
6. Estadísticas se actualizan localmente
7. Al llegar a casa (WiFi), datos se sincronizan (Pro/Perfect)
10.2. Viaje Sin Conexión (1 Semana)
1. Antes del viaje: app sincroniza y programa 7 días de alertas
2. Durante viaje: todas las funciones operan normalmente
3. Registros de toma se acumulan localmente
4. Al volver: sincronización automática de todos los registros
5. Cuidadores ven historial actualizado
10.3. Usuario Free (100% Local)
1. Usuario descarga app y crea cuenta local
2. Agrega medicamentos manualmente
3. Configura horarios
4. Usa app indefinidamente sin conexión
5. Datos nunca salen del dispositivo
6. Si cambia de teléfono: exporta/importa archivo cifrado
11. Requisitos Técnicos
11.1. Espacio de Almacenamiento
| Uso |
Espacio Estimado |
| App base |
~50 MB |
| Catálogo offline |
~20 MB |
| 1 año de datos de usuario típico |
~10 MB |
| 10 recetas con imágenes |
~50 MB |
| Total típico |
~130 MB |
11.2. Consumo de Batería
| Componente |
Impacto |
Optimización |
| Alertas programadas |
Mínimo |
Usar APIs nativas del sistema |
| Base de datos local |
Bajo |
Transacciones batch |
| Sincronización |
Moderado |
Solo con WiFi (configurable) |
12. Testing Offline
12.1. Escenarios de Prueba
| ID |
Escenario |
Resultado Esperado |
| OFF-T-001 |
Activar modo avión, confirmar tomas |
Registro exitoso local |
| OFF-T-002 |
7 días offline, reconectar |
Sincronización completa |
| OFF-T-003 |
Modificar mismo registro offline/online |
Resolución correcta de conflicto |
| OFF-T-004 |
Reiniciar dispositivo |
Alertas se mantienen programadas |
| OFF-T-005 |
Cambiar zona horaria |
Alertas se recalculan |
13. Casos de Error
13.1. ERR-OFF-001: Conflicto de Sincronización
| Campo |
Valor |
| Código |
ERR-OFF-001 |
| Descripción |
Datos modificados offline entran en conflicto con datos del servidor |
| Causa |
Usuario edita mismo registro en dos dispositivos, o offline y un cuidador online |
| Detección |
version_local != version_servidor al intentar sync |
| Acción Usuario |
Mostrar: "Hay cambios en conflicto. ¿Cuál versión conservar?" con vista de diferencias |
| Acción Sistema |
Pausar sync del registro conflictivo, mostrar ambas versiones, registrar resolución |
| Severidad |
Media |
| Recuperación |
Usuario elige versión ganadora o hace merge manual |
13.2. ERR-OFF-002: Espacio Insuficiente para Sync
| Campo |
Valor |
| Código |
ERR-OFF-002 |
| Descripción |
No hay espacio suficiente en dispositivo para descargar datos pendientes |
| Causa |
Dispositivo lleno, demasiados datos acumulados en servidor |
| Detección |
Error de escritura a disco durante sync |
| Acción Usuario |
Mostrar: "No hay espacio para sincronizar [X] MB. Libera espacio o descarga parcialmente." |
| Acción Sistema |
Pausar sync, ofrecer sync parcial (solo críticos), no perder datos locales |
| Severidad |
Media |
| Recuperación |
Usuario libera espacio o sincroniza parcialmente |
13.3. ERR-OFF-003: Base de Datos Local Corrupta
| Campo |
Valor |
| Código |
ERR-OFF-003 |
| Descripción |
La base de datos SQLite local está corrupta o inaccesible |
| Causa |
App crashea durante escritura, reinicio forzado, error de disco |
| Detección |
Error de integridad al abrir base de datos |
| Acción Usuario |
Mostrar: "Hay un problema con tus datos locales. Intentando reparar..." |
| Acción Sistema |
Intentar VACUUM y reparación, si falla restaurar desde backup local, último recurso: re-sync desde cloud |
| Severidad |
Alta |
| Recuperación |
Reparación automática -> backup local -> re-sync cloud |
13.4. ERR-OFF-004: Alertas No Programadas
| Campo |
Valor |
| Código |
ERR-OFF-004 |
| Descripción |
Sistema operativo no permite programar alertas (permisos denegados) |
| Causa |
Usuario denegó permisos, límite de alarmas del OS, ahorro de batería agresivo |
| Detección |
API de notificaciones retorna error |
| Acción Usuario |
Mostrar: "No podemos enviarte recordatorios. Revisa permisos en Configuración." con link directo |
| Acción Sistema |
Guardar tomas programadas, reintentar al siguiente inicio, badge en app de recordatorios pendientes |
| Severidad |
Alta |
| Recuperación |
Usuario habilita permisos, sistema reprograma alertas pendientes |
13.5. ERR-OFF-005: Backup a iCloud Falla
| Campo |
Valor |
| Código |
ERR-OFF-005 |
| Descripción |
No se puede guardar backup en iCloud personal (iOS Free) |
| Causa |
iCloud lleno, usuario no logueado en iCloud, sin conexión |
| Detección |
Error de escritura a iCloud Drive |
| Acción Usuario |
Mostrar: "No pudimos guardar tu backup en iCloud: [razón]. Alternativas: exportar archivo." |
| Acción Sistema |
Ofrecer exportar archivo local como alternativa, programar reintento, no mostrar como exitoso |
| Severidad |
Media |
| Recuperación |
Usuario corrige problema de iCloud o usa backup alternativo |
13.6. Reglas de Manejo de Errores Offline
| ID |
Regla |
| RN-ERR-OFF-001 |
Conflictos de sync NUNCA borran datos automáticamente |
| RN-ERR-OFF-002 |
Datos locales tienen prioridad sobre cloud si no hay conexión |
| RN-ERR-OFF-003 |
Corrupción de DB intenta 3 niveles de recuperación antes de pedir re-sync |
| RN-ERR-OFF-004 |
App funciona sin permisos de notificación, pero con UX degradada |
| RN-ERR-OFF-005 |
Backup fallido no se reporta como exitoso al usuario |
13.7. Diagrama de Resolución de Conflictos
flowchart TD
A[Sync detecta conflicto] --> B{Tipo de conflicto?}
B -->|Mismo campo| C[Mostrar ambos valores]
B -->|Campos diferentes| D[Auto-merge]
C --> E{Usuario elige}
E -->|Versión local| F[Aplicar local, descartar servidor]
E -->|Versión servidor| G[Aplicar servidor, descartar local]
E -->|Merge manual| H[Abrir editor con ambas versiones]
D --> I[Combinar cambios automáticamente]
I --> J[Notificar usuario del merge]
F --> K[Marcar conflicto resuelto]
G --> K
H --> K
J --> K
K --> L[Continuar sync]
14. API Endpoints de Sincronizacion (Iteracion 13)
Referencia: Ver 11-estandares-api.md para especificaciones completas.
14.1. Endpoints de Sincronizacion
| Metodo |
Endpoint |
Descripcion |
Auth |
| GET |
/v1/sync/status |
Estado de sincronizacion |
Bearer |
| POST |
/v1/sync/push |
Enviar cambios locales |
Bearer |
| GET |
/v1/sync/pull |
Obtener cambios remotos |
Bearer |
| POST |
/v1/sync/resolve |
Resolver conflictos |
Bearer |
14.2. Request/Response Push
14.2.1. Request
{
"device_id": "uuid",
"last_sync": "2025-12-03T08:00:00Z",
"changes": [
{
"entity": "medication_event",
"id": "uuid",
"action": "update",
"data": { ... },
"timestamp": "2025-12-03T08:15:00Z"
}
]
}
14.2.2. Response (200)
{
"data": {
"accepted": 5,
"conflicts": [
{
"id": "uuid",
"local_version": { ... },
"remote_version": { ... },
"resolution_required": true
}
],
"server_time": "2025-12-03T08:20:00Z"
}
}
14.3. Request/Response Resolver Conflicto
14.3.1. Request
{
"conflict_id": "uuid",
"resolution": "keep_local",
"merged_data": null
}
14.3.2. Response (200)
{
"data": {
"resolved": true,
"final_version": { ... }
}
}
15. Referencias
Documento generado por SpecQueen - La especificación funcional ES el sistema.