Cómo enviar notificaciones a Slack desde PHP, macOS y Windows

En la actualidad trabajamos con máquinas que realizan procesos largos
o, incluso, esas máquinas están lejos de nosotros. Cuando sucede algún
evento que nos interese, como que ha terminado de procesar un fichero
grande o nuestro sitio web está recibiendo un ataque, recibir una
notificación de este hecho podría ayudarnos a ser más proactivos y vivir
más tranquilos.

Construir un sistema de notificaciones puede ser una tarea enorme e,
incluso, cara económicamente. Pero existen alternativas ya
construidas.

Una forma sencilla de construir nuestro propio sistema de
notificaciones consiste en utilizar Slack y su posibilidad de crear aplicaciones o bots.

La ventaja es que nuestros programas no necesitan conocer cómo
funciona el sistema de notificaciones de Windows, MacOS, Android o iOS.
Solamente tienen que enviar un mensaje a Slack.

¿Qué es Slack?

Slack es una plataforma de comunicación basada principalmente en mensajes organizados mediante espacios de trabajo, canales y conversaciones.

Slack está principalmente orientada a equipos de trabajo pero también
puede resultar útil como herramienta personal. Slack dispone de
aplicaciones para diferentes sistemas operativos y dispositivos móviles,
por lo que un mensaje enviado a nuestro espacio de trabajo puede
convertirse inmediatamente en una notificación en nuestro ordenador,
teléfono móvil o smartWatch, dependiendo de cómo tengamos configuradas
las notificaciones.

Esta característica permite utilizar Slack como intermediario entre
nuestros programas y nuestros dispositivos.

Aprender creando

La mejor forma de aprender algo es haciendo algo práctico. Vamos a
crear la infraestructura necesaria para enviar desde nuestro PC con
Windows, nuestro Macbook con MacOS o nuestro hosting web con PHP un
mensaje a Slack para que nos llegue a todos nuestros dispositivos
conectados a Slack.

Técnicamente haremos esto: nuestro programa detectará un determinado
acontecimiento y realizará una petición HTTPS a la API de Slack. Slack
recibirá el mensaje y se encargará de distribuirlo a nuestros
dispositivos conectados.

Esto permite crear multitud de automatizaciones. Por ejemplo:

  • avisarnos cuando finaliza una copia de seguridad;
  • recibir una alerta cuando se produce un error en nuestra página
    web;
  • conocer cuándo termina una tarea programada;
  • avisarnos si queda poco espacio disponible en un servidor;
  • recibir el resultado de un proceso ejecutado mediante
    cron;
  • saber cuándo termina una conversión de vídeo que tarda varias
    horas;
  • recibir una alerta cuando un determinado servicio deja de
    funcionar;
  • conocer cuándo ha finalizado un proceso en nuestro Mac;
  • o recibir desde Windows el resultado de un script de
    mantenimiento.

Slack gratuito y el
límite de aplicaciones

Para realizar este tutorial podemos utilizar un espacio de trabajo
gratuito de Slack.

Conviene distinguir entre una aplicación y un bot. En este artículo crearemos una aplicación personalizada de Slack y dentro de ella utilizaremos un usuario bot para enviar los mensajes.

En el plan gratuito existen límites sobre las aplicaciones e
integraciones que podemos instalar. Por ejemplo, actualmente Slack
establece un límite de 10 aplicaciones de terceros o
aplicaciones personalizadas instaladas
en un espacio de trabajo gratuito.

Podemos crear una única aplicación, por ejemplo, llamada
Notificaciones y utilizar la misma aplicación para enviar notificaciones desde nuestro MacBook, nuestro PC y nuestro hosting web. Incluso podemos crear diferentes canales y desde el programa elegir dónde publicar.

Con este enfoque una única aplicación de Slack puede centralizar las
notificaciones procedentes de muchos sistemas diferentes.

Crear nuestra aplicación en
Slack

El primer paso consiste en crear una aplicación de Slack.

Debemos acceder a la web de la
API de Slack
y crear una nueva aplicación.

Podemos darle un nombre descriptivo como
Notificaciones.

También tendremos que indicar el espacio de trabajo de Slack en el
que queremos instalarla.

