Compreender extensões de teclado personalizadas do iOS

O iOS fornece uma estrutura robusta para a construção de extensões de teclado personalizadas que podem substituir ou complementar o teclado do sistema. Estas extensões são executadas como processos separados e são sandboxed, o que significa que têm acesso limitado aos recursos do sistema e dados do usuário. A classe `UIInputViewController` é a base para qualquer teclado personalizado, gerenciando o manuseio de entrada, layout de visualização e comunicação com o aplicativo host.

Os teclados personalizados podem incluir qualquer disposição, incluindo caracteres especiais, letras acentuadas, emojis ou mesmo entradas baseadas em gestos. No entanto, a Apple impõe regras estritas: o teclado não pode acessar recursos de rede sem permissão explícita do usuário, e não deve coletar dados de digitação de teclas para análise sem consentimento claro. Isto garante privacidade do usuário, permitindo ainda flexibilidade para desenvolvedores.

Quando você constrói um teclado personalizado, você está essencialmente criando uma extensão de aplicativo. A extensão é empacotada dentro de uma aplicação host, e os usuários devem instalar essa aplicação e então habilitar a extensão via [[FLT: 0]] Configurações & gt; Geral & gt; Teclado & gt; Teclados [[ FLT: 1]]. Ao contrário do Android, o iOS não permite substituir totalmente o teclado do sistema; os usuários devem mudar para o teclado manualmente.

Para caracteres especiais, o poder real reside em criar padrões de acesso eficientes. Muitos desenvolvedores criam teclados que agrupam símbolos logicamente, oferecem popups de longa pressão para variantes adicionais ou fornecem uma camada de símbolos dedicada. As seguintes seções passam por todas as etapas de criação de um teclado personalizado pronto para produção com caracteres especiais.

Configurar o Projeto de Extensão do Teclado

A criação de um teclado personalizado começa dentro do Xcode. Você precisa tanto de um aplicativo de container quanto do alvo da extensão do teclado.

Adicionar um novo alvo no Xcode

Abra o seu projeto iOS existente ou crie um novo. Vá para Arquivo > Novo > Alvo, selecione então [Extensão personalizada do teclado] sob a categoria Extensão da Aplicação. Dê-lhe um nome de produto, como “SpecialCharKeyboard”. Xcode gera um modelo com uma subclasse `KeyboardViewController` de `UIInputViewController’.

Configurar Info.plist

A extensão `Info.plist` contém duas chaves críticas em `NSExtension`:

  • ISASCIICapable: Definir para `YES` se o teclado usar apenas caracteres ASCII; caso contrário, definir `NO`.
  • PrefersRightToEsquerda: Ajuste se sua língua lê direita-para-esquerda.
  • PrimáriaLanguage: Define um código de idioma (por exemplo, `en-US`).

Adicione também a `Privacidade - Descrição de Uso da Câmera` somente se você incluir recursos de entrada baseados em câmera (raro para um teclado). Evite permissões desnecessárias.

Entenda o direito de acesso aberto

Por padrão, os teclados personalizados não têm acesso à rede. Se você precisar baixar conjuntos de caracteres especiais ou fornecer sincronização na nuvem, você deve adicionar a chave `RequestOpenAccess` em `NSExtensionAttributes` em `Info.plist` e configurá-la em `YES`. No entanto, a Apple revê aplicativos que solicitam acesso aberto com cuidado. Para um teclado focado em caracteres especiais offline, pule esta tecla para evitar problemas de confiança do usuário.

Construir a UI Básica

O método 'viewDidLoad' dentro do 'KeyboardViewController' é onde você configura o layout do teclado. Você pode usar um storyboard ou construir a interface programáticamente. Para um layout complexo com muitos caracteres especiais, a interface programática oferece um melhor controle sobre o dimensionamento dinâmico e restrições de layout automático.

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 configuração mínima cria uma pilha vertical que irá manter linhas de teclas.

Desenhando o layout do teclado para caracteres especiais

Teclados especiais de caracteres requerem uma organização cuidadosa. Os usuários precisam encontrar símbolos rapidamente sem procurar por páginas- chave infinitas. Comece por agrupar símbolos em categorias lógicas:

  • Símbolos de moeda : $, €, £, ¥, ¥, ., .
  • Sinais matemáticos : +, -, ×, ., =, ., ., ±, ., ., ., ∫
  • Vantagens de pintura: ..., —, –, •, ‹, ›, «, »
  • Cartas acedidas: á, é, i, ó, ú, ü, ñ, ç
  • Arraigamentos e direcionais: ←, →, ↑, ↓, ↔, .

Implementar duas ou três camadas de disposição: uma camada do alfabeto principal com uma opção para mudar para uma camada de símbolos, e possivelmente uma camada secundária com caracteres menos comuns. Use uma chave dedicada (por exemplo, “123” ou “#+=”) para alternar entre camadas. Cada camada é uma coleção separada de visões de linha que você pode trocar através da propriedade `inputView’ ou escondendo/mostrando vistas.

