Solución de problemas comunes y configuración en la librería TSMessages para iOS

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.lock
  • pod cache clean --all
  • pod 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

Etiquetas: iOS Objective-C tsmessages uikit CocoaPods

Publicado el 7-26 21:12