Una aplicación de Slack puede disponer de diferentes permisos. Como
en nuestro caso únicamente queremos publicar mensajes, debemos conceder
al bot el permiso OAuth chat:write. Este permiso permite que la aplicación publique mensajes.

Después instalaremos la aplicación en nuestro espacio de trabajo.
Durante el proceso, Slack generará un Bot User OAuth
Token
.

Los tokens de bot suelen comenzar por xoxb-, por ejemplo:

xoxb-XXXXXXXXXXXX-XXXXXXXXXXXX-XXXXXXXXXXXXXXXXXXXXXXXX

Este token es una credencial secreta.

No debemos publicarlo en una página web, subirlo a un repositorio
público ni incluirlo en un ejemplo que vayamos a compartir con otras
personas.

Cualquier persona que consiga un token válido podría utilizar los
permisos asociados a nuestra aplicación.

Si accidentalmente hacemos público el token, debemos revocarlo y
generar unas credenciales nuevas.

Añadir el bot al canal

También necesitaremos un lugar en el que publicar las
notificaciones.

Podemos crear, por ejemplo, un canal llamado
#notificaciones.

Una vez hecho esto necesitaremos conocer el identificador del
canal.

Los identificadores de canales de Slack tienen un aspecto similar a
C0123456789. Este identificador será el que utilizaremos al llamar a la API.

Slack permite otras formas de organizar y enviar mensajes, pero para
un sistema personal de alertas un canal específico suele ser el enfoque
apropiado.

Cómo se envía un mensaje a
Slack

Slack proporciona el método de su API
chat.postMessage.

La petición se realiza mediante HTTPS utilizando la URL
https://slack.com/api/chat.postMessage.

Debemos enviar nuestro token mediante la cabecera HTTP:

Authorization: Bearer TOKEN

y proporcionar como mínimo el canal y el contenido del mensaje.

Conceptualmente enviaremos un documento JSON parecido a este:

{
    "channel": "C0123456789",
    "text": "Copia de seguridad terminada correctamente"
}

Esta operación es independiente del lenguaje de programación que
utilicemos.

Por esta razón podemos realizar exactamente la misma petición desde
PHP, AppleScript, PowerShell, Python, Java, C# o prácticamente cualquier
entorno capaz de efectuar una petición HTTPS.

Vamos a ver tres ejemplos.

Enviar una
notificación a Slack desde PHP

Supongamos que tenemos una página web alojada en un hosting PHP y
queremos recibir una notificación cuando sucede algún
acontecimiento.

Podría tratarse de una tarea ejecutada mediante cron, una copia de seguridad o un proceso interno de nuestra aplicación.

Una implementación sencilla utilizando cURL sería la siguiente:

<?php

$token = getenv('SLACK_BOT_TOKEN');
$canal = 'C0123456789';

$datos = [
    'channel' => $canal,
    'text' => 'Mensaje enviado desde mi servidor PHP'
];

$curl = curl_init('https://slack.com/api/chat.postMessage');

curl_setopt_array($curl, [
    CURLOPT_POST => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER => [
        'Authorization: Bearer ' . $token,
        'Content-Type: application/json; charset=utf-8'
    ],
    CURLOPT_POSTFIELDS => json_encode($datos)
]);

$respuesta = curl_exec($curl);

curl_close($curl);

echo $respuesta;

El token se obtiene mediante:

getenv('SLACK_BOT_TOKEN')

en lugar de escribirlo directamente en el código.

Siempre que nuestro hosting lo permita, resulta preferible almacenar
credenciales y secretos mediante variables de entorno o mediante algún
mecanismo de configuración situado fuera del directorio público de
nuestra página web.

Crear una función
PHP para enviar mensajes

Si vamos a utilizar Slack desde diferentes partes de nuestra
aplicación PHP, podemos encapsular el código anterior en una
función:

