Comprender extensiones de teclado personalizadas de iOS

iOS proporciona un marco robusto para construir extensiones de teclado personalizadas que pueden reemplazar o complementar el teclado del sistema. Estas extensiones funcionan como procesos separados y son de sandboxed, lo que significa que tienen acceso limitado a los recursos del sistema y los datos del usuario. La clase `UIInputViewController` es la base de cualquier teclado personalizado, manejo de entradas, diseño de la vista y comunicación con la aplicación host.

Los teclados personalizados pueden incluir cualquier diseño, incluyendo caracteres especiales, letras acentuadas, emojis, o incluso entrada basada en gestos. Sin embargo, Apple impone reglas estrictas: el teclado no puede acceder a recursos de red sin permiso explícito de usuario, y no debe recopilar datos de pulsación para análisis sin consentimiento claro. Esto garantiza la privacidad del usuario al tiempo que permite flexibilidad para los desarrolladores.

Cuando construyes un teclado personalizado, estás creando una extensión de aplicación. La extensión se envasa dentro de una aplicación host, y los usuarios deben instalar esa aplicación y luego habilitar la extensión a través de ]Configuraciones > General > Teclado. A diferencia de Android, iOS no permite reemplazar completamente el teclado del sistema; los usuarios deben cambiar a tu teclado manualmente.

Para caracteres especiales, el poder real reside en diseñar patrones de acceso eficientes. Muchos desarrolladores crean teclados que agrupan símbolos lógicamente, ofrecen popups de larga duración para variantes adicionales, o proporcionan una capa de símbolos dedicada. Las secciones siguientes caminan a través de cada etapa de crear un teclado personalizado listo para la producción con caracteres especiales.

Configuración del proyecto de extensión de teclado

Crear un teclado personalizado comienza dentro de Xcode. Necesitas una aplicación de contenedor y el objetivo de extensión del teclado.

Añadir un nuevo objetivo en Xcode

Abra su proyecto iOS existente o cree uno nuevo. Vaya a File > New > Target, y luego seleccione Extensión de teclado de clientes] bajo la categoría de extensión de aplicación. Darle un nombre de producto, como “Tabla de teclado especial”. Xcode genera una plantilla con un control de subclase

Configurar Info.plist

La extensión 'Info.plist' contiene dos claves críticas bajo `NSExtension`:

  • IsASCIICapable: Establece a `YES` si tu teclado sólo utiliza caracteres ASCII; de lo contrario, establece `NO`.
  • PrefersRightToLeft: Ajusta si tu idioma lee derecho a izquierda.
  • PrimaryLanguage: Definir un código de idioma (por ejemplo, `en-US`).

También agregue el `Privacy - Uso de la cámara Descripción` sólo si incluye funciones de entrada basadas en la cámara (trare para un teclado). Evite permisos innecesarios.

Comprender el derecho de acceso abierto

Por defecto, los teclados personalizados no tienen acceso a la red. Si necesita descargar conjuntos de caracteres especiales o proporcionar sincronización en la nube, debe añadir la tecla «SolicitudAbrir acceso» bajo `NSExtensionAttributes` en `Info.plist` y establecerla en `YES`. Sin embargo, Apple revisa las aplicaciones que solicitan acceso abierto cuidadosamente. Para un teclado centrado en caracteres especiales fuera de línea, salte esta clave para evitar problemas de confianza del usuario.

Construir la UI Básica

El método 'viewDidLoad' dentro de `KeyboardViewController` es donde se establece su diseño de teclado. Puede utilizar un guión gráfico o construir la interfaz programadamente. Para un diseño complejo con muchos caracteres especiales, UI programática ofrece un mejor control sobre el tamaño dinámico y las restricciones Auto Layout.

override func viewDidLoad() {
 super.viewDidLoad()

 // Set up the main container view
 let stackView = UIStackView()
 stackView.axis = .vertical
 stackView.distribution = .fillEqually
 stackView.spacing = 4
 stackView.translatesAutoresizingMaskIntoConstraints = false
 self.view.addSubview(stackView)

 NSLayoutConstraint.activate([
 stackView.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 4),
 stackView.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -4),
 stackView.topAnchor.constraint(equalTo: view.topAnchor, constant: 4),
 stackView.bottomAnchor.constraint(equalTo: view.bottomAnchor, constant: -4)
 ])
}