Gestos de longa imprensa para caracteres adicionais

Se o seu teclado mostrar um layout padrão do QWERTY, os usuários esperam que o longo-presso revele variantes de caracteres. Por exemplo, pressionando a tecla “E” mostra “é”, “è”, “ê”, “ë”. Implemente isso adicionando um `UILOngPressGestureRecognizer` a cada tecla. Quando acionado, apresente uma visão popup acima da tecla com as variantes disponíveis. O popup deve ser rejeitado quando o usuário levantar o dedo ou tocar em uma das variantes.

O teclado do sistema Apple usa um mecanismo interno, mas para sua extensão, você pode usar um `UIView` que aparece como uma bolha flutuante. Certifique-se de que o popup não se estende além da área segura e que respeita a orientação do dispositivo.

Excerto de Código: Adicionando Longa Pressione a uma Chave

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

Dentro do manipulador, rastreie o estado `.começou`, `.alterou`, e `.end` para mostrar, atualizar e selecionar a partir do popup.

Tamanho da Chave e Espaçamento

Os dispositivos iOS variam em largura de tela. Use o dimensionamento proporcional: 10-12 teclas por linha em iPhones e um pouco mais em iPads. Cada tecla deve ter pelo menos 28 pontos de altura para atender as Diretrizes de Interface Humana da Apple para alvos de toque. Defina restrições para que as teclas encolhem adequadamente em telas menores. Para caracteres especiais, certifique-se de que os símbolos sejam claramente visíveis; use um tamanho de fonte de 16-18 pontos para as etiquetas de teclas.

Manuseando a Entrada com o Proxy de Documento de Texto

Quando um usuário toca em uma tecla, o teclado deve inserir o caractere no campo de texto atualmente focado. Isto é feito através do objeto `textDocumentProxy', uma instância de `UITextDocumentProxy`. O proxy fornece métodos como `inserirTexto( :)`, `deleteBackward()' e `ajustarPosição de Texto(porCharacterOffset:)`.

Para caracteres especiais, você precisa frequentemente inserir glifos multibyte (como emojis ou combinando diacríticas). Estes são tratados corretamente por `inserirTexto`, desde que você passe o texto Unicode correto. Por exemplo, para inserir o caractere acentuado “é”, chame `proxy.inserirTexto("é")`. Para um acento de combinação como “e” com um acento agudo combinando (U+0301), você inseriria ambos os caracteres: `proxy.insertTexto("e\u{0301}")`. No entanto, é mais simples usar o formulário pré- composto: `"\u{00E9}`.

Manusear o Shift e o Caps Lock

Implementar o gerenciamento de estado de mudança para alternar entre letras maiúsculas e minúsculas, e símbolos opcionalmente maiúsculas. Quando a tecla de mudança estiver ativa, seu teclado deverá mostrar variantes maiúsculas. Para caracteres especiais que tenham maiúsculas (como letras gregas), forneça ambos. Para símbolos sem maiúsculas, o estado de mudança pode ser ignorado ou usado para mostrar símbolos alternativos (por exemplo, a tecla Shift + Number mostra frequentemente o símbolo acima do número).