function enviarSlack($mensaje)
{
    $token = getenv('SLACK_BOT_TOKEN');
    $canal = 'C0123456789';

    $datos = [
        'channel' => $canal,
        'text' => $mensaje
    ];

    $curl = curl_init('https://slack.com/api/chat.postMessage');

    curl_setopt_array($curl, [
        CURLOPT_POST => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_HTTPHEADER => [
            'Authorization: Bearer ' . $token,
            'Content-Type: application/json; charset=utf-8'
        ],
        CURLOPT_POSTFIELDS => json_encode($datos)
    ]);

    $respuesta = curl_exec($curl);

    curl_close($curl);

    return $respuesta;
}

Ahora podemos enviar una notificación simplemente escribiendo:

enviarSlack('La copia de seguridad ha terminado correctamente.');

Para enviar una notificación de que se ha terminado la copia de
seguridad sería algo como:

if ($copiaCorrecta) {
    enviarSlack('✅ Copia de seguridad terminada correctamente.');
} else {
    enviarSlack('⚠️ Se ha producido un error durante la copia de seguridad.');
}

Podemos incluir en el mensaje cualquier información que resulte
útil:

enviarSlack(
    "Nuevo pedido recibido.\n" .
    "Número: " . $pedido . "\n" .
    "Importe: " . $importe . " euros"
);

De esta manera, un acontecimiento producido en nuestro hosting puede
generar inmediatamente una notificación en nuestro teléfono.

Enviar una
notificación desde un Mac con AppleScript

El mismo sistema puede utilizarse desde macOS.

AppleScript no necesita disponer de una implementación específica de
la API de Slack. Podemos utilizar el comando curl incluido en macOS mediante do shell script.

Un ejemplo sería:

set slackToken to "xoxb-XXXXXXXXXXXX"
set slackChannel to "C0123456789"
set slackMessage to "El proceso del Mac ha terminado correctamente"

set jsonData to "{\"channel\":\"" & slackChannel & "\",\"text\":\"" & slackMessage & "\"}"

set command to "curl -s -X POST " & ¬
    "-H " & quoted form of ("Authorization: Bearer " & slackToken) & " " & ¬
    "-H " & quoted form of "Content-Type: application/json; charset=utf-8" & " " & ¬
    "--data " & quoted form of jsonData & " " & ¬
    quoted form of "https://slack.com/api/chat.postMessage"

do shell script command

En un script real debemos evitar almacenar el token directamente en
el código cuando exista la posibilidad de que ese archivo pueda ser
compartido.

Una posibilidad es guardarlo en una variable de entorno, un archivo
de configuración protegido o utilizar el llavero de macOS.

Avisarnos cuando
termina un proceso en el Mac

Supongamos que utilizamos nuestro Mac para ejecutar una tarea que
tarda mucho tiempo.

Nuestro AppleScript podría realizar primero el proceso:

do shell script "/ruta/a/mi/programa"

y después enviar el mensaje a Slack:

set slackMessage to "El proceso ha terminado."

De esta manera podemos abandonar el ordenador y recibir una
notificación en el teléfono cuando la tarea haya finalizado.

También podríamos utilizar el resultado del proceso para enviar
mensajes diferentes dependiendo de si la operación ha terminado
correctamente o se ha producido algún error.

Enviar
una notificación desde Windows con un archivo BAT

Windows también puede participar en nuestro sistema de
notificaciones.

Podemos utilizar PowerShell para realizar la petición HTTP e
invocarlo desde un archivo .bat.

Por ejemplo, podemos crear un archivo llamado
notificar.bat con el siguiente contenido:

@echo off

set "SLACK_TOKEN=xoxb-XXXXXXXXXXXX"
set "SLACK_CHANNEL=C0123456789"
set "SLACK_MESSAGE=El proceso de Windows ha terminado"

powershell -NoProfile -Command ^
  "$headers = @{ Authorization = 'Bearer %SLACK_TOKEN%' }; ^
   $body = @{ channel = '%SLACK_CHANNEL%'; text = '%SLACK_MESSAGE%' } | ConvertTo-Json; ^
   Invoke-RestMethod -Uri 'https://slack.com/api/chat.postMessage' -Method Post -Headers $headers -ContentType 'application/json; charset=utf-8' -Body $body"
Ejecutar la
notificación después de otro programa

Una utilidad interesante de los archivos BAT consiste en encadenar
varios comandos.

Por ejemplo:

@echo off

backup.exe