Esta configuración mínima crea una pila vertical que mantendrá filas de llaves.

Diseño del diseño del teclado para caracteres especiales

Los teclados de caracteres especiales requieren una organización cuidadosa. Los usuarios necesitan encontrar símbolos rápidamente sin cazar a través de páginas clave interminables.

  • Símbolos de la naturaleza : $, €, ¥, NOS, NOS, NOS, NOS
  • Señales matemáticos: +, -, ×, ÷, =, √, √, ¦
  • Variantes de la puntuación : ..., –, •, ‹, ›, «, »
  • Cartas centradas: á, é, í, ó, ú, ü, ñ, ç
  • Arrows and directional: ←, →, ↑, ↓, ↓, ↔, ⁇

Implementar dos o tres capas de diseño: una capa principal de alfabeto con una toggle para cambiar a una capa de símbolos, y posiblemente una capa secundaria con caracteres menos comunes. Use una clave dedicada (por ejemplo, "123" o "#+=") para cambiar entre capas. Cada capa es una colección separada de vistas de fila que puede cambiar a través de la propiedad 'inputView' o por ocultar / mostrar vistas.

Gestos de larga duración para caracteres adicionales

Si su teclado muestra un diseño estándar de QWERTY, los usuarios esperan que la larga presión revele las variantes de caracteres. Por ejemplo, la tecla “E” muestra “é”, “è”, “ë”. Implementar esto agregando un `UILongPressGestureRecognizer` a cada llave. Cuando se activa, presenta una vista popup por encima de la llave con las variantes disponibles.

El teclado del sistema de Apple utiliza un mecanismo interno, pero para su extensión, puede utilizar un `UIView` que aparece como una burbuja flotante. Asegúrese de que el popup no se extiende más allá del área segura y que respeta la orientación del dispositivo.

Código Snippet: Añadiendo Long Press a una llave

