Appearance
Dispositivos y Distribucion
Requisitos para la certificacion en dispositivos moviles y la distribucion de las aplicaciones PUDO Manager y Carrier App.
1. Aplicaciones Moviles
1.1 PUDO Manager
Aplicacion para operadores de puntos PUDO. Gestiona recepcion, entrega con POD (firma + foto + DNI), handshake dual-QR con transportistas, capacidad y historial.
| Atributo | Valor |
|---|---|
| Plataformas | iOS, Android, macOS (solo desarrollo) |
| Bundle ID iOS/macOS | com.ontime.proximiti.pudoManagerApp |
| Application ID Android | com.ontime.proximiti.pudomanager |
| OIDC redirect URI | com.ontime.proximiti.pudomanager:/callback |
| Flutter SDK | >=3.0.0 <5.0.0 |
| Version actual | 1.0.0+1 |
Permisos requeridos:
| Permiso | Uso | Plataforma |
|---|---|---|
| Camara | Escaneo de codigos de barras y QR | iOS, Android |
| Galeria / Fotos | Captura de POD (foto del paquete, DNI) | iOS, Android |
| Almacenamiento seguro | Tokens JWT, datos de sesion | iOS, Android, macOS |
| Red / Internet | Comunicacion con BFF | Todas |
Dependencias criticas:
| Paquete | Version | Funcion |
|---|---|---|
mobile_scanner | ^3.5.5 | Escaneo de codigos de barras (ZXing engine) |
image_picker | ^1.0.7 | Captura de fotos para POD |
signature | ^5.4.1 | Canvas de firma digital para POD |
flutter_appauth | ^6.0.5 | Autenticacion OIDC (login con Keycloak / Azure AD) |
flutter_secure_storage | ^10.0.0 | Almacenamiento seguro de tokens |
qr_flutter | ^4.1.0 | Generacion de QR para handshake dual |
hive / hive_flutter | ^2.2.3 | Cola offline para operaciones sin conexion |
connectivity_plus | ^5.0.2 | Deteccion de estado de red |
dio | ^5.4.0 | HTTP client con interceptors |
1.2 Carrier App
Aplicacion para transportistas. Gestiona entregas pendientes, handshake dual-QR en centros PUDO, drop-off por lotes, recogida de paquetes caducados y escaneo de codigos de barras.
| Atributo | Valor |
|---|---|
| Plataformas | iOS, Android, macOS (solo desarrollo) |
| Bundle ID iOS/macOS | com.example.carrierApp PLACEHOLDER — debe cambiarse |
| Application ID Android | No configurado — requiere build.gradle Android |
| OIDC redirect URI | Por definir (debe coincidir con el application ID final) |
| Flutter SDK | >=3.0.0 <5.0.0 |
| Version actual | 1.0.0+1 |
ACCION REQUERIDA: El bundle ID
com.example.carrierAppes un placeholder de Flutter. Antes de publicar en tiendas, debe cambiarse a un identificador de produccion (p.ej.com.ontime.proximiti.carrier). Esto afecta a iOS (project.pbxproj,AppInfo.xcconfig), Android (build.gradle,AndroidManifest.xml) y la configuracion OIDC.
Permisos requeridos: identicos a PUDO Manager excepto que no requiere image_picker ni signature (el transportista no captura POD).
Dependencias criticas: mismas que PUDO Manager excepto image_picker y signature que no estan presentes.
2. Versiones Minimas Soportadas
Valores extraidos de la configuracion actual del proyecto.
| Plataforma | Version Minima Actual | Version Recomendada | Fuente | Notas |
|---|---|---|---|---|
| iOS (PUDO Manager) | 14.0 | 16.0+ | Podfile → platform :ios, '14.0' | Requerido por flutter_appauth 6.x |
| iOS (Carrier App) | 11.0 | 16.0+ | project.pbxproj → IPHONEOS_DEPLOYMENT_TARGET | Debe subir a 14.0 minimo para paridad con PUDO Manager |
| Android | API 29 (Android 10) | API 33 (Android 13) | build.gradle → minSdk 29 | Solo configurado en PUDO Manager; Carrier App pendiente |
| Android target | API 34 (Android 14) | API 34+ | build.gradle → targetSdk 34 | Play Store exige target API reciente |
| Android compile | API 36 | — | build.gradle → compileSdk 36 | — |
| macOS | 10.15 (Catalina) | 13.0+ (Ventura) | Podfile → platform :osx, '10.15' | Solo para desarrollo local |
ACCION REQUERIDA (Carrier App): El proyecto Android del Carrier App no tiene
build.gradleconfigurado conapplicationId,minSdk,targetSdkniappAuthRedirectScheme. Debe crearse siguiendo el patron de PUDO Manager antes de cualquier build Android.
3. Matriz de Certificacion de Dispositivos
3.1 Dispositivos Operador PUDO
Uso tipico: punto de venta fijo o semi-fijo. El operador recibe paquetes, escanea codigos, captura firmas y fotos. Conectividad WiFi disponible.
| Requisito | Minimo | Recomendado |
|---|---|---|
| Pantalla | >= 5.5" | >= 6.1" o tablet 8-10" |
| Camara trasera | 8 MP, autofocus | 12 MP+ |
| RAM | 3 GB | 4 GB+ |
| Almacenamiento libre | 500 MB | 1 GB+ |
| Conectividad | WiFi | WiFi + 4G (backup) |
Dispositivos recomendados:
| Dispositivo | Plataforma | Rango precio | Notas |
|---|---|---|---|
| Samsung Galaxy A15 / A25 | Android | Bajo-Medio | Pantalla amplia, buena camara |
| Samsung Galaxy Tab A9 | Android | Medio | Ideal para punto fijo con tablet |
| iPhone SE (3ra gen) | iOS | Medio | Compacto, rendimiento alto |
| iPhone 11 / 12 | iOS | Medio | Pantalla grande, multitarea |
| Xiaomi Redmi Note 13 | Android | Bajo | Alternativa economica |
3.2 Dispositivos Transportista
Uso tipico: en ruta, condiciones de iluminacion variable, uso intensivo de escaneo de codigos de barras. Resistencia y bateria son prioritarios.
| Requisito | Minimo | Recomendado |
|---|---|---|
| Pantalla | >= 5.0" | >= 5.5" |
| Camara trasera | 8 MP, autofocus rapido | 12 MP+ |
| RAM | 3 GB | 4 GB+ |
| Bateria | 3500 mAh | 5000 mAh+ |
| Resistencia | — | IP67 o superior, MIL-STD-810 |
| Conectividad | 4G | 4G + WiFi |
Dispositivos recomendados:
| Dispositivo | Plataforma | Rango precio | Notas |
|---|---|---|---|
| Samsung Galaxy XCover 6 Pro | Android | Medio-Alto | Rugerizado, boton escaneo dedicado |
| Samsung Galaxy XCover 7 | Android | Medio | Resistente, bateria extraible |
| CAT S62 Pro | Android | Alto | Rugerizado extremo, FLIR |
| iPhone SE (3ra gen) | iOS | Medio | Compacto, resistente al agua IP67 |
| Zebra TC22 / TC27 | Android | Alto | Dispositivo enterprise, escaner integrado |
3.3 Escaner de Codigos de Barras
| Metodo | Soporte | Notas |
|---|---|---|
| Camara nativa | Soportado | Via mobile_scanner (motor ZXing). Metodo principal |
| Escaner Bluetooth HID | Compatible | Escaners que emulan teclado (HID mode) funcionan con cualquier campo de texto |
| Zebra DataWedge | Requiere validacion | Android: DataWedge puede enviar escaneados como intents o keystrokes. Requiere pruebas |
| Honeywell SW Wedge | Requiere validacion | Similar a DataWedge; configurar como keyboard output |
Formatos de codigo soportados:
| Formato | Uso en PROXIMITI | Ejemplo |
|---|---|---|
| Code128 | Codigo de barras del envio | PPRX-20260318-00042 |
| QR Code | Handshake dual transportista-PUDO | JSON con shipmentId, nonce, timestamp |
4. Cuentas de Tienda
4.1 Apple App Store Connect
| Elemento | Detalle |
|---|---|
| Tipo de cuenta | Organization (no Individual) — verificacion D-U-N-S requerida |
| Coste | $99 USD / anual |
| Apple Developer Team ID | Proporcionado tras registro |
| Apps a registrar | 2: PUDO Manager + Carrier App |
Certificados y perfiles necesarios:
| Certificado / Perfil | Proposito |
|---|---|
| iOS Distribution Certificate | Firma del binario para App Store |
| Provisioning Profile (App Store) | Uno por app — vincula cert + bundle ID + capabilities |
| Push Notification Certificate (p8 key) | Solo si se implementan push notifications |
Requisitos de la ficha de cada app:
| Requisito | Detalle |
|---|---|
| Screenshots | 6.7" (iPhone 15 Pro Max) y 5.5" (iPhone 8 Plus) minimo |
| Descripcion | Espanol (principal) + Ingles (recomendado) |
| Politica de privacidad | URL publica obligatoria |
| Categoria | Business o Logistics |
| Clasificacion por edad | 4+ (sin contenido restringido) |
| App Review notes | Credenciales de prueba para el reviewer de Apple |
TestFlight (beta testing):
| Paso | Detalle |
|---|---|
| Internal Testing | Hasta 100 testers internos (Apple ID del equipo) |
| External Testing | Hasta 10.000 testers — requiere Beta App Review |
| Expiracion | Builds expiran a los 90 dias |
4.2 Google Play Console
| Elemento | Detalle |
|---|---|
| Tipo de cuenta | Organization developer account |
| Coste | $25 USD (pago unico) |
| Apps a registrar | 2: PUDO Manager + Carrier App |
| Formato de subida | AAB (Android App Bundle) — requerido por Play Store |
Firma de la app:
| Elemento | Detalle |
|---|---|
| Play App Signing | Recomendado — Google gestiona la clave de firma de distribucion |
| Upload key | Keystore generado por el equipo de desarrollo para firmar builds |
| Key alias | Uno por app |
Requisitos de la ficha:
| Requisito | Detalle |
|---|---|
| Screenshots | Minimo 2 por tipo de dispositivo (telefono, tablet 7", tablet 10") |
| Descripcion | Espanol (principal) + Ingles (recomendado) |
| Politica de privacidad | URL publica obligatoria |
| Clasificacion de contenido | Cuestionario IARC obligatorio |
| Target API level | API 34+ (requisito Play Store 2026) |
| Data safety form | Declaracion de datos recopilados (requerida) |
Tracks de testing:
| Track | Testers | Review |
|---|---|---|
| Internal Testing | Hasta 100 — disponible inmediatamente | Sin review |
| Closed Testing (Alpha) | Lista de testers por email | Review automatico |
| Open Testing (Beta) | Cualquiera con enlace | Review automatico |
| Production | Publico | Review completo |
4.3 MDM (Mobile Device Management)
Si Ontime utiliza una solucion MDM (Microsoft Intune, VMware Workspace ONE, MobileIron, etc.), las apps pueden distribuirse sin publicarlas en tiendas publicas.
| Escenario | iOS | Android |
|---|---|---|
| Distribucion via MDM | Apple Business Manager + VPP (Volume Purchase) | Managed Google Play (private apps) |
| Enterprise sideload | No recomendado — Apple elimino Enterprise Distribution para apps publicas | APK directo via MDM |
| Managed App Config | com.apple.configuration.managed | RestrictionsManager API |
| Configuracion remota | URL del BFF, OIDC issuer, feature flags | URL del BFF, OIDC issuer, feature flags |
DECISION REQUERIDA: Ontime IT debe confirmar si las apps seran publicas (App Store + Play Store), privadas (MDM only), o mixtas (Play Store privado + App Store Connect con distribucion unlisted).
5. Proceso de Firma y Build
5.1 iOS
| Paso | Comando / Accion |
|---|---|
| Prerequisito | Xcode 16+ instalado, certificados en Keychain |
| Build release | flutter build ios --release |
| Archive | Xcode → Product → Archive |
| Upload | Xcode Organizer → Distribute App → App Store Connect |
| TestFlight | Automatico tras upload; esperar procesamiento (~15 min) |
| App Review | Enviar para revision desde App Store Connect |
Acciones previas al primer build de produccion:
- [ ] Carrier App: cambiar bundle ID de
com.example.carrierAppa produccion - [ ] Registrar ambos App IDs en Apple Developer Portal
- [ ] Crear Distribution Provisioning Profiles
- [ ] Configurar automatic signing o manual profiles en Xcode
- [ ] Actualizar OIDC redirect URIs en Azure AD para los bundle IDs finales
5.2 Android
| Paso | Comando / Accion |
|---|---|
| Prerequisito | JDK 17+, Android SDK, keystore de release |
| Build AAB | flutter build appbundle --release |
| Build APK (MDM) | flutter build apk --release |
| Upload | Google Play Console → Release → Create release → Upload AAB |
| Internal Testing | Disponible inmediatamente tras upload |
Configuracion de firma (release):
properties
# android/key.properties (NO commitear al repositorio)
storePassword=<password>
keyPassword=<password>
keyAlias=<alias>
storeFile=<path-to-keystore.jks>Acciones previas al primer build de produccion:
- [ ] Carrier App: crear
android/app/build.gradlecompleto (copiar patron de PUDO Manager) - [ ] Generar keystore de release:
keytool -genkey -v -keystore release.jks -keyalg RSA -keysize 2048 -validity 10000 - [ ] Configurar
signingConfigs.releaseenbuild.gradle(ambas apps) - [ ] Habilitar Play App Signing en Google Play Console
- [ ] ProGuard/R8 habilitado por defecto en release — verificar que no ofusca clases necesarias
6. Notificaciones Push (Roadmap)
Actualmente NO implementado. El servicio ws-pprx-notifications es un stub que simula el envio. Solo existen notificaciones in-app.
Si se requiere push para produccion:
| Plataforma | Servicio | Configuracion |
|---|---|---|
| iOS | Apple Push Notification service (APNs) | P8 key (recomendado) o certificado PEM |
| Android | Firebase Cloud Messaging (FCM) | google-services.json por app |
| Flutter | firebase_messaging package | Agregar a pubspec.yaml de ambas apps |
| Backend | ws-pprx-notifications | Integrar FCM Admin SDK (Java) para envio |
Prerequisitos:
- Proyecto Firebase creado con ambas apps registradas
- APNs key (p8) subida a Firebase Console para iOS
google-services.json(Android) yGoogleService-Info.plist(iOS) en cada app- Token de dispositivo registrado en backend al hacer login
- Backend:
firebase-adminSDK enws-pprx-notifications
7. Checklist de Distribucion
| # | Item | PUDO Manager | Carrier App | Responsable |
|---|---|---|---|---|
| 1 | Bundle ID de produccion definido | Listo | Pendiente | Ontime + Dev |
| 2 | Application ID Android definido | Listo | Pendiente | Ontime + Dev |
| 3 | Apple Developer Account activa (Organization) | Ontime | ||
| 4 | Google Play Console activa (Organization) | Ontime | ||
| 5 | Certificado de distribucion iOS generado | Ontime + Dev | ||
| 6 | Provisioning Profiles creados | Dev | ||
| 7 | Keystore Android de release generado | Dev | ||
| 8 | Play App Signing habilitado | Dev | ||
| 9 | Politica de privacidad URL publicada | Ontime Legal | ||
| 10 | Screenshots para App Store | Ontime + Dev | ||
| 11 | Screenshots para Play Store | Ontime + Dev | ||
| 12 | Descripcion de app (ES + EN) | Ontime | ||
| 13 | Clasificacion por edad / contenido completada | Ontime | ||
| 14 | Data safety form (Play Store) completada | Ontime + Dev | ||
| 15 | TestFlight configurado | Dev | ||
| 16 | Internal Testing track (Play Store) configurado | Dev | ||
| 17 | MDM evaluado (si aplica) | Ontime IT | ||
| 18 | Push notifications configuradas (si aplica) | Ontime + Dev | ||
| 19 | OIDC redirect URIs registrados en Azure AD | Ontime IT | ||
| 20 | BFF production URL configurado en las apps | Ontime IT + Dev | ||
| 21 | Carrier App iOS deployment target subido a 14.0 | N/A | Pendiente | Dev |
| 22 | Carrier App Android build.gradle creado | N/A | Pendiente | Dev |
| 23 | flutter_secure_storage v10 fix verificado en ambas apps | Dev | ||
| 24 | Pruebas en dispositivos fisicos (minimo 2 iOS + 2 Android) | Dev + QA |