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.

Usar VoiceOver mientras compartes la pantalla con otro Mac

La administración remota de ordenadores presenta un problema particular para las personas que utilizan un lector de pantalla. No basta con transmitir la imagen del escritorio remoto ni con enviar las pulsaciones del teclado. Para que el usuario pueda trabajar de forma autónoma es necesario que la información de accesibilidad del ordenador remoto también esté disponible para el lector de pantalla.

En MacOS no había una solución estable para realizar esto. Pero con la aparición de MacOS 27 Apple ha incorporado una solución dentro del propio sistema operativo. Cuando un usuario de VoiceOver controla otro Mac mediante la aplicación Compartir Pantalla o mediante Apple Remote Desktop, el lector de pantalla puede activarse temporalmente en el ordenador remoto y permitir la exploración de su interfaz desde el Mac local.

Esta nueva característica está incluida entre las capacidades de accesibilidad disponibles en macOS 27 y representa una mejora especialmente relevante para usuarios ciegos que necesitan realizar tareas de soporte, administración o asistencia remota.

El problema de utilizar un lector de pantalla a través de una conexión remota

Una sesión de pantalla compartida está diseñada fundamentalmente para transmitir una representación visual de un escritorio remoto y permitir que otro ordenador envíe órdenes mediante el teclado y el dispositivo apuntador (ratón o trackpad). La mayoría de aplicaciones enfocadas en facilitar el acceso remoto a un dispositivo lo que hacen es una captura de imagen contínua y la envían al dispositivo controlador.

Esta forma de realizar la compartición de escritorio presenta limitaciones evidentes para alguien que depende de un lector de pantallas.

Un lector de pantalla no trabaja simplemente describiendo una imagen de la pantalla. VoiceOver consulta la infraestructura de accesibilidad de macOS para identificar ventanas, botones, campos de texto, tablas, barras de herramientas y otros objetos de la interfaz. También necesita conocer sus nombres, estados, relaciones jerárquicas y posibles funciones.

Disponer de la imagen del escritorio remoto no equivale a disponer de acceso a su interfaz de accesibilidad.

La solución adoptada por Apple consiste en integrar VoiceOver con el mecanismo de pantalla compartida para que el lector pueda trabajar temporalmente con el entorno accesible del ordenador remoto.

VoiceOver se activa temporalmente en el Mac remoto

Cuando se utiliza VoiceOver para controlar otro Mac usando Apple Remote Desktop o la aplicación Compartir Pantalla, macOS puede activar temporalmente VoiceOver en el ordenador remoto.

Este comportamiento no modifica de forma permanente la configuración de VoiceOver del equipo controlado.

Según explica Apple en la documentación de compartir pantalla con VoiceOver, cuando termina la sesión de pantalla compartida se restauran los ajustes originales del dispositivo remoto.

Esto permite utilizar las funciones necesarias para proporcionar accesibilidad durante la conexión sin dejar VoiceOver activado posteriormente ni alterar de manera permanente la configuración habitual del otro usuario.

Desde el punto de vista del diseño de accesibilidad, se trata de una decisión importante. El estado de accesibilidad necesario para la sesión pertenece a la propia sesión y no se convierte automáticamente en una modificación persistente del sistema remoto.

El Mac remoto no empieza a hablar

Activar VoiceOver temporalmente en el ordenador remoto podría provocar una situación problemática si ambos ordenadores comenzasen a reproducir simultáneamente la misma información.

Apple evita este comportamiento haciendo que VoiceOver no reproduzca sonidos ni muestre sus elementos visuales en el dispositivo remoto durante este tipo de sesión.

La salida utilizada por la persona que controla el ordenador se mantiene, por tanto, en el Mac local.

Esta separación resulta especialmente útil en situaciones de soporte técnico. Una persona ciega puede controlar mediante VoiceOver el ordenador de otra persona sin provocar necesariamente que el Mac remoto empiece a verbalizar toda la interfaz a través de sus propios altavoces.

También reduce la duplicación de información y facilita determinar qué sistema está produciendo cada respuesta.

