Comprendre les extensions de claviers iOS personnalisés

iOS fournit un cadre solide pour construire des extensions de clavier personnalisées qui peuvent remplacer ou compléter le clavier système. Ces extensions fonctionnent comme des processus séparés et sont sandboxed, ce qui signifie qu'ils ont un accès limité aux ressources du système et aux données utilisateur. La classe `UIInputViewController` est la base de tout clavier personnalisé, la gestion de la gestion des entrées, la mise en page de la vue et la communication avec l'application hôte.

Les claviers personnalisés peuvent inclure n'importe quelle disposition, y compris des caractères spéciaux, des lettres accentuées, des emojis, ou même des entrées basées sur des gestes. Cependant, Apple impose des règles strictes : le clavier ne peut accéder aux ressources réseau sans autorisation explicite de l'utilisateur, et il ne doit pas collecter des données de frappe pour l'analyse sans consentement clair.

Lorsque vous construisez un clavier personnalisé, vous créez essentiellement une extension d'application. L'extension est emballée dans une application hôte, et les utilisateurs doivent installer cette application et ensuite activer l'extension via Settings > General > Keyboards > Keyboards. Contrairement à Android, iOS ne permet pas de remplacer complètement le clavier système; les utilisateurs doivent passer à votre clavier manuellement.

Pour les caractères spéciaux, la puissance réelle réside dans la conception de modèles d'accès efficaces. De nombreux développeurs créent des claviers qui regroupent logiquement les symboles, offrent des popups longue pression pour des variantes supplémentaires, ou fournissent une couche de symboles dédiée.

Configuration du projet d'extension de clavier

La création d'un clavier personnalisé commence à l'intérieur du Xcode. Vous avez besoin à la fois d'une application conteneur et de la cible d'extension du clavier.

Ajouter une nouvelle cible dans Xcode

Ouvrez votre projet iOS existant ou créez un nouveau. Allez dans File > New > Target[, puis sélectionnez Clavier personnalisé[ dans la catégorie Extension d'application. Donnez-lui un nom de produit, tel que -SpecialCharKeyboard.

Configurer Info.plist

L'extension `Info.plist` contient deux touches critiques sous `NSExtension`:

  • IsASCIICapable : Réglez à `YES` si votre clavier utilise uniquement des caractères ASCII; autrement définissez `NO`.
  • PréférencesRightToLeft: Ajustez si votre langue se lit de droite à gauche.
  • Langue principale: Définir un code de langue (par exemple, «en-US»).

Ajoutez également la `Confidentialité - Utilisation de la caméra` uniquement si vous incluez des fonctionnalités d'entrée basées sur la caméra (rare pour un clavier).

Comprendre le droit à la demandeOpenAccess

Par défaut, les claviers personnalisés n'ont pas d'accès réseau. Si vous devez télécharger des jeux de caractères spéciaux ou fournir une synchronisation cloud, vous devez ajouter la touche `RequestOpenAccess` sous `NSExtensionAttributes` dans `Info.plist` et la définir à `YES`. Cependant, Apple examine les applications qui demandent un accès ouvert avec soin.

Construire l'interface utilisateur de base

La méthode `viewDidLoad` à l'intérieur `KeyboardViewController` est où vous avez configuré votre disposition du clavier. Vous pouvez utiliser un storyboard ou construire l'interface programmatiquement. Pour une mise en page complexe avec de nombreux caractères spéciaux, l'interface utilisateur programmatique offre un meilleur contrôle sur les contraintes dynamiques de calibrage et de mise en page automatique.

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)
 ])
}

Cette configuration minimale crée une pile verticale qui tiendra des rangées de clés.

Conception de la disposition du clavier pour les caractères spéciaux