if %ERRORLEVEL% EQU 0 (
    call notificar.bat
)

En este ejemplo se ejecuta primero:

backup.exe

y se consulta posteriormente su código de salida.

Podemos desarrollar el ejemplo para generar una notificación
diferente cuando se produzca un error:

@echo off

backup.exe

if %ERRORLEVEL% EQU 0 (
    set "RESULTADO=La copia de seguridad ha terminado correctamente"
) else (
    set "RESULTADO=ERROR: la copia de seguridad ha fallado"
)

A continuación podemos utilizar el valor de RESULTADO como contenido del mensaje enviado a Slack.

El principio es exactamente el mismo que en PHP y AppleScript:
nuestro programa detecta un acontecimiento y realiza una petición a la
API de Slack.

Comprobar la respuesta de
Slack

Hay un detalle importante que no debemos ignorar en una
implementación real.

No basta con comprobar que la conexión HTTPS se ha realizado
correctamente.

La API de Slack devuelve un documento JSON indicando si la operación
ha tenido éxito.

Una respuesta correcta contendrá un valor equivalente a:

{
    "ok": true
}

Mientras que, si existe algún problema, recibiremos una respuesta
similar a:

{
    "ok": false,
    "error": "..."
}

Por tanto, nuestros scripts deberían comprobar el campo
ok cuando sea importante asegurarnos de que la notificación ha sido aceptada por Slack.

Esto permite detectar situaciones como un token incorrecto, permisos
insuficientes o un canal al que la aplicación no puede acceder.

Seguridad

El elemento más delicado de todo este sistema es el token OAuth del
bot.

Debemos tratarlo igual que una contraseña.

En particular, conviene seguir varias reglas:

  • no publicarlo en GitHub ni en otros repositorios públicos;
  • no incluirlo en artículos, capturas de pantalla o
    documentación;
  • evitar almacenarlo directamente dentro del código;
  • impedir que pueda descargarse desde nuestro servidor web;
  • utilizar variables de entorno o mecanismos seguros de almacenamiento
    de credenciales;
  • revocarlo inmediatamente si sospechamos que ha quedado
    expuesto.

También es aconsejable conceder a la aplicación únicamente los
permisos que necesita.

Para los ejemplos de este tutorial nos interesa utilizar
chat:write.

No existe ninguna razón para conceder acceso a mensajes, usuarios,
archivos u otros recursos si nuestra aplicación solamente necesita
publicar una notificación.

Aplicar el principio del mínimo privilegio reduce las consecuencias
de una posible filtración del token.

No utilizar Slack
como sistema de registro

Aunque podemos enviar mensajes automáticos, Slack no debería
convertirse en el registro completo de actividad de nuestro
servidor.

No sería razonable, por ejemplo, enviar una notificación por cada
petición HTTP recibida por una página web.

Las notificaciones deben reservarse para acontecimientos que
realmente queremos conocer.

El envío masivo puede encontrarse con los límites de frecuencia
establecidos por Slack.

Para almacenar grandes cantidades de acontecimientos debemos utilizar
archivos de registro, bases de datos o plataformas específicas de
monitorización. Slack puede actuar como la última etapa del sistema y
avisarnos únicamente cuando ocurre algo que requiere nuestra
atención.

Limitaciones de la cuenta
gratuita

El plan gratuito de Slack es suficiente para un sistema doméstico o
un pequeño sistema de notificaciones como el descrito en este tutorial,
pero debemos tener presentes sus restricciones.

Slack también establece limitaciones sobre el historial disponible en
los espacios de trabajo gratuitos y aplica límites de frecuencia a las
llamadas realizadas contra su API.

Estas restricciones no suelen representar un problema para un sistema
que envía unas pocas alertas al día, pero son importantes si pretendemos
utilizar Slack para registrar automáticamente una gran cantidad de
acontecimientos.

365 Days iOS Accessibility

El proyecto 365 Days iOS Accessibility es una iniciativa orientada a compartir conocimiento práctico sobre accesibilidad en aplicaciones iOS. El proyecto consiste en publicar, durante un año, pequeñas piezas de contenido relacionadas con técnicas, recomendaciones y detalles que pueden ayudar a crear aplicaciones más accesibles.

