Lección 8 de 20 · Lectura y práctica
Práctica: Desarrollar un módulo personalizado para notificaciones push
Tipo de lección: VideoConcepto claveLos módulos personalizados en Expo son extensiones nativas que permiten acceder a funcionalidades del dispositivo que no están disponibles en las APIs estándar de React Native. Piensa en ellos.
Del concepto a la práctica
Taller de esta lección
La práctica separa el envío de una notificación de la decisión de negocio. El adaptador de prueba recibe un mensaje ya validado y devuelve un resultado local; no se contacta con servicios externos ni se supone que un token sea válido solo por existir.
Ejemplo resuelto
Una tarea con vencimiento recibe {id:"t7", title:"Revisar presupuesto", priority:"high"}. El adaptador simulado valida que id y title existan, asigna prioridad alta y devuelve {accepted:true, taskId:"t7"}. Si falta title, devuelve {accepted:false, reason:"invalid-payload"}. La pantalla muestra estados distintos para aceptada y rechazada. accepted significa solo que el adaptador simulado aceptó el mensaje, no que un proveedor push lo entregó. Un envío remoto real necesita permisos, token del dispositivo y servicio de envío; no incrustes credenciales de proveedor en la aplicación.
Pruébalo
Define el esquema mínimo del mensaje.
Implementa una validación antes de llamar al adaptador.
Prueba una tarea válida y otra incompleta.
Conserva el resultado junto con la hora local de la prueba.
Error frecuente: guardar un token o una respuesta nativa en el estado global sin necesidad. Corrígelo manteniendo el token en el adaptador y exponiendo solo el estado funcional.
Comprueba tu resultado
Debes obtener una aceptación para t7, un rechazo para el mensaje incompleto y ningún envío real. El resultado debe indicar la causa del rechazo.