Les claviers de caractères spéciaux nécessitent une organisation attentive. Les utilisateurs doivent trouver des symboles rapidement sans chasser à travers des pages de touches infinies. Commencez par regrouper des symboles dans des catégories logiques:

  • Symboles de monnaie: $, €, £, ¥, ¥, ¥
  • Signes mathématiques: +, -, ×, ÷, =, -, -, ±, √, -, -, -,
  • Variantes de ponctuation: ..., —, –, •, ‹, ›, «, »
  • Lettres parfumées: a, é, í, ó, ú, ü, ñ, ç
  • Arrivées et directionnelles: ←, →, ↑, ↓, ↓, -

Implémentez deux ou trois calques de mise en page : un calque alphabet principal avec un basculement pour passer à un calque de symboles, et éventuellement un calque secondaire avec des caractères moins communs. Utilisez une clé dédiée (par exemple -123 , ou -123 ,#+=-) pour basculer entre les calques. Chaque calque est une collection séparée de vues de lignes que vous pouvez échanger via la propriété `inputView` ou en cachant/afficher des vues.

Gestures à longue pression pour caractères supplémentaires

Si votre clavier affiche une mise en page standard QWERTY, les utilisateurs s'attendent à ce que la longue pression révèle des variantes de caractères. Par exemple, en appuyant sur la touche -E--shows -Shows -Shows -Shows -Shows -Shows -Shows -Shows -Shows -Shows -Shows -Shows , -Shows, -Shows, -Shows, -Shows, , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , , ,

Apple , clavier système utilise un mécanisme interne, mais pour votre extension, vous pouvez utiliser un `UIView` qui apparaît comme une bulle flottante. Assurez-vous que le popup ne s'étend pas au-delà de la zone de sécurité et qu'il respecte l'orientation de l'appareil.

Extrait de code: Ajout d'une longue pression sur une clé

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

Dans le gestionnaire, suivre l'état `.began`, `.changed` et `.ended` pour afficher, mettre à jour et sélectionner dans la fenêtre contextuelle.

Taille et espacement des clés

Les appareils iOS varient en largeur d'écran. Utilisez un calibre proportionnel : 10 à 12 touches par rangée sur iPhones, et un peu plus sur iPads. Chaque touche doit avoir au moins 28 points de hauteur pour répondre aux lignes directrices d'Interface Humaine Apple. Définissez les contraintes afin que les touches se rétrécissent de façon appropriée sur les petits écrans.

Manipulation de l'entrée avec le document texte proxy

Lorsqu'un utilisateur touche une clé, le clavier doit insérer le caractère dans le champ de texte actuellement focalisé. Ceci est fait par l'intermédiaire de l'objet `textDocumentProxy`, une instance de `UITextDocumentProxy`. Le proxy fournit des méthodes comme `insertText( :)`, `deleteBackward()` et `adjustTextPosition(byCaracterOffset:)`.

Pour les caractères spéciaux, vous devez souvent insérer des glyphes multioctets (comme les émojis ou les diacritiques combinés). Ils sont gérés correctement par `insertText`, tant que vous passez la bonne chaîne Unicode. Par exemple, pour insérer le caractère accentué --, appelez `proxy.insertText("é")`. Pour un accent combiné comme -- avec un accent aigu combiné (U+0301), vous insérez les deux caractères: `proxy.insertText("e\u{0301}")`. Cependant, il est plus simple d'utiliser le formulaire précomposé: ``\u{00E9}"`.

Manipulation du poste et des bouchons Verrouillage

Lorsque la touche de changement est active, votre clavier doit afficher des variantes de la touche de changement de classe. Pour les caractères spéciaux qui ont des cas (comme les lettres grecques), fournir les deux. Pour les symboles sans cas, l'état de changement peut être ignoré ou utilisé pour afficher des symboles alternatifs (par exemple, la touche de changement de classe + nombre affiche souvent le symbole au-dessus du nombre).

Utiliser une propriété booléenne «shiftActive» pour suivre l'état. Lorsque l'utilisateur touche la touche de changement, basculez-la et rechargez les touches. Pour verrouiller les touches, détectez une double touche sur la touche de changement; activez un état de caps persistant et affichez un indicateur (par exemple, touche de changement soulignée).

Supprimer et contrôler le curseur

Pour un clavier à caractères spéciaux, les utilisateurs peuvent avoir besoin de supprimer rapidement des mots entiers. Vous pouvez implémenter une action -delete word-delete en appelant `deleteBackward()` dans une boucle ou en utilisant la méthode `adjustTextPosition` pour déplacer le curseur vers l'arrière sur les limites des mots, puis supprimer. Cependant, Apple limite la quantité de choses que vous pouvez manipuler le curseur via `adjustTextPosition` pour des raisons de confidentialité; vous ne pouvez pas lire le texte autour du curseur.

Pour déplacer le curseur vers l'avant ou vers l'arrière, utilisez `proxy.adjustTextPosition(parCaracterOffset: 1)` et `-1`. Ceci est utilisé pour un bouton -espace suivant - ou -espace précédent - si vous choisissez d'inclure un.

Activer et tester l'extension du clavier

Essais de simulation

Dans Xcode, lancez l'application conteneur sur un simulateur. Puis allez dans Settings > General > Keyboards > Keyboards > Ajouter un nouveau clavier[ et sélectionnez votre extension clavier personnalisée sous la section -Keyboards tiers. Vous pouvez avoir besoin de passer à votre clavier en appuyant sur l'icône du globe lorsqu'un champ de texte est actif. Déboguer les extensions clavier dans le simulateur peut être difficile parce que les points d'arrêt ne peuvent pas toujours déclencher. Utilisez les instructions `NSLog` ou `print` et vérifiez la sortie de console.

Essais physiques des dispositifs

Tester le périphérique est essentiel parce que le simulateur n'émule pas complètement tous les comportements iOS (par exemple, contraintes de hauteur du clavier, correction automatique). Installer l'application conteneur sur un périphérique via un profil de provisionnement de développement. Puis activer le clavier à partir de Paramètres. Utilisez Xcodes Attach to Process feature to debug the extension: in the debug navigator, choose your extension=s process name (ex., =SpecialCharKeyboard=).

Questions communes

  • Clavier ne figurant pas: Assurez-vous que l'extension est correctement activée et que le droit `RequestOpenAccess` correspond à vos besoins. Vérifiez également que la `classe principale` dans `Info.plist` pointe vers votre `KeyboardViewController`.
  • Layout pas correctement dimensionner[: Override `viewWillLayoutSubviews` dans votre `KeyboardViewController` et mettre à jour la contrainte de hauteur de la vue. Le clavier doit se conformer à la hauteur prévue système (habituellement entre 216 et 330 points sur iPhone, et plus grand sur iPad).
  • Input not registring[: Vérifiez que vous appelez `insertText` sur l'objet mandataire correct. Le mandataire est disponible dès que le clavier est actif.

Confidentialité et autorisations des utilisateurs

Les claviers personnalisés sont un sujet de préoccupation pour la confidentialité de l'utilisateur. Apple exige que les claviers ne collectent, ne transmettent pas ou ne stockent pas les données de frappe sans le consentement explicite de l'utilisateur. Les lignes directrices suivantes sont essentielles:

  • Aucun appel réseau: Sauf si vous avez activé `RequestOpenAccess` et que l'utilisateur accorde la permission, votre extension ne peut pas faire de demande réseau.
  • Aucun accès au presse-papiers: Votre clavier ne peut pas lire le presse-papiers système. Seule l'application hôte peut accéder au presse-papiers, et seulement lorsque l'application est active.
  • Aucune analyse des frappes: Vous ne pouvez pas enregistrer les touches qui sont pressées. Si vous devez apprendre les préférences de l'utilisateur (par exemple, les symboles fréquemment utilisés), stockez ces données localement uniquement avec une explication claire et une option de désactivation.
  • Fournir un toggle pour la collecte de données[: Si votre clavier utilise le réseau pour les mises à jour de caractères spéciaux, inclure un commutateur dans l'application conteneur pour l'activer/désactiver, et respecter le choix de l'utilisateur.

Lorsque les utilisateurs activent votre clavier, iOS affiche un avertissement que le clavier pourrait collecter toutes les frappes. Votre application commentaires et les cotes souffriront si les utilisateurs sentent que leurs données sont en danger. Soyez honnête et transparent dans votre description App Store et à l'intérieur de l'application conteneur.

Conseils de conception pour l'accès spécial aux caractères

Organisez les symboles pour les instruments de loi

Placez les caractères spéciaux les plus fréquemment utilisés près du centre du clavier ou sur la rangée inférieure pour faciliter la portée du pouce. Par exemple, si votre public cible tape souvent la monnaie, mettez $, € et £ sur la rangée d'origine du calque de symboles. Groupez des symboles similaires ensemble pour réduire la charge cognitive.

Utiliser la rétroaction visuelle

Lorsqu'une clé est pressée, affichez un court popup (comme l'aperçu du caractère du clavier système) pour confirmer l'entrée. Ceci est particulièrement utile pour les petits symboles. Implémentez un `UIControl` personnalisé pour chaque clé qui répond à l'événement touchdown et affiche une version agrandie du caractère au-dessus de la clé.

Inclure une fonction d'avance automatique pour les symboles

Après avoir inséré un caractère spécial, de nombreux utilisateurs attendent du clavier qu'il retourne automatiquement à la couche lettres. Vous pouvez basculer ce comportement avec une option dans l'application conteneur. Cela rend plus rapide la saisie d'un mélange de lettres et de symboles.

Accessibilité

Assurez-vous que VoiceOver peut lire toutes les clés. Définissez `accessibilityLabel` sur chaque bouton de touche au caractère ou à son nom (par exemple, -astreisk= pour *). Pour les clés symboliques où le glyphe n'est pas évident, fournissez une description parlée.

Considérations supplémentaires

Optimisation des performances

Les extensions de clavier fonctionnent dans un environnement à mémoire limitée. Évitez de charger des images lourdes ou des animations complexes. Utilisez des sous-classes `UIButton` légères ou `UICOllectionView` pour une réutilisation efficace. Sur les appareils plus anciens, rendre une grille complète de 30 touches plus doit être lisse.

Localisation

Si votre clavier prend en charge plusieurs langues, envisagez de fournir des jeux de symboles localisés. Par exemple, un utilisateur français peut avoir besoin de « » alors qu'un utilisateur allemand a besoin de ß et Ä, Ö, Ü. Utilisez la touche `PrimaryLanguage` dans `Info.plist` pour indiquer la langue par défaut, mais laissez les utilisateurs passer par l'application conteneur.

App Store Review

Apple examine les extensions de clavier personnalisées plus strictement que les applications normales. Assurez-vous que votre clavier ne s'écrase pas, n'inclut pas de contenu offensant et ne contourne pas les restrictions du système. Évitez les bannières publicitaires ou les superpositions promotionnelles sur le clavier lui-même. Si votre clavier nécessite un accès réseau pour une raison quelconque, soyez prêt à le justifier pendant le processus de révision.

Mises à jour et maintenance

Les nouvelles versions iOS peuvent modifier la façon dont les extensions de clavier interagissent avec le système. Testez votre extension sur les versions bêta et mettez à jour les implémentations de la méthode `UIInputViewController` au besoin. Par exemple, iOS 16 a introduit de nouvelles API de mise en page de clavier pour les claviers plus grands sur iPad.

Conclusion

La mise en œuvre d'un clavier personnalisé avec des caractères spéciaux sur iOS est un moyen puissant d'améliorer l'efficacité de la dactylographie pour les utilisateurs qui ont besoin de symboles, de lettres accentuées ou d'émojis que le clavier système ne fait pas surface immédiatement. En construisant une extension clavier avec des mises en page soigneusement conçues, un accès à longue pression intuitive et une gestion d'entrée robuste, vous pouvez fournir une expérience transparente.

Pour plus de détails, consultez la documentation officielle d'Apple sur Création d'un clavier personnalisé[, le Guide de programmation d'extension d'application[ et les Directives d'interface humaine pour les claviers.