Use uma propriedade booleana `shiftActive' para rastrear o estado. Quando o usuário tocar na tecla de deslocamento, comuta- a e recarrega as teclas. Para bloquear as teclas, detecte uma toque duplo na tecla de deslocamento; habilite um estado de tampas persistentes e mostre um indicador (por exemplo, tecla de deslocamento sublinhada).

Excluir e Controle de Cursor

Incluir uma tecla de exclusão que chama `proxy.deleteBackward(). Para um teclado de caracteres especiais, os usuários podem precisar excluir palavras inteiras rapidamente. Você pode implementar uma ação de "delete word" chamando `deleteBackward()' em um loop ou usando o método `adjustTextPosition` para mover o cursor para trás sobre os limites das palavras, então excluir. No entanto, a Apple limita o quanto você pode manipular o cursor via `adjustTextPosition` por razões de privacidade; você não pode ler o texto em torno do cursor.

Para mover o cursor para frente ou para trás, use `proxy.adjustTextPosition(byCharacterOffset: 1)` e `-1`. Isto é usado para um botão de "próximo espaço" ou "espaço anterior" se você optar por incluir um.

Ativando e Testando a Extensão do Teclado

Teste do simulador

No Xcode, execute a aplicação do contentor num simulador. Depois vá para [[FLT: 0]] Configurações & gt; Geral & gt; Teclado & gt; Teclados & gt; Adicionar Novo Teclado [[FLT: 1]] e seleccione a sua extensão personalizada do teclado na secção “Terceiro- Partidos”. Poderá ter de mudar para o seu teclado, tocando no ícone do globo quando estiver activo um campo de texto. A depuração das extensões de teclado no simulador poderá ser complicada, porque os pontos de interrupção podem nem sempre disparar. Use as instruções de `NSLog’ ou `print’ e verifique a saída do console.

Teste de Dispositivos Físicos

O teste de dispositivo é essencial porque o simulador não emula totalmente todos os comportamentos iOS (por exemplo, restrições de altura do teclado, correção automática). Instale o aplicativo do recipiente em um dispositivo através de um perfil de provisionamento de desenvolvimento. Em seguida, habilite o teclado a partir de Configurações. Use o recurso do XcodeAttach to Process para depurar a extensão: no navegador de depuração, escolha o nome do processo da sua extensão (por exemplo, “SpecialCharkeyboard”).

Questões comuns

  • Keyboard not appearing: Certifique-se de que a extensão está corretamente habilitada e o direito `PedidoOpenAccess' corresponde às suas necessidades. Também verifique se a classe `Principal' em `Info.plist' aponta para o seu `KeyboardViewController'.
  • Layout não dimensionando corretamente: Sobrescrever `viewWillLayotSubviews` no seu `KeyboardViewController` e atualizar a restrição de altura da visualização. O teclado deve estar em conformidade com a altura esperada do sistema (normalmente entre 216 e 330 pontos no iPhone e maior no iPad).
  • [[FLT: 0]]Input not registering: Verifique se você está chamando `insertText` no objeto proxy correto. O proxy está disponível assim que o teclado estiver ativo.

Privacidade e Permissões do Usuário

Teclados personalizados são um ponto de preocupação para a privacidade do usuário. A Apple requer que os teclados não coletem, transmitam ou guardem dados de teclas sem o consentimento explícito do usuário. As seguintes diretrizes são críticas:

  • Sem chamadas de rede: A menos que você tenha `RequestOpenAccess` ativado e o usuário conceda permissão, sua extensão não pode fazer solicitações de rede. Mesmo com acesso aberto, você deve divulgar a coleta de dados em uma política de privacidade.
  • Sem acesso à área de transferência: O seu teclado não consegue ler a área de transferência do sistema. Só a aplicação máquina pode aceder à área de transferência e só quando a aplicação estiver activa.
  • Nenhuma análise de teclas digitadas: Você não pode registrar quais chaves são pressionadas. Se você precisa aprender preferências de usuário (por exemplo, símbolos usados frequentemente), guarde esses dados apenas localmente com uma explicação clara e uma opção de opt-out.
  • Forneça uma opção para a coleta de dados: Se o seu teclado usa rede para atualizações especiais de caracteres, inclua um switch no aplicativo do recipiente para habilitá-lo/desativar e respeite a escolha do usuário.

Quando os usuários habilitam o teclado, o iOS exibe um aviso de que o teclado pode coletar todas as teclas. As avaliações e avaliações do aplicativo sofrerão se os usuários sentirem seus dados em risco. Seja honesto e transparente na descrição da App Store e dentro do aplicativo do contêiner.