La accesibilidad en iOS suele asociarse de forma inmediata con VoiceOver, pero el proyecto muestra que el campo es mucho más amplio. En sus publicaciones aparecen temas relacionados con SwiftUI, UIKit, visionOS, accesibilidad en Apple Watch, atajos de teclado, Voice Control, Full Keyboard Access, orientación de pantalla, texto alternativo, prioridades de orden de lectura o adaptación de interfaces a tamaños grandes de texto.

Este enfoque resulta especialmente interesante porque reduce la distancia entre la teoría y la práctica. Muchas veces la accesibilidad se presenta como una obligación general, como una fase de revisión o como una lista de comprobaciones al final del desarrollo. Sin embargo, en el trabajo diario de una aplicación móvil, las barreras suelen aparecer en decisiones pequeñas como un botón sin etiqueta clara, un orden de navegación incorrecto, un gesto sin alternativa, una pantalla que no soporta orientación horizontal, un texto que no crece correctamente o una imagen compartida sin descripción.

El valor de este proyecto está precisamente en señalar esos detalles. No sólo explica que una aplicación debe ser accesible, sino de mostrar cómo se puede mejorar una parte concreta de la interfaz, una interacción concreta o un componente concreto. En una publicación se recuerda, por ejemplo, la importancia de permitir que las imágenes compartidas por los usuarios incluyan texto alternativo para que pueda utilizarse como etiqueta de accesibilidad. En otra se habla de la necesidad de soportar ambas orientaciones cuando sea posible y de evitar obligar al usuario a girar el dispositivo.

Otro aspecto importante es la relación entre distintas herramientas de apoyo. Una aplicación con buen soporte para VoiceOver suele tener una base más sólida para otras formas de interacción, pero eso no significa que todo quede resuelto automáticamente. El proyecto recuerda, por ejemplo, que en Apple Watch puede ser útil implementar acciones rápidas para AssistiveTouch cuando existe una acción principal clara. Este tipo de observaciones ayudan a entender que la accesibilidad no depende de una única tecnología, sino de la capacidad de la interfaz para ofrecer caminos alternativos para la persona usuaria.

Permiso de pegar desde otras apps en iOS

En Apple gran parte de la seguridad de sus sistemas operativos se gestiona mediante permisos. Desde iOS 16.1 existe un permiso que permite controlar al usuario que una app pueda acceder al portapapeles sin control alguno. Esto permite saber si una app está accediendo o modificando el contenido del portapapeles sin que el usuario lo sepa.

Esta configuración se puede personalizar, desde iOS 26, para cada aplicación y evitar que una app en concreto moleste al usuario preguntando si puede acceder al portapapeles. Por ejemplo, podemos evitar esa consulta cuando queramos importar un texto como libro en la app Vox libri.

Para ello debemos ir a los ajustes del iPHone, ir al apartado Apps, buscar la app Vox libri en la lista y buscar un botón llamado Pegar desde otras apps, al tocarlo se abrirá un selector y si elegimos la opción permitir ya no aparecerá la pregunta para acceder al contenido del portapapeles sólo para la app de Vox libri.

La nueva app de entrenamiento neurológico de la ONCE ya está disponible

El Centro de Tiflotecnología e Innovación de la ONCE (CTI) ha anunciado la disponibilidad para descarga de ENTRENO, una nueva aplicación de entrenamiento neurológico orientada a mantener la mente activa mediante una experiencia moderna, directa y especialmente pensada para el uso cotidiano en el móvil.

La propuesta llega como una renovación completa del antiguo Gimnasio Cerebral, con un enfoque actualizado que combina entretenimiento, progresión y retos diarios, sin perder de vista el objetivo de entrenar capacidades cognitivas relevantes para la vida diaria.

Desde la presentación oficial se insiste en que ENTRENO no se limita a proponer minijuegos aislados, sino que estructura el entrenamiento en sesiones breves y repetibles, incorporando retos diarios que favorecen la constancia. Esa continuidad es clave si lo que se busca es reforzar habilidades como la memoria, la atención o la rapidez mental con pequeñas píldoras de práctica distribuida.