Mapa de prácticaUna condición decide qué camino ejecuta el programa. Un bucle repite una operación mientras queden elementos, y termina cuando la lista se agota. Separar ambas ideas ayuda a seguir el flujo y comprobar casos límite.
Ver la infografía en tamaño completo ↗Tipo de lección: Video
Concepto clave
Los módulos personalizados en Expo son extensiones nativas que permiten acceder a funcionalidades del dispositivo que no están disponibles en las APIs estándar de React Native. Piensa en ellos como adaptadores especializados que conectan tu aplicación JavaScript con el hardware o servicios nativos del sistema operativo, similar a cómo un traductor profesional conecta dos idiomas en una negociación internacional.
Para las notificaciones push, un módulo personalizado te permite controlar aspectos avanzados como la gestión de tokens, el manejo de notificaciones en primer plano, o la integración con servicios de terceros. A diferencia del módulo estándar de Expo, un módulo personalizado te da control total sobre el flujo, permitiendo optimizaciones específicas para tu caso de uso, como priorizar ciertos tipos de notificaciones o sincronizar con tu backend de manera más eficiente.
Cómo funciona en la práctica
El desarrollo de un módulo personalizado sigue un flujo estructurado. Primero, defines la interfaz JavaScript que usarás en tu aplicación React Native. Luego, implementas la lógica nativa en Java (para Android) y Objective-C/Swift (para iOS). Finalmente, configuras el módulo en tu proyecto Expo usando el archivo expo-module.config.json.
Paso a paso: 1) Crea la estructura del módulo con expo init y configura el proyecto nativo. 2) Define los métodos que expondrás a JavaScript, como registerForPushNotificationsAsync o handleNotificationReceived. 3) Implementa el código nativo para cada plataforma, manejando permisos, tokens y eventos. 4) Prueba el módulo en un proyecto Expo usando expo-dev-client para desarrollo rápido.
Codigo en accion
Aquí tienes un ejemplo funcional de la interfaz JavaScript del módulo:
// CustomPushModule.js
export default {
async registerForPushNotificationsAsync() {
if (!ExpoModules.CustomPushModule) {
throw new Error('Módulo no disponible');
}
return await ExpoModules.CustomPushModule.registerForPushNotificationsAsync();
},
async getPushToken() {
return await ExpoModules.CustomPushModule.getPushToken();
},
addNotificationReceivedListener(listener) {
return ExpoModules.CustomPushModule.addListener('onNotificationReceived', listener);
}
};Y la implementación nativa en Android (Java):
// CustomPushModule.java
package expo.modules.custompush;
import android.content.Context;
import com.google.firebase.messaging.FirebaseMessaging;
import org.unimodules.core.ExportedModule;
import org.unimodules.core.Promise;
import org.unimodules.core.interfaces.ExpoMethod;
public class CustomPushModule extends ExportedModule {
private Context mContext;
public CustomPushModule(Context context) {
super(context);
mContext = context;
}
@Override
public String getName() {
return "CustomPushModule";
}
@ExpoMethod
public void registerForPushNotificationsAsync(Promise promise) {
FirebaseMessaging.getInstance().getToken()
.addOnCompleteListener(task -> {
if (task.isSuccessful()) {
promise.resolve(task.getResult());
} else {
promise.reject("TOKEN_ERROR", "Error al obtener token", task.getException());
}
});
}
}Errores comunes
- No probar en ambas plataformas: Un módulo que funciona en Android puede fallar en iOS debido a diferencias en permisos o APIs. Solución: Usa
expo run:androidyexpo run:iospara pruebas tempranas. - Manejo incorrecto de promesas en código nativo: No resolver o rechazar promesas puede causar memory leaks. Solución: Siempre llama a
promise.resolve()opromise.reject()en cada camino de ejecución. - Olvidar configurar permisos en info.plist/AndroidManifest.xml: Las notificaciones push requieren permisos explícitos. Solución: Verifica que
UIBackgroundModes(iOS) yuses-permission(Android) estén correctamente definidos. - No manejar versiones de Expo SDK: Los módulos pueden romperse con actualizaciones. Solución: Fija versiones en
package.jsony prueba con cada actualización mayor.
Checklist de dominio
- He creado un módulo personalizado que expone al menos 3 métodos JavaScript desde código nativo.
- He implementado la lógica para obtener un token de notificaciones push en Android e iOS.
- He configurado correctamente el archivo
expo-module.config.jsoncon las plataformas soportadas. - He probado el módulo en un proyecto Expo usando
expo-dev-clienty verificado que las notificaciones llegan. - He manejado errores comunes como permisos denegados o falta de conexión en el código nativo.
- He documentado el módulo con ejemplos de uso para otros desarrolladores.
- He optimizado el rendimiento evitando llamadas innecesarias a APIs nativas.
Implementa un módulo personalizado para notificaciones push con manejo de prioridades
En este ejercicio, crearás un módulo personalizado que no solo maneje notificaciones push, sino que también permita asignar prioridades (alta, media, baja) y sincronice el estado con un backend simulado.
- Configura el proyecto: Crea un nuevo módulo Expo usando
expo init --template expo-moduley nómbralocustom-push-priority. - Define la interfaz JavaScript: En
src/CustomPushPriorityModule.ts, exporta métodos para:registerForPushNotificationsAsync(),setNotificationPriority(notificationId, priority), ysyncWithBackend(). - Implementa el código nativo: Para Android (Java), usa
FirebaseMessagingpara obtener el token y añade lógica para almacenar prioridades enSharedPreferences. Para iOS (Swift), usaUserNotificationsyUserDefaults. - Configura el módulo: Añade las plataformas soportadas en
expo-module.config.jsony define los permisos necesarios. - Prueba la integración: En un proyecto Expo separado, instala el módulo localmente con
npm install ../ruta/al/moduloy usaexpo-dev-clientpara enviar notificaciones de prueba con diferentes prioridades. - Documenta y refactoriza: Crea un README.md con ejemplos y optimiza el código para evitar llamadas redundantes a las APIs nativas.
Pistas
- Usa
expo-modules-corepara manejar la comunicación entre JavaScript y nativo de manera eficiente. - Para simular el backend, puedes usar una función que devuelva un Promise con datos estáticos, sin necesidad de un servidor real.
- Considera usar
AsyncStorageen el lado JavaScript para cachear las prioridades y reducir llamadas nativas.
Evalua tu comprension
Completa el quiz interactivo de arriba para ganar XP.
Sigue con Desarrollo Avanzado de Aplicaciones con Expo: De Concepto a Producción
Esta lección forma parte de un curso de Cursalo. Revisa su programa y elige entre la compra individual o el acceso a toda la escuela.
Si ya tenías acceso a este curso, entra con tu cuenta: tus derechos y tu progreso se conservan. No necesitas comprarlo de nuevo.