Aunque TSMessages fue una de las librerías más populares para mostrar notificaciones personalizadas en aplicaciones iOS, actualmente se encuentra en estado de abandono. Se recomienda encarecidamente a los desarrolladores migrar hacia RMessage o SwiftMessages. Si aún mantiene proyectos que dependen de esta librería, aquí encontrará soluciones detallladas a los fallos técnicos más habituales.
1. Errores de integración y dependencias
Conflictos con CocoaPods
Si experimenta fallos durante el pod install, generalmente se debe a una incompatibilidad de verisones con el SDK de iOS actual.
# Configuración sugerida para el archivo Podfile
platform :ios, '9.0'
target 'TuAplicacion' do
# Se recomienda fijar la versión 0.9.12 para evitar inconsistencias
pod 'TSMessages', '0.9.12'
end
Para solucionar errores persistentes, ejecute una limpieza profunda del gestor de dependencias:
rm -rf Pods/rm Podfile.lockpod cache clean --allpod install
Archivos de recursos faltantes
Un error común es que la notificación aparezca sin estilos o iconos. Esto ocurre porque el archivo de configuración TSMessagesDefaultDesign.json no se ha incluido correctamente en el Bundle del proyecto. Verifique que los archivos en Pod/Assets/ estén presentes en la sección "Copy Bundle Resources" de su target en Xcode.
2. Problemas de visualización y jerarquía de vistas
Notificaciones que no aparecen o se desplazan
El error más frecuente es no definir un controlador de vista base. TSMessages necesita saber sobre qué contenedor debe renderizar el mensaje.
// Definir el controlador global inicial
[TSMessage setDefaultViewController:self.navigationController];
// Ejemplo de visualización forzada con parámetros específicos
[TSMessage showNotificationInViewController:self
title:@"Error de Red"
subtitle:@"No se pudo conectar al servidor"
image:nil
type:TSMessageNotificationTypeError
duration:TSMessageNotificationDurationAutomatic
callback:nil
buttonTitle:nil
buttonCallback:nil
atPosition:TSMessageNotificationPositionTop
canBeDismissedByUser:YES];
Si la barra de navegación está oculta (navigationBarHidden = YES), la posición de la notificación puede verse afectada. En estos casos, es preferible pasar el controlador de vista actual explícitamente en lugar de confiar en el valor predeterminado.
3. Personalización y Estilos
Fallo al cargar diseños personalizados
Si intenta aplicar un archivo JSON de diseño propio y no observa cambios, asegúrese de que la ruta sea válida antes de intentar añadirlo:
NSString *rutaConfig = [[NSBundle mainBundle] pathForResource:@"MiEstiloPersonal" ofType:@"json"];
if (rutaConfig) {
[TSMessage addCustomDesignFromFileWithName:@"MiEstiloPersonal.json"];
} else {
NSLog(@"Error: Archivo de diseño no localizado.");
}
Uso de UIAppearance para ajustes globales
Puede forzar la apariencia de los mensajes de forma global en el AppDelegate:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
[[TSMessageView appearance] setTitleFont:[UIFont fontWithName:@"Helvetica-Bold" size:17.0]];
[[TSMessageView appearance] setContentFont:[UIFont fontWithName:@"Helvetica" size:13.0]];
[[TSMessageView appearance] setTitleTextColor:[UIColor whiteColor]];
return YES;
}
4. Gestión de memoria y Retain Cycles
Debido al uso intensivo de bloques (blocks) para los botones de acción y los callbacks de finalización, es extremadamente fácil crear ciclos de retención que impidan que el controlador de vista se libere de la memoria.
// Uso correcto de referencias débiles en los callbacks
__weak typeof(self) weakRef = self;
[TSMessage showNotificationInViewController:self
title:@"Nueva Notificación"
subtitle:@"¿Desea actualizar su perfil ahora?"
image:nil
type:TSMessageNotificationTypeMessage
duration:TSMessageNotificationDurationAutomatic
callback:nil
buttonTitle:@"Aceptar"
buttonCallback:^{
// Evitar el uso directo de 'self'
[weakRef procesarActualizaciónDeUsuario];
}
atPosition:TSMessageNotificationPositionTop
canBeDismissedByUser:YES];
5. Control avanzado de la cola de mensajes
Si su aplicación dispara múltiples alertas en un corto periodo de tiempo, es vital gestionar la cola para evitar una experiencia de usuario confusa.
// Comprobar si hay alertas activas antes de mostrar una nueva
if ([TSMessage isNotificationActive]) {
// Podemos descartar la actual para dar prioridad a la nueva
[TSMessage dismissActiveNotificationWithCompletion:^{
NSLog(@"Notificación anterior eliminada con éxito");
}];
}
// Obtener acceso a los mensajes pendientes
NSArray *mensajesEnCola = [TSMessage queuedMessages];
NSLog(@"Mensajes esperando en memoria: %lu", (unsigned long)mensajesEnCola.count);
6. Adaptaicón a rotaciones de pantalla
En versiones antiguas de iOS, la rotación del dispositivo solía dejar la notificación "flotando" en una posición incorrecta. Una solución robusta es escuchar el cambio de orientación y refrescar el estado de la notificación:
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(gestionarRotacion)
name:UIDeviceOrientationDidChangeNotification
object:nil];
- (void)gestionarRotacion {
if ([TSMessage isNotificationActive]) {
[TSMessage dismissActiveNotification];
// Opcional: Volver a disparar la lógica de mostrar mensaje tras un breve delay
}
}
Resumen de errores frecuentes
| Síntoma | Causa Probable | Acción Correctiva |
|---|---|---|
| Iconos invisibles | Assets no vinculados | Añadir carpeta de imágenes al Target |
| Bloqueo del UI | Ciclo de retención en bloques | Implementar patrón __weak / __strong |
| Cuelgue al iniciar | JSON mal formateado | Validar sintaxis del archivo de diseño |