Además, la app persigue  mejorar la destreza general en el manejo de dispositivos móviles, haciendo que la interacción con el teléfono forme parte del propio entrenamiento.

Una app accesible, gratuita y pensada para evolucionar

ENTRENO nace, según se explica en los materiales asociados al lanzamiento, como respuesta a una demanda conocida de disponer de una aplicación accesible, divertida y suficientemente desafiante que sustituyera con garantías a la anterior generación de juegos de este estilo.

Aunque está diseñada para personas con discapacidad visual, no se plantea como un producto solo para un perfil, sino como una app inclusiva que puede disfrutar cualquier persona.

La aplicación se distribuye de forma gratuita y se apoya en un planteamiento de accesibilidad amplio, con compatibilidad con lectores de pantalla y ajustes que facilitan la interacción.

El CTI vincula además el lanzamiento con la iniciativa Modos ON, orientada a impulsar el videojuego accesible, lo que ayuda a entender por qué la app adopta un lenguaje de retos, progresión y recompensas que encaja bien con dinámicas de juego.

¿qué juegos incluye?

ENTRENO incorpora nueve juegos relacionados con distintas capacidades cognitivas para el entreno de la memoria, atención, rapidez mental, percepción y funciones ejecutivas como planificar, decidir o resolver problemas.

Los juegos están diseñados para que el entrenamiento no sea abstracto, sino conectado con situaciones reales. Ositos, por ejemplo, se plantea como una tarea de selección bajo reglas cambiantes en la que la clave no es solo reaccionar, sino inhibir respuestas automáticas y sostener la concentración mientras se atienden pedidos que varían. 

En De Pesca el entrenamiento se apoya en la discriminación auditiva y la velocidad de reacción, obligando a diferenciar señales útiles frente a estímulos negativos para una partida exitosa.

El juego de Mayormente lleva el foco al cálculo mental rápido y a la actualización de información bajo presión temporal. La mecánica de comparar resultados de operaciones sencillas, incrementando la dificultad, conecta con tareas muy comunes como estimar importes, cambios o decisiones rápidas en compras.

El juego de Ciudad Bullicio trabaja la capacidad de distinguir sonidos cotidianos y decidir con rapidez si dos estímulos son iguales o distintos, semejante a los procesos de discriminación y comparación auditiva que usamos continuamente al movernos en espacios urbanos.

Esa palabra me suena se orienta a la memoria verbal reciente, con una dinámica de memorización inicial y posterior reconocimiento frente a distracciones.

En Hal Revés el énfasis recae en la flexibilidad cognitiva y en la gestión de interferencias, obligando a responder de manera contraria a lo esperado.

El objetivo de Sónar es esquivar obstáculos guiándose por la información que aporta el sonar.

El juego de Semáforo se centra en la estimación temporal, pidiendo al usuario que cuente mentalmente un número de segundos y ejecute la acción en el momento justo.

El juego de Super Ahorro utiliza el contexto del supermercado para entrenar estimación y comparación de cantidades, planteando el reto de elegir la opción más barata cuando el precio no se presenta de forma directa.

Progresión, niveles y rutina diaria

Uno de los detalles más relevantes en una app de este tipo es cómo evita el estancamiento. En la documentación asociada se indica que cada minijuego dispone de diez niveles de dificultad creciente y que, al superar el nivel máximo, se activa un modo infinito.

La app busca ofrecer un recorrido de aprendizaje claro para quien empieza y, a la vez, garantizar recorrido a medio plazo para quien busca mantener el hábito.

Disponibilidad y requisitos mínimos

ENTRENO está disponible para iOS y Android y, según el anuncio del CTI, requiere como versiones mínimas iOS 13 y Android 6.

Puedes descargar ENTRENO para iPhone desde la AppStore o descargar ENTRENO para Android desde la PlayStore.

En la página de la noticia encontrarás varios videos con más información y tutoriales.

Más voces para idiomas no habituales en iOS con RHVoice

Desde 2023 Apple empezó a permitir que algunas aplicaciones aporten motores de síntesis de voz alternativos que pueden integrarse con VoiceOver y con cualquier app que utilice el motor TTS del sistema. RHVoice es una de esas aplicaciones, y su enfoque es especialmente interesante para quienes priorizan ligereza, rapidez y cobertura lingüística antes que la naturalidad “neuronal” de las voces comerciales.