let longPress = UILongPressGestureRecognizer(target: self, action: #selector(handleLongPress(_:)))
longPress.minimumPressDuration = 0.3
keyButton.addGestureRecognizer(longPress)

Dentro del manejador, rastrea el estado `.began`, `.changed`, y `.ended` para mostrar, actualizar, y seleccionar del popup.

Tamaño de la llave y el espacio

Los dispositivos iOS varían en ancho de pantalla. Use el tamaño proporcional: 10–12 teclas por fila en iPhones, y un poco más en iPads. Cada clave debe ser al menos 28 puntos de alto para cumplir las Directrices de interfaz humana de Apple para objetivos táctiles. Establecer limitaciones para que las teclas se encojan adecuadamente en pantallas más pequeñas. Para caracteres especiales, asegúrese de que los símbolos son claramente visibles; use un tamaño de fuente de 16–18 puntos para las etiquetas clave.

Entrada de Manejo con el Proxy de Documento de Texto

Cuando un usuario toca una llave, el teclado debe insertar el personaje en el campo de texto actualmente enfocado. Esto se hace a través del objeto `textDocumentProxy`, una instancia de `UITextDocumentProxy`. El proxy proporciona métodos como `insertText( :)`, `deleteBackward()`, y `adjustTextPosition(porCharacterOffset:)`.

Para caracteres especiales, es necesario insertar glifos multibyte (como emojis o combinar diacritics). Estos son manejados correctamente por `insertText`, siempre y cuando pases la cadena Unicode correcta. Por ejemplo, para insertar el personaje acentuado "é", llamar `proxy.insertText("é").Para combinar acento como "e" con un acento agudo que combina (U+01).

Manejo de escudos y cerradura de tapas

Implementar la gestión del estado de cambio para cambiar entre mayúsculas y minúsculas, y símbolos opcionalmente superiores. Cuando la tecla de cambio está activa, su teclado debe mostrar variantes de mayúsculas. Para caracteres especiales que tienen caso (como letras griegas), proporcione ambos. Para símbolos sin caso, el estado de cambio puede ser ignorado o utilizado para mostrar símbolos alternativos (por ejemplo, cambio + número de teclas a menudo muestra el símbolo por encima del número).

Usa una propiedad booleana `shiftActive` para rastrear el estado. Cuando el usuario toca la tecla de cambio, cambiarla y recargar las teclas. Para el bloqueo de tapas, detectar un doble toque en la tecla de cambio; activar un estado de tapas persistentes y mostrar un indicador (por ejemplo, llave de cambio subrayada).

Eliminar y Control de Cursor

Incluye una tecla de eliminación que llama `proxy.deleteBackward()`. Para un teclado de caracteres especiales, los usuarios pueden necesitar eliminar palabras enteras rápidamente. Puede implementar una acción de la palabra de "delete" llamando `deleteBackward()` en un bucle o utilizando el método de 'adjustTextPosition` para mover el cursor hacia atrás sobre los límites de palabras, luego eliminando el cursor.

Para mover el cursor hacia adelante o hacia atrás, utilice `proxy.adjustTextPosition(porCharacterOffset: 1)` y `-1`. Esto se utiliza para un botón "espacio cercano" o "espacio anterior" si usted decide incluir uno.

Habilitación y prueba de la extensión del teclado

Pruebas de simulador

En Xcode, ejecute la aplicación de contenedores en un simulador. Luego vaya a Configuración > General > Teclado > Teclados > Añadir nuevo teclado y seleccione su extensión de teclado personalizada bajo la sección “Terceras-Partidas” . Es posible que necesite cambiar a su teclado tocando el icono del globo cuando un campo de salida esté activo.

Pruebas de dispositivos físicos

Pruebas de dispositivo es esencial porque el simulador no emula completamente todos los comportamientos de iOS (por ejemplo, restricciones de altura de teclado, autocorrección). Instala la aplicación de contenedores en un dispositivo a través de un perfil de provisión de desarrollo. A continuación, habilita el teclado desde Ajustes. Use la función de Xcode Adjuntar a Procesamiento]] para depurar la extensión:

Cuestiones comunes

  • Keyboard not appearing: Asegurar que la extensión esté habilitada correctamente y el derecho de `RequestOpenAccess` se ajuste a sus necesidades. También compruebe que la `clase principal' en `Info.plist` apunta a su `KeyboardViewController`.
  • No te dimensiones correctamente: Sobrescribir `viewWillLayoutSubviews` en tu `KeyboardViewController` y actualizar la restricción de altura de la vista. El teclado debe ajustarse a la altura esperada del sistema (normalmente entre 216 y 330 puntos en iPhone, y más grande en iPad).
  • Ingrese no registrando: Verifique que usted está llamando `insertText` en el objeto proxy correcto. El proxy está disponible tan pronto como el teclado esté activo.

Privacidad y Permisos de Usuario

Los teclados personalizados son un punto de preocupación para la privacidad del usuario. Apple requiere que los teclados no recojan, transmitan o almacenen datos de pulsación sin el consentimiento explícito del usuario.

  • No hay llamadas de red: A menos que tenga habilitado la opción "Solicitud de acceso" y el usuario otorgue permiso, su extensión no puede hacer solicitudes de red. Incluso con acceso abierto, debe divulgar la recopilación de datos en una política de privacidad.
  • No hay acceso a portapapeles: Tu teclado no puede leer el portapapeles del sistema. Sólo la aplicación host puede acceder al portapapeles y sólo cuando la aplicación está activa.
  • No hay análisis de pulsaciones de teclas: No se puede registrar qué teclas se presionan. Si necesita aprender preferencias de usuario (por ejemplo, símbolos usados frecuentemente), almacene esos datos sólo localmente con una explicación clara y una opción de exclusión.
  • Proporcione una toggle para la recopilación de datos: Si su teclado utiliza redes para actualizaciones especiales de caracteres, incluya un interruptor en la aplicación de contenedores para habilitarla y desactivarla, y respete la elección del usuario.

Cuando los usuarios permiten tu teclado, iOS muestra una advertencia de que el teclado podría recoger todas las pulsaciones. Las opiniones y calificaciones de tu app sufrirán si los usuarios sienten que sus datos están en riesgo. Sé honesto y transparente en tu descripción de App Store y dentro de la aplicación de contenedores.

Consejos de diseño para el acceso especial de caracteres

Organizar símbolos para la ley de los puntos

Coloque los caracteres especiales más utilizados cerca del centro del teclado o en la fila inferior para facilitar el acceso al pulgar. Por ejemplo, si su público objetivo a menudo escribe moneda, ponga $, €, y £ en la fila de la capa de símbolos. Grupo símbolos similares juntos para reducir la carga cognitiva.

Use Visual Feedback

Cuando se presiona una tecla, muestre un breve popup (como la vista previa del personaje del teclado del sistema) para confirmar la entrada. Esto es especialmente útil para símbolos pequeños. Implementar una 'UIControl' personalizado para cada clave que responda al evento touch down y muestra una versión magnificada del personaje por encima de la llave.

Incluye una función de auto-advancia para símbolos

Después de insertar un personaje especial, muchos usuarios esperan que el teclado vuelva automáticamente a la capa de letras. Puede cambiar este comportamiento con una opción en la aplicación de contenedores. Esto hace que la composición de una mezcla de letras y símbolos sea más rápida.

Accesibilidad de apoyo

Asegúrese de que VoiceOver puede leer todas las teclas. Establecer `accesibilidadLabel` en cada botón clave del personaje o su nombre (por ejemplo, «asterisk» para *). Para claves simbólicas donde el glifo no es obvio, proporcione una descripción hablada. También soporte el tipo dinámico para que los usuarios con grandes configuraciones de texto puedan ver claramente los símbolos.

Consideraciones adicionales

Optimización del rendimiento

Las extensiones de teclado funcionan en un entorno con control de memoria. Evite cargar imágenes pesadas o animaciones complejas. Utilice subclases de peso ligero `UIButton` o `UICollectionView` para una reutilización eficiente. En dispositivos antiguos, hacer una rejilla completa de 30+ teclas debe ser suave.

Localización

Si su teclado admite varios idiomas, considere proporcionar conjuntos de símbolos localizados. Por ejemplo, un usuario francés podría necesitar « », mientras que un usuario alemán necesita ß y Ä, Ö, Ü. Utilice la tecla `PrimaryLanguage ' en `Info.plist` para insinuar el idioma predeterminado, pero dejar que los usuarios cambien a través de la aplicación de contenedores.

App Store Review

Apple revisa las extensiones de teclado personalizadas más estrictamente que las aplicaciones normales. Asegúrese de que su teclado no se estrelle, no incluye contenido ofensivo, y no eludir las restricciones del sistema. Evite banners de anuncios o sobreimpresiones promocionales en el teclado mismo. Si su teclado requiere acceso a la red por cualquier motivo, prepárese para justificarlo durante el proceso de revisión.

Actualizaciones y mantenimiento

Las nuevas versiones de iOS pueden cambiar cómo las extensiones de teclado interactúan con el sistema. Prueba tu extensión en beta versiones y actualiza las implementaciones de método UIInputViewController según sea necesario. Por ejemplo, iOS 16 introdujo nuevas APIs de diseño de teclado para teclados más altos en iPads.

Conclusión

Implementar un teclado personalizado con caracteres especiales en iOS es una manera poderosa de mejorar la eficiencia de la escritura para usuarios que necesitan símbolos, letras acentuadas o emojis que el teclado del sistema no se enciende inmediatamente. Al construir una extensión del teclado con diseños cuidadosamente diseñados, acceso intuitivo de larga presión, y manejo de entrada robusto, puede ofrecer una experiencia sin problemas.

Para más lectura, consulte la documentación oficial de Apple sobre Crear un teclado personalizado], la Guía de programación de aplicaciones , y las Directrices de interfaz humana para los teclados].