Un cambio de tono diferencia el Mac local del remoto

Trabajar simultáneamente con dos sistemas hace que el usuario necesite saber si VoiceOver está describiendo la interfaz de su propio ordenador o la del ordenador remoto.

Para proporcionar esta referencia, VoiceOver modifica el tono de la voz cuando se interactúa con el dispositivo remoto.

En lugar de depender exclusivamente de mensajes adicionales que interrumpirían constantemente la navegación, VoiceOver utiliza una propiedad de la propia síntesis de voz para comunicar que se ha cambiado de contexto.

El usuario puede así reconocer auditivamente si se encuentra navegando por la interfaz local o por el Mac que está controlando.

Activación de la accesibilidad al comenzar una sesión

Cuando VoiceOver está activo en el Mac local y se inicia una sesión compatible de pantalla compartida, macOS solicita automáticamente que se activen los ajustes de accesibilidad necesarios en el equipo remoto.

Una vez concedido este acceso, el usuario puede desplazarse con VoiceOver hasta la pantalla compartida.

La pantalla remota se presenta como un elemento con el que es necesario interactuar, de forma similar a una tabla, un grupo u otros elementos complejos de la interfaz de macOS.
Para comenzar a explorar su contenido se utiliza el comando:
VO + Mayúsculas + Flecha abajo

Después de comenzar la interacción con la pantalla compartida, los comandos habituales de navegación de VoiceOver pueden utilizarse para recorrer la interfaz del ordenador remoto.

Esto significa que la sesión remota deja de ser únicamente una superficie visual dentro de una ventana y pasa a comportarse como un entorno accesible con el que VoiceOver puede interactuar.

Una herramienta especialmente útil para soporte técnico

Con esta nueva herramienta la posibilidad de proporcionar asistencia remota utilizando VoiceOver ya es posible de forma sencilla y sin necesidad de ninguna aplicación o servicio extra.

Apple Remote Desktop, por ejemplo, está diseñado específicamente para administrar equipos Mac de forma remota. La posibilidad de utilizar VoiceOver durante estas sesiones hace que una parte importante de esas tareas pueda realizarse sin depender de la inspección visual de la pantalla remota.

La accesibilidad deja así de estar limitada al ordenador situado físicamente delante del usuario y pasa a formar parte del propio mecanismo de uso remoto.

Accessible Stopwatch 2.0 ya está disponible para macOS

Accessible Stopwatch, la aplicación para macOS orientada a la gestión del tiempo de forma accesible, ya cuenta con una nueva versión publicada en la MacAppStore.

La aplicación permite utilizar funciones de cronómetro y cuenta atrás desde la barra de menús de macOS, sin mostrar una ventana principal. Este enfoque permite mantener la herramienta siempre disponible sin añadir elementos visuales innecesarios al escritorio ni interrumpir el flujo de trabajo.

La versión 2.0 incorpora más opciones de personalización y añade gestión del tiempo mediante la técnica Pomodoro.

Una herramienta discreta para medir el tiempo

Accessible Stopwatch está pensada para quienes necesitan medir el tiempo de forma rápida, clara y sencilla. Puede utilizarse para controlar cuánto se tarda en completar una tarea, gestionar el tiempo de trabajo de un equipo o llevar el seguimiento de cualquier actividad que requiera un cronómetro fiable.

Al mostrarse en la barra de menús de macOS, la aplicación se mantiene accesible desde cualquier contexto. la persona usuaria puede iniciar, pausar o reiniciar el conteo mediante el ratón o utilizando atajos de teclado, evitando así cambiar de aplicación o interrumpir el trabajo que se esté realizando.

Este diseño resulta especialmente útil para personas que utilizan VoiceOver, para usuarios que prefieren interfaces minimalistas y para perfiles profesionales que necesitan reducir distracciones durante su jornada de trabajo.

Gestión del tiempo con Pomodoro

Una de las principales novedades de Accessible Stopwatch 2.0 es la incorporación de la técnica Pomodoro.