RHVoice es un sintetizador de voz gratuito y de código abierto, pensado desde el inicio para ser útil a personas ciegas o con dificultad para acceder al texto impreso, y con especial interés en idiomas donde no siempre existen voces “premium” accesibles y de calidad para lectores de pantalla.

Al momento de escribir este artículo se incluyen voces para los idiomas luxemburgués, macedonio y albanés.

Este motor de síntesis de voz emplea síntesis paramétrica estadística (apoyándose en tecnologías abiertas como HTS y software relacionado). Debido a esto el tamaño de descarga suele ser reducido porque se almacenan modelos estadísticos en lugar de ficheros de sonido grandes.

Debido al pequeño tamaño de las voces la naturalidad puede ser inferior a la de sistemas basados en concatenación de grabaciones o redes neuronales, aunque la comprensibilidad de la voz es aceptable.

RHVoice en la App Store

La aplicación está publicada por Non-Routine LLC, es gratuita, ocupa alrededor de 10,5 MB y requiere iOS/iPadOS 16.2 o posterior. También ofrece versión para macOS (13.1 o posterior) y aparece listada para Apple Vision.

RHVoice no incluye voces “de serie”. Esto se hace para reducir el tamaño inicial y para que las actualizaciones de voces sean más simples.

Al abrir la app verás la lista de idiomas disponibles; al entrar en un idioma, se muestran las voces y puedes descargarlas con el botón correspondiente. Dentro de las opciones puedes cambiar entre dos niveles de calidad de voz.

Puedes descargar RHVoice desde la AppStore.

Color Asset Creator

La gestión de colores en proyectos para iOS, iPadOS, macOS o visionOS ha evolucionado mucho en los últimos años. Apple introdujo los color assets como parte de los catálogos de recursos de Xcode, ofreciendo una forma estructurada y escalable de definir la paleta de una aplicación. Sin embargo, la interfaz gráfica actual de Xcode para crear y editar estos recursos presenta graves problemas de accesibilidad para desarrolladores ciegos.

La gestión de colores desde la interfaz gráfica de XCode implica interactuar con controles visuales complejos, selectores de color, paneles flotantes y zonas de arrastre que no siempre exponen correctamente su información a las APIs de accesibilidad. Esto provoca dificultades a la hora de crear o modificar conjuntos de colores o de definir comportamientos en los conjuntos creados.

Con el proyecto Color Asset Creator se propone una solución concreta: una extensión de Xcode diseñada específicamente para crear color assets de forma accesible, aprovechando una interfaz basada en código y controles estándar que sí son compatibles con tecnologías de apoyo.

En lugar de depender del panel visual de Xcode, la extensión ofrece una interfaz basada en formularios y controles estándar que se integran con VoiceOver y con el resto de tecnologías de apoyo. De este modo, un desarrollador ciego puede definir un nuevo color con nombre de forma estructurada, introducir los valores de sus componentes de color mediante campos de texto y controles accesibles y generar los ficheros y entradas necesarias en el catálogo de recursos del proyecto.

Qué son los color assets en Xcode

En XCode, los catálogos de recursos (asset catalogs) permiten agrupar imágenes, colores, símbolos y otros elementos bajo una estructura común, normalmente en ficheros Assets.xcassets. Dentro de estos catálogos, los color assets son definiciones de color con nombre que pueden utilizarse en cualquier parte de la app, tanto en código como en interfaces visuales.

En lugar de definir colores “al vuelo” con valores RGB o hexadecimales dispersos por el código, los color assets permiten centralizar la paleta en un único lugar. Cada entrada de color se guarda como un conjunto (.colorset) con su correspondiente definición interna, tal y como describe la documentación oficial de Apple sobre los tipos de color.

Estos color assets pueden adaptarse a diferentes condiciones: por ejemplo, ofrecer variantes específicas para modo claro y modo oscuro, o para distintos espacios de color. De este modo, el mismo nombre de color se ajusta automáticamente según el contexto visual del sistema, lo que facilita la creación de interfaces coherentes, accesibles y visualmente consistentes.