Dicas de design para acesso especial de caracteres

Organize símbolos para a lei dos encaixes

Coloque os caracteres especiais mais usados perto do centro do teclado ou na linha inferior para um alcance mais fácil do polegar. Por exemplo, se o seu público-alvo frequentemente digita moeda, coloque $, €, e £ na linha de casa da camada de símbolos. Agrupar símbolos semelhantes para reduzir a carga cognitiva.

Usar Feedback Visual

Quando uma tecla é pressionada, mostre uma breve janela (como a antevisão do teclado do sistema) para confirmar a entrada. Isto é especialmente útil para pequenos símbolos. Implemente um 'UIControl' personalizado para cada tecla que responda ao evento de toque para baixo e que mostre uma versão ampliada do caractere acima da tecla.

Incluir uma funcionalidade de auto- avanço para símbolos

Depois de inserir um caracter especial, muitos usuários esperam que o teclado retorne automaticamente à camada de letras. Você pode alternar este comportamento com uma opção na aplicação do recipiente. Isto torna a digitação de uma mistura de letras e símbolos mais rápida.

Acessibilidade de Suporte

Certifique- se de que o VoiceOver pode ler todas as teclas. Defina `acessibilidadeLabel` em cada botão da tecla para o caractere ou o seu nome (por exemplo, “asterisco” para *). Para as teclas simbólicas onde o glifo não é óbvio, forneça uma descrição falada. Também suporta o tipo dinâmico para que os usuários com grandes configurações de texto possam ver os símbolos claramente.

Considerações adicionais

Otimização de desempenho

Extensões de teclado são executadas em um ambiente restrito à memória. Evite carregar imagens pesadas ou animações complexas. Use subclasses de `UIButton` leves ou `UIColectionView` para reutilização eficiente. Em dispositivos antigos, renderizar uma grade completa de 30+ chaves deve ser suave. Perfilize sua extensão com instrumentos para verificar se há gotas de quadros.

Localização

Se o seu teclado suporta várias línguas, considere fornecer conjuntos de símbolos localizados. Por exemplo, um usuário francês pode precisar de «», enquanto um usuário alemão precisa de ß e Ä, Ö, Ü. Use a chave `PrimaryLanguage' em ‘Info.plist’ para dar dicas no idioma padrão, mas deixe os usuários mudarem através do aplicativo do contêiner. Guarde o layout selecionado em `UserDefaults’ com um pacote compartilhado (usando Grupos de Aplicativos) para que a extensão possa ler a preferência.

Revisão do App Store

A Apple analisa extensões personalizadas de teclado mais estritamente do que os aplicativos normais. Certifique-se de que o seu teclado não falha, não inclui conteúdo ofensivo e não contorna restrições do sistema. Evite banners de anúncios ou sobreposições promocionais no próprio teclado. Se o seu teclado necessitar de acesso à rede por qualquer motivo, esteja preparado para justificá-lo durante o processo de revisão.

Atualizações e Manutenção

As novas versões iOS podem alterar a forma como as extensões de teclado interagem com o sistema. Teste a extensão em versões beta e atualize as implementações do método ‘UIInputViewController’ conforme necessário. Por exemplo, o iOS 16 introduziu novas APIs de layout de teclado para teclados mais altos em iPads.

Conclusão

A implementação de um teclado personalizado com caracteres especiais no iOS é uma forma poderosa de melhorar a eficiência de digitação para usuários que precisam de símbolos, letras acentuadas ou emojis que o teclado do sistema não aparece imediatamente. Ao construir uma extensão de teclado com layouts cuidadosamente projetados, acesso intuitivo de longa pressão e manuseio robusto de entradas, você pode oferecer uma experiência perfeita. Priorize a privacidade, siga as diretrizes da Apple e teste cuidadosamente em dispositivos reais para garantir a confiabilidade. Com o design certo, seu teclado personalizado pode se tornar uma ferramenta essencial para usuários multilíngues, desenvolvedores, escritores e qualquer um que frequentemente digite caracteres não padrão.

Para mais informações, consultar a documentação oficial da Apple sobre Criando um teclado personalizado, o Guia de Programação de Extensão do App, e as Guia de Interface Humana para Teclados.