Esta forma de trabajo divide el tiempo en sesiones de concentración y descansos breves. Tras varios ciclos, se realiza un descanso más largo. El objetivo es favorecer la atención sostenida, reducir la fatiga mental y ayudar a mantener un ritmo de trabajo más equilibrado.

La presencia de esta función dentro de una aplicación accesible y poco intrusiva puede resultar útil para profesionales con TDAH, desarrolladores, estudiantes o cualquier persona que necesite una estructura temporal sencilla para organizar sus tareas.

Accesibilidad desde la base

Accessible Stopwatch ha sido diseñada teniendo en cuenta la accesibilidad en macOS.

La aplicación es compatible con VoiceOver, Zoom y el uso mediante teclado. Además, su funcionamiento desde la barra de menús permite acceder a las funciones principales sin depender de una interfaz visual compleja.

## Disponibilidad

Accessible Stopwatch 2.0 está disponible para macOS en la App Store.

Puedes descargar Accessible Stopwatch de la MacAppStore.

Qué son los puntos de ventana de VoiceOver en macOS

VoiceOver ofrece varias formas de orientarse dentro de una aplicación. Se puede navegar elemento a elemento, interactuar con grupos, utilizar el rotor, saltar entre controles, buscar texto o crear referencias propias mediante puntos activos. Cada una de estas herramientas resuelve un problema distinto a la hora de conocer y orientarse dentro de una ventana de una aplicación.

Los puntos de ventana tienen una finalidad muy concreta: ayudar a moverse rápidamente por las zonas importantes de una ventana de aplicación o de una página web.

No están pensados para sustituir la navegación normal, sino para reducir el recorrido cuando una ventana tiene varias regiones relevantes. En lugar de atravesar todos los controles hasta llegar a una barra lateral, una barra de herramientas, un campo de búsqueda o una zona de contenido, se puede saltar entre puntos de ventana y orientarse con más rapidez. VoiceOver crea automáticamente un conjunto de puntos de ventana según el diseño de la aplicación. Esos puntos pueden incluir áreas clave como campos de búsqueda, barras laterales y barras de herramientas. También se pueden crear puntos de ventana propios, tanto en ventanas de aplicaciones como en páginas web.

Qué es un punto de ventana

Un punto de ventana es una referencia a una zona significativa de una ventana o de una página web.

La diferencia con un punto activo es importante. Un punto activo se asigna manualmente a un elemento concreto y se recupera mediante un número. Un punto de ventana, en cambio, funciona más como una marca de navegación dentro de la estructura de una ventana. VoiceOver puede crear algunos automáticamente, y la persona usuaria puede añadir otros cuando necesita destacar una zona concreta.

Esta diferencia hace que los puntos de ventana sean especialmente útiles para orientarse. No se trata sólo de volver a un botón exacto, sino de desplazarse entre partes relevantes de una interfaz. En una aplicación con barra lateral, zona principal, campo de búsqueda y barra de herramientas, los puntos de ventana pueden servir como una especie de mapa práctico.

La interfaz sigue siendo la misma. VoiceOver no cambia la aplicación ni modifica la página web. Lo que cambia es la forma de moverse por ella.

Los puntos de ventana resultan útiles cuando una ventana tiene una estructura estable. Por ejemplo, en una aplicación de correo puede haber una lista de buzones, una lista de mensajes, una zona de lectura y una barra de herramientas. En un navegador puede haber una página con encabezado, navegación, contenido principal y secciones recurrentes. En una aplicación de edición puede haber una barra lateral, una zona de trabajo y varios paneles.

Cuando esas regiones existen y se repiten, los puntos de ventana ayudan a crear una navegación más predecible.

También pueden servir para marcar zonas que VoiceOver no haya elegido automáticamente.

No todas las aplicaciones están estructuradas de la misma manera. VoiceOver puede detectar zonas relevantes según el diseño de la app, pero la relevancia real depende de la tarea. Una zona puede no ser importante para todo el mundo, pero sí serlo para una persona que trabaja cada día con esa aplicación.

Una forma de construir orientación

Los puntos de ventana son una herramienta de orientación. Ayudan a convertir una ventana compleja en un conjunto de zonas reconocibles. VoiceOver ya crea algunos puntos automáticamente, pero también permite añadir referencias propias cuando la estructura detectada no coincide del todo con la forma de trabajar de la persona usuaria.

Su valor no está en memorizar más comandos, sino en reducir navegación innecesaria. Una barra lateral, una zona de contenido, un campo de búsqueda o un panel frecuente pueden convertirse en referencias rápidas dentro de una aplicación.

El papel del rotor

Los puntos de ventana aparecen en el rotor de VoiceOver. Para verlos, se abre el rotor con VO + U y se usan las flechas izquierda o derecha hasta escuchar Puntos de ventana. Desde ahí se puede consultar la lista de puntos disponibles en la ventana actual.

Esto convierte al rotor en una herramienta de orientación. No sólo permite navegar por encabezados, enlaces, controles o elementos web. También puede mostrar las zonas principales que VoiceOver reconoce en la ventana.

La lista del rotor puede incluir puntos creados automáticamente y puntos creados por la persona usuaria. Si se han añadido puntos propios, los más recientes aparecen primero en la lista de puntos de ventana del rotor.

Si se crean muchos puntos de ventana personalizados, el orden de la lista puede reflejar la actividad reciente más que una organización conceptual de la ventana. Por eso, aunque Apple permite crear una cantidad ilimitada de puntos de ventana para una ventana, lo práctico suele ser crear sólo los que aporten valor real para las necesidades de la persona usuarioa.

Cómo crear un punto de ventana

Para crear un punto de ventana, primero hay que situar el foco de VoiceOver sobre el elemento que se quiere marcar. Después se pulsa VO + Comando + Mayúsculas + corchete derecho.

A partir de ese momento, esa zona queda disponible como punto de ventana creado por la persona usuaria. Se puede acceder a ella desde el rotor o mediante los comandos de navegación entre puntos de ventana.

Este procedimiento tiene sentido cuando hay una zona de la ventana que se utiliza a menudo y que no aparece entre los puntos automáticos, o cuando se quiere tener una referencia más directa a un elemento concreto dentro de una página web.

En una página web, por ejemplo, puede servir para marcar una zona de contenido frecuente. En una aplicación, puede servir para marcar un panel, una sección o un control que forma parte habitual del flujo de trabajo.

Cómo eliminar un punto de ventana

Para eliminar un punto de ventana creado manualmente, se pulsa VO + Comando + Mayúsculas + corchete izquierdo.

Esta acción se aplica a puntos creados por la persona usuaria. Los puntos automáticos forman parte del análisis que VoiceOver hace de la ventana y no se pueden modificar.

Cómo moverse entre puntos de ventana

VoiceOver permite moverse al siguiente punto de ventana con VO + corchete derecho y al punto de ventana anterior con VO + corchete izquierdo. Estos comandos incluyen tanto los puntos creados automáticamente como los puntos creados por la persona usuaria.

También existen comandos para moverse sólo entre los puntos de ventana creados manualmente. Para ir al siguiente punto propio se utiliza VO + Comando + corchete derecho. Para ir al punto propio anterior se utiliza VO + Comando + corchete izquierdo. A veces nos puede interesar recorrer todo lo que VoiceOver considera relevante en la ventana. Otras veces sólo queremos desplazarnos entre las marcas que hemos creado nosotros porque responden a nuestra forma concreta de trabajar.

Este doble nivel de navegación permite usar los puntos de ventana de manera más flexible. Los puntos automáticos ayudan a entender la estructura general. Los puntos propios ayudan a adaptar esa estructura a una tarea concreta.

Qué ocurre cuando cambia una ventana

Las interfaces no siempre son estables. Una aplicación puede mostrar u ocultar paneles. Una página web puede cambiar su diseño. Una ventana puede tener distintos estados según el documento abierto, la sesión iniciada o el tamaño disponible.

