La nota de la App Store para 1.8.1 son cuatro líneas sobre el ratón virtual. La versión que hay detrás son nueve días de trabajo y el mayor salto en una sola entrega que ha tenido este año la app de iPhone y iPad: entrada de voz con una capa de IA opcional, un teclado reconstruido sobre datos de disposición reales, un cliente para un tercer protocolo de terminal, enlaces para compartir un Mac y un formato de sincronización diseñado para sobrevivir a sus propias versiones futuras. Esta es la versión larga.
Ahora escucha
Escribir un comando de shell en un teléfono es la peor parte de usar un terminal en un teléfono. Así que 1.8.1 añadió la entrada de voz, construida por etapas a lo largo de una semana aproximadamente.
La primera etapa es la que más importa y no cuesta nada: mantienes pulsado el micrófono, hablas y el reconocimiento se ejecuta en el dispositivo. Gratis, sin conexión y sin que nada salga del teléfono. Lo que ha oído aparece en un panel de voz como texto editable, y lo insertas en el terminal cuando te parece correcto — no antes.
La segunda etapa trata de las veces en que no parece correcto. Las grabaciones se guardan por segmentos, así que puedes recortar uno y reconocer de nuevo solo esa parte en lugar de repetir la frase entera, y un historial conserva las grabaciones anteriores para escucharlas e intentarlo otra vez. En iPad, el panel de voz flota y se amplía igual que el teclado transparente, porque en una pantalla grande un panel fijo en el sitio equivocado es un problema en sí mismo.
Y, si quieres, piensa
El reconocimiento te da palabras. Un comando necesita algo más que palabras — necesita las opciones en el orden correcto y ningún espacio donde no debería haberlo. La capa de IA de 1.8.1 es completamente opcional y va del todo aparte del reconocimiento.
Trae tu propio proveedor: se admiten los formatos de API de OpenAI, Claude, Gemini, Kimi y GLM, y configuras un modelo de chat más, si ese proveedor lo tiene, un modelo de transcripción. Claude es solo de chat y no tiene API de audio, así que allí las grabaciones recurren al reconocimiento en el dispositivo en vez de fallar. Las claves de proveedor viven en el Keychain de este dispositivo y quedan excluidas de la sincronización a propósito.
Con un proveedor conectado, los modos de prompt convierten lo que dijiste en texto limpio o en un comando que puedes ejecutar, y una opción para adjuntar el contexto del terminal deja que el modelo vea lo que hay realmente en pantalla antes de responder. También hay un panel de chat, así que la pregunta que habrías hecho en una pestaña del navegador puedes hacerla junto a la sesión.
Para quien prefiera no gestionar una clave de API, hay modelos oficiales en la nube disponibles tras iniciar sesión, que se pagan con Puntos comprados mediante compra integrada y compartidos entre tus dispositivos. El reconocimiento en el dispositivo sigue siendo gratis en cualquier caso, y es la opción por defecto.
Un teclado con disposiciones de verdad
El teclado flotante, hasta 1.8, era una única disposición estadounidense fija en el código. 1.8.1 lo convirtió en algo dirigido por datos y entregó seis: Inglés americano, Inglés británico, Japonés (JIS), Francés (AZERTY), Alemán (QWERTZ) y Español, conmutables en los ajustes junto con la elección de panel.
Las disposiciones basadas en datos necesitan una prueba que las fijas en el código
no necesitan, porque ahora una disposición es una tabla que alguien tecleó.
Añadimos una prueba de alcanzabilidad de caracteres — para cada
disposición, ¿es realmente alcanzable cada carácter que esperarías mediante
alguna combinación de teclas? Encontró de inmediato dos fallos reales: AZERTY no
tenía * por
ninguna parte, y la disposición JIS anclaba fn a la tecla equivocada, con lo que
la fila de teclas F quedaba descolocada. Ninguno de los dos lo habría detectado
alguien probando en inglés.
Sobre las teclas hay ahora una tira de candidatos respaldada por un sugeridor de palabras ajustado al contexto del terminal y a los comandos habituales, y el micrófono se mudó a la barra superior con dos comportamientos: tocarlo para pasar al panel de voz, mantenerlo pulsado para hablar directamente hacia la tira de candidatos. Ese gesto de mantener pulsado resultó más difícil de lo que parece — la API evidente de pulsación larga de SwiftUI no puede decirte cuándo se levanta el dedo, algo que contamos aparte en una entrada sobre botones de mantener para grabar.
Una tercera vía de entrada: Eternal Terminal
Mosh es lo que mantiene viva una sesión al cruzar un túnel de tren, y funciona
sobre UDP. Muchas redes corporativas y de hotel dejan pasar TCP y nada más, lo
que deja a esos usuarios con SSH a secas y sin ninguna persistencia de sesión.
Eternal Terminal
resuelve el mismo problema sobre TCP, y mucha gente ya tiene
etserver en marcha.
Escribimos sobre el cliente la semana anterior;
1.8.1 es la versión en la que aterrizó.
Llegó como debe llegar un transporte experimental: primero un crate de Rust aislado, sin que nada más pudiera depender de él; luego conectado a través del FFI a la app de Swift detrás de un interruptor de función; y después, una vez que funcionaba, una interfaz de verdad en el editor de hosts, un interruptor en ajustes, mensajes de error que nombran la causa real y traducciones. Siguieron dos rondas de revisión sobre las rutas de fallo, que es donde un cliente de red tiene más probabilidades de estar equivocado en silencio.
Sigue desactivado por defecto. Activa el transporte ET en Ajustes y aparece como un tercer método de conexión junto a SSH y Mosh. Un detalle a tener en cuenta: igual que el UDP de Mosh, la conexión de datos de ET va directa del dispositivo al puerto de etserver y no se reenvía a través de un host de salto.
Configuración que sobrevive a su propio futuro
El agente del Mac desarrolló en este periodo su propia lista de hosts y su propio terminal, lo que obligaba al teléfono y al Mac a ponerse de acuerdo sobre qué es un host. 1.8.1 introdujo un paquete compartido con el esquema canónico de hosts y scripts, usado por ambos, más un cliente de sincronización de configuración y el coordinador que lo dirige.
Compartir un esquema entre dos apps que se actualizan por separado crea un peligro concreto, y lo sufrimos: un cliente antiguo decodifica un valor del que nunca ha oído hablar, después reescribe el registro entero y lo destruye. El arreglo — enums que conservan su valor original, una bolsa para los campos desconocidos y pruebas que fijan el contrato — está contado en Codable hacia delante. En esta versión ese patrón se aplicó primero a los hosts y luego a todos los demás modelos sincronizados, incluidos los campos desconocidos por entrada de los escritorios guardados.
Qué se sincroniza y qué no siguió igual y explícito: los hosts, los scripts, las unidades, las plantillas y los ajustes se sincronizan con el servidor bajo tu cuenta. Las contraseñas, las claves privadas SSH y sus frases de contraseña nunca salen del dispositivo — viven en el Keychain de iOS, viajando opcionalmente de extremo a extremo por el Keychain de iCloud, sin nada en el servidor que se pueda comprometer.
Compartir un Mac con otra persona
1.8.1 añadió el lado del visor de los enlaces compartidos: una lista Compartidos conmigo, soporte de transporte para conectar a través de un enlace compartido en lugar de una cadena de emparejamiento, y el manejo de sesiones que dependen de la aprobación del propietario. Los errores son específicos a propósito — un enlace caducado, un enlace revocado, todas las plazas simultáneas ocupadas, una cuenta que no está en la lista de permitidos y una conexión fuera de la franja reservada dicen cuál de esas cosas ocurrió, porque «no se pudo conectar» no sirve de nada cuando la solución depende del motivo.
También aquí: desconectar un escritorio remoto conserva su pestaña, igual que ha hecho siempre una conexión SSH, así que reconectas desde la superposición en vez de montarlo todo otra vez.
El ratón virtual encuentra dónde vivir
Esta es la parte que describe la nota de la App Store. Los botones del ratón se podían separar y colocar, lo que era flexible y hacía que nunca estuvieran del todo donde estaba tu mano. Ahora se acoplan: un panel a lo largo del borde inferior de la pantalla que se desliza a izquierda o derecha hasta donde sujetas el dispositivo, y que sube por encima del teclado en pantalla cuando hay uno abierto.
Acoplarlos arregló además la peor costumbre de la lupa. Flotando libre, tenía que esquivar los bordes de la pantalla, lo que significaba que se movía cuando no te lo esperabas y que la vista ampliada no coincidía con el cursor. Acoplada, se sitúa justo encima del cursor y ahí se queda. Dos arreglos relacionados: deslizar un dedo fuera del borde de la pantalla ya no hace saltar el cursor ni deja un botón pulsado — un toque cancelado se trata ahora como un toque cancelado — y ⌘, ⌥ y ⌃ ya no se quedan pulsados de vez en cuando convirtiendo tu siguiente tecla en un atajo sorpresa.
Una campana que se oye desde otra app
Cuando un terminal hace sonar su campana y esa sesión no es la que estás mirando,
iOS envía ahora una notificación. Añade
printf '\a' al
final de una compilación larga y el teléfono te avisa cuando termina. Las
campanas de la sesión que sí estás mirando se quedan calladas, que es todo el
truco.
Tareas de mantenimiento que merece la pena mencionar
- Una auditoría completa de traducciones al terminar el trabajo del teclado: 639 claves revisadas, cero duplicados.
- Dos correcciones de exactitud salidas de la revisión: una condición de carrera en el estado del decodificador, y contraseñas del Keychain que podían quedar huérfanas al desaparecer un host.
- El camino del audio Opus de 1.8 quedó terminado aquí — un codificador con búfer que produce tramas de 20 ms a partir de PCM arbitrario, la reproducción en el visor y un arreglo para leer PCM entrelazado de la lista de búferes de audio.
- Los objetivos de prueba bajaron a iOS 17.0 para igualar los de la propia app, de modo que las pruebas se ejecutan allí donde se ejecuta la app.
Todo ello es gratis. El reconocimiento de voz en el dispositivo, incluido.
Lee esta entrada en: English · 中文 · 日本語 · Español · Français · 한국어 · Українська
Más sobre la app en la guía de SharkTTY, las notas breves para usuarios en Novedades, y la vía más rápida para escribirnos es el tablón de comentarios. Volver al blog de desarrollo.