Si el diseño de una ventana cambia de forma significativa y VoiceOver no puede localizar un punto de ventana que existía previamente, intentará crear un nuevo punto que coincida bastante con el original.

Aunque VoiceOver intenta conservar la referencia, si la interfaz ha cambiado mucho, puede que el punto ya no lleve exactamente al lugar esperado.

Por eso conviene revisar los puntos de ventana cuando una aplicación se actualiza, cuando una página cambia de diseño o cuando algo empieza a comportarse de forma extraña. Si un punto ya no lleva a donde debería, lo mejor es eliminarlo y crearlo de nuevo.

Diferencia entre puntos de ventana y puntos activos

Los puntos de ventana y los puntos activos pueden identificarse como elementos de navegación parecidos porque ambos permiten volver con rapidez a partes de la interfaz. Sin embargo, no conviene mezclarlos.

Un punto activo es más directo y más personal. Se asigna a un número y se usa para volver a un elemento concreto. Es útil cuando se quiere acceder rápidamente a un botón, una tabla, un campo o una zona específica. También puede utilizarse para escuchar cambios de valor en determinados elementos.

Un punto de ventana está más relacionado con la estructura de la ventana. VoiceOver puede generarlos automáticamente según el diseño de la aplicación, y la persona usuaria puede añadir otros para marcar zonas importantes. Su función principal es facilitar la orientación y el desplazamiento por regiones.

Si se quiere volver siempre al mismo elemento mediante un número, es recomendable usar un punto activo. Si se quiere recorrer las zonas principales de una ventana o página, es más recomendable usar un punto de ventana.

Qué son los puntos activos de VoiceOver en macOS

VoiceOver, el lector de pantallas de Apple, ofrece distintas formas de explorar la interfaz gráfica de usuario. Pero, principalmente, la forma de exploración consiste en mover el foco de VoiceOver por la pantalla o hacer que ese foco siga al foco del teclado, del ratón o del sistema.

Pero a veces podemos querer observar una zona de la pantalla o volver a esa zona aunque estemos trabajando en otra zona de la pantalla. VoiceOver también nos permite hacer esto gracias a los puntos activos.

Un punto activo permite marcar un elemento de la pantalla para volver a él directamente más tarde. En lugar de recorrer toda una ventana hasta llegar a un botón, una tabla, una barra de herramientas o una zona concreta de una aplicación, se puede asignar ese elemento a un número y después saltar a él con un comando de teclado. Apple indica, por ejemplo, que se puede asignar un punto activo al botón de mensaje nuevo en Mail para acceder directamente a ese botón siempre que la aplicación esté abierta.

Qué es un punto activo

Un punto activo de VoiceOver es una referencia rápida a un elemento de la interfaz. No modifica la aplicación, no crea un acceso directo del sistema ni cambia la estructura de la ventana. Simplemente permite que VoiceOver recuerde un elemento para poder volver a él cuando lo necesitemos.

La idea se parece a colocar un marcador en una página. Cuando navegamos por una aplicación compleja, hay elementos a los que volvemos una y otra vez. Puede ser un botón, una lista de resultados, una zona de mensajes, un campo de búsqueda o un control cuyo valor cambia. Si ese elemento queda asociado a un punto activo, VoiceOver puede ofrecer nuevos mecanismos de navegación para consultar o saltar a ese marcador.

El uso más evidente de un punto activo es volver rápidamente a un elemento. Si una persona trabaja con una aplicación durante mucho tiempo y necesita acceder de forma constante a una zona concreta, puede marcarla y regresar a ella con una pulsación.

Pero la función no se limita a la navegación. Apple también indica que, si el punto activo se asigna a un elemento cuyo estado o valor puede cambiar, VoiceOver puede utilizarlo para controlar ese elemento sin necesidad de que el foco esté situado en él.

Esto permite vigilar determinados cambios mientras se trabaja en otra parte de la pantalla. Por ejemplo, puede ser útil en zonas donde aparece información de progreso, estados de conexión, contadores, resultados o valores que se actualizan. No todos los elementos serán igual de útiles para este uso, pero la posibilidad existe y conviene conocerla.

También hay un detalle importante en tablas, listas y áreas web. Cuando se va a un punto activo situado en uno de esos elementos, VoiceOver permite interactuar inmediatamente con él, sin necesidad de introducir un comando adicional para iniciar la interacción.

Cuántos puntos activos se pueden configurar

VoiceOver permite configurar hasta diez puntos activos. Cada punto se identifica mediante un número. Por tanto, se pueden tener puntos activos del 0 al 9 o del 1 al 10 según la disposición del teclado y la forma en la que se introduzcan los comandos.

Si se utilizan actividades de VoiceOver, se pueden configurar hasta diez puntos activos para cada actividad. Esto es relevante porque las actividades permiten tener configuraciones diferentes según la aplicación o el contexto de uso. En la práctica, una persona podría tener un conjunto de puntos activos para navegar por una aplicación concreta y otro conjunto distinto para otra actividad.

Esta separación evita que una configuración tenga que servir para todo. Una misma tecla puede llevar a un punto activo distinto dependiendo del contexto en el que se esté trabajando, siempre que se haya organizado mediante actividades.

Cómo crear un punto activo

Para crear un punto activo, primero hay que situar el cursor de VoiceOver sobre el elemento que se quiere marcar. Después se pulsa VO + Mayúsculas + número de punto activo. Por ejemplo, si queremos asignar el punto activo 1 al elemento actual, se coloca VoiceOver sobre ese elemento y se pulsa VO + Mayúsculas + 1.

Si ese número ya estaba asignado a otro elemento, la nueva asignación sustituye a la anterior. VoiceOver no pregunta para conservar el punto anterior.

Cómo ir a un punto activo

Una vez creado el punto activo, se puede volver a él pulsando VO + número de punto activo. Por ejemplo, si el punto activo 1 está asociado a una lista de mensajes, VO + 1 llevará el cursor de VoiceOver a esa lista.

También existe un selector de punto activo. Se abre con VO + Mayúsculas + X y permite seleccionar uno de los puntos activos configurados. Esta opción puede ser muy útil cuando no podemos recordar qué número se asignó a cada elemento o cuando se prefiere explorar los puntos disponibles antes de saltar a uno de ellos.

Cómo saber qué hay en un punto activo

VoiceOver permite escuchar una descripción de un punto activo pulsando VO + Comando + número de punto activo. Este comando no sirve para ir al punto, sino para obtener información sobre él.

Cuando se utilizan varios puntos activos conviene poder comprobar qué contiene cada uno sin cambiar inmediatamente de posición. De esta forma podemos consultar la información de la barra de estado de una aplicación, el mensaje de procesamiento o estado de la barra de tareas sin necesidad de mover el foco de VoiceOver del punto donde estemos trabajando.

Cómo escuchar cambios en un punto activo

Una de las funciones más interesantes de los puntos activos es la posibilidad de escuchar cambios de valor. Para activar o desactivar esta vigilancia se utiliza VO + Comando + Mayúsculas + número de punto activo. Apple lo describe como el comando para escuchar cambios de valor en un punto activo y señala que, para dejar de escuchar esos avisos, se vuelve a pulsar el mismo comando.

Este comportamiento puede ser útil cuando una parte de la interfaz cambia mientras estamos trabajando en otra. Por ejemplo, una zona de estado puede informar de un progreso, una lista puede actualizarse, o un control puede cambiar de valor. En lugar de volver constantemente a comprobarlo, VoiceOver puede avisar cuando detecte cambios en ese punto activo.

Cómo eliminar un punto activo

Para eliminar un punto activo, primero se va a ese punto con VO + número de punto activo. Después se pulsa VO + Mayúsculas + ese mismo número.

Si un punto activo deja de tener utilidad, es mejor eliminarlo o reasignarlo. Mantener puntos antiguos puede hacer que la navegación sea menos predecible, sobre todo si pertenecen a ventanas, controles o estados que ya no se utilizan.

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.