Aller au contenu
rdlabo.devdocs

Configurer Native UI

Cette page décrit les réglages. Commencez par le fonctionnement de la projection, puis la configuration Ionic ou HTML pour l’installation.

Appelez enableNativeUI() une seule fois après le montage du DOM de l’application. Les contrôles Ionic et HTML explicitement marqués partagent les moteurs Swift standard. Le thème est facultatif ; la disposition Web, les zones de sécurité et l’espacement relèvent de l’application ou du thème.

import { enableNativeUI } from '@rdlabo/capacitor-native-ui';

const shell = await enableNativeUI();

Sans Ionic, importez la même API depuis @rdlabo/capacitor-native-ui/core. Ce point d’entrée ne charge pas l’intégration facultative des popovers Ionic. Consultez le HTML simple.

Comportement par plateforme

Fonctionnalité iOS compatible Android Navigateur / ancien iOS
Contrôles Ionic automatiques (ionic.auto) Natifs Contrôles Web d’origine Contrôles Web d’origine
Boutons d’élément explicites Natifs Contrôles Web d’origine Contrôles Web d’origine
Extensions d’élément SwiftUI Kotlin / Compose Contenu Web d’origine
Vertical Bars Natif si disponible ; sinon rail Web Rail Web Rail Web
Extensions tab-accessory Uniquement avec un hôte d’onglets iOS compatible Contenu Web d’origine Contenu Web d’origine

Les rails Web nécessitent la disposition de rail Ionic ou un webHost HTML géré par l’application. Aucun réglage ne crée une capacité matérielle.

Pour le mode clair/sombre issu du HTML, consultez Apparence claire et sombre. L’apparence se configure en CSS Web, pas par une option de démarrage.

Tous les réglages

controls choisit les valeurs par défaut de sélection et de groupement. verticalBars configure le rail. ionic configure la découverte et l’apparence Ionic. Les champs omis de controls valent true, y compris dans les objets partiels.

const shell = await enableNativeUI({
  root: document.body,
  controls: {
    buttonGroup: true,
    button: true,
    backButton: true,
    tabs: true,
    segment: true,
    fab: true,
  },
  verticalBars: {
    enabled: true,
    // Facultatif : placement: { edge: 'trailing', webHost: appOwnedHost },
  },
  extensions: [],
  ionic: {
    auto: true,
    verticalBars: {
      buttonProjection: 'system',
      buttonDefaultFill: 'glass',
      popover: false,
    },
  },
  debug: false,
});

Valeurs de sélection par défaut

Chaque contrôle accepte ControlProjection. controls accepte lui-même ces valeurs comme raccourci pour les six champs.

Valeur Placement ordinaire Placement dans le rail vertical
true (par défaut) Sélectionné Sélectionné
false Non sélectionné Non sélectionné
'horizontalOnly' Sélectionné Non sélectionné
'verticalOnly' Non sélectionné Sélectionné

Horizontal et vertical décrivent le placement du contrôle, pas l’orientation de l’écran ni le modèle d’appareil. Ces valeurs ne déplacent aucun contrôle, ne fournissent aucune capacité manquante et ne rendent pas admissible un balisage non pris en charge.

Contrôle Responsabilité
buttonGroup Regrouper les actions déjà sélectionnées lorsque le groupe est admissible. Ne sélectionne jamais les enfants.
button Sélectionner les boutons ordinaires et les boutons de menu Ionic.
backButton Sélectionner la navigation arrière, indépendamment du groupe parent.
tabs Sélectionner les onglets et leur présentation de recherche enregistrée.
segment Sélectionner les segments pris en charge.
fab Sélectionner les boutons d’action flottants pris en charge.

Les attributs locaux data-horizontal-bars="true|false" et data-vertical-bars="true|false" remplacent la sélection par défaut correspondante. Sur ion-buttons, ils contrôlent uniquement le groupement. Les sources explicites data-native-ui sont indépendantes de ces valeurs. Les exclusions structurelles et la disponibilité du rail restent applicables. Consultez la sélection et le groupement dans la barre d’outils.

Autres réglages

Réglage Défaut Signification
root document.body Sous-arbre source connecté. Les contrôles extérieurs ne sont pas projetés.
verticalBars.enabled true Autoriser la projection dans le rail disponible.
verticalBars.placement omis { edge: 'leading' | 'trailing', webHost?: HTMLElement } facultatif. Le bord est une préférence, pas une déclaration de capacité.
extensions [] Expérimental. Extensions SwiftUI / Compose propres à l’application. Indépendantes de controls et ionic.auto ; l’application décide quand son lecteur retourne du contenu.
ionic.auto true Activer la découverte Ionic automatique. false la désactive, y compris les activations locales de disposition. Les sources explicites data-native-ui et les extensions restent indépendantes.
ionic.verticalBars.buttonProjection 'system' 'system' utilise le style natif ; 'source' projette les styles Ionic pris en charge. Les remplacements d’apparence locaux sont prioritaires.
ionic.verticalBars.buttonDefaultFill 'glass' 'glass' ou 'solid' pour les boutons Ionic autonomes en style source sans remplissage explicite. Les remplissages explicites et le défaut transparent dans les groupes sont prioritaires.
ionic.verticalBars.popover false Activer les popovers Ionic ancrés aux boutons natifs du rail. Nécessite le point d’entrée Ionic et ses dépendances pair facultatives.
debug false Journaliser les sources et raisons de repli dans la console de développement.

Hôte du rail de repli HTML

webHost est un rail HTML de repli facultatif dont l’application définit le style. Ses exigences sont :

  • Être connecté au même document que root.
  • Être extérieur à root ; aucun des deux éléments ne doit contenir l’autre.
  • Être stylé et positionné par l’application, y compris l’espace réservé au contenu.

Utilisez un root limité, comme votre <main>, avec un hôte frère ; le document.body par défaut ne peut pas avoir un tel hôte. Sans hôte, les rails HTML indisponibles laissent les contrôles d’origine visibles. La disposition de rail Ionic utilise son propre adaptateur de repli.

Le HTML prend actuellement en charge les boutons et boutons de retour. Les lecteurs d’onglets, segments et FAB restent des adaptateurs Ionic ; activer leurs réglages ne déduit pas de structures équivalentes d’un HTML arbitraire.

Configurations courantes

// Ionic ou HTML : tous les contrôles compatibles, rail actif par défaut.
const shell = await enableNativeUI();

// Variante : sélection automatique limitée au rail.
const railOnly = await enableNativeUI({ controls: 'verticalOnly' });

// Variante : sélectionner automatiquement les onglets uniquement.
const tabsOnly = await enableNativeUI({
  controls: { buttonGroup: false, button: false, backButton: false, tabs: true, segment: false, fab: false },
});

Ces configurations sont des alternatives : démarrez un seul shell. Répéter un démarrage avec des réglages équivalents retourne son handle ; des réglages différents nécessitent de détruire le shell précédent.

controls: false désactive toute sélection et tout groupement par défaut, mais les attributs locaux peuvent encore les activer. ionic: { auto: false } désactive au contraire toute découverte Ionic automatique. Aucun des deux ne désactive les sources HTML explicites ni les extensions.

verticalBars.enabled: false laisse les contrôles du rail sur le Web, quelle que soit la sélection. Les contrôles ordinaires ne sont pas affectés. data-native-ui-placement="element" conserve la position originale d’un contrôle explicite, même avec controls: 'verticalOnly'. Pour les groupes Ionic, placez l’attribut sur tout le groupe ion-buttons afin que sa surface native partagée ait un seul placement.

Sélectionner explicitement des contrôles dans une application Ionic personnalisée

Désactivez la projection Ionic automatique en conservant le rail natif et vos extensions personnalisées :

const shell = await enableNativeUI({
  root: document.querySelector<HTMLElement>('#content')!,
  ionic: { auto: false },
  verticalBars: {
    enabled: true,
    placement: {
      edge: 'trailing',
      webHost: document.querySelector<HTMLElement>('#rail')!,
    },
  },
  extensions: [myExtension],
});
<main id="content">
  <ion-button>Keep this on the Web</ion-button>
  <ion-button data-native-ui="button" data-native-ui-placement="rail">Project this action</ion-button>
  <button data-native-ui="button">Project at its original position</button>
</main>
<aside id="rail" aria-label="Actions"></aside>

Conservez les gestionnaires d’origine sur chaque source. Un ion-button explicite utilise le lecteur standard de boutons : les règles de contenu et de style s’appliquent toujours ; l’attribut ne rend pas un balisage arbitraire compatible. data-native-ui-placement="rail" demande le rail système disponible. Stylisez le webHost facultatif et réservez l’espace dans votre application ; sans lui, les rails explicites indisponibles laissent leurs sources visibles. Les contrôles Ionic non marqués restent Web. Un groupe automatique contenant une source explicite reste Web pour éviter de la couvrir deux fois.

Les sources intégrées explicites prennent en charge les éléments individuels button, ion-button et [role="button"] avec data-native-ui="button" ou "back-button". Cela n’active pas les lecteurs propres à Ionic pour les ion-back-button, ion-menu-button, groupes, onglets, segments ou FAB existants. Gardez la projection automatique pour le type concerné, utilisez un bouton explicite standard avec votre gestionnaire de clic, ou enregistrez une extension pour une interface personnalisée.

verticalBars.enabled régit toujours la disponibilité du rail. Pour laisser une source sur le Web, retirez son marqueur explicite ou utilisez data-native-ui="disabled".

Modifier l’utilisation du rail après le démarrage

await shell.disableVerticalControlArea();
await shell.enableVerticalControlArea();

Ces méthodes modifient verticalBars.enabled sur ce shell en préservant apparence, contrôles et placement. Elles retirent la projection existante avant de transférer la responsabilité, sans créer d’autre shell. Les appels sont sérialisés. Après destroy(), ces deux méthodes rejettent l’appel.

const lease = await shell.suspend(); // restaurer temporairement tous les contrôles Web
await lease.resume();
await shell.destroy(); // arrêter le shell et restaurer les sources

Désactiver la projection du rail ne retire pas le CSS de l’application et ne modifie pas son espacement. Mettez à jour votre propre disposition avec ce réglage si nécessaire.

Demander une vérification après un changement non observé

shell.markForCheck();

Utilisez cette méthode après modification d’une propriété ou d’un état du lecteur sans mutation DOM. Elle planifie une vérification, regroupe les demandes répétées et envoie uniquement les instantanés natifs modifiés. Elle retourne void ; elle n’attend pas la fin native et ne rend pas le DOM de votre framework. Les appels après destruction sont ignorés. Consultez les vérifications et l’observation des sources.

Comprendre pourquoi une source reste Web

Ajoutez temporairement debug: true à vos options de démarrage existantes, puis recompilez l’application Web. Ne démarrez pas un second shell pour activer le diagnostic :

const shell = await enableNativeUI({ debug: true, extensions: [myExtension] });
console.info(shell.getStatus());

Ouvrez la console de développement de la WebView et filtrez sur [Native UI]. Les diagnostics incluent la source DOM lorsqu’elle est disponible. Chaque raison est journalisée une seule fois par source pendant cette activation, évitant que le défilement ou les appels markForCheck() répétés saturent la console. Les props, données d’action et messages d’exception de l’application ne sont pas journalisés.

Diagnostic Vérification
web-fallback Compatibilité de la plateforme, enregistrement du plugin, synchronisation et recompilation native.
unregistered-extension Le nom d’enregistrement natif correspond à la définition DOM et l’enregistrement précède le démarrage. Les nouvelles sources sont également vérifiées.
reader-error / invalid-props Implémentation du lecteur, valeurs JSON uniquement et limite de 64K.
unsupported-placement / missing-tab-owner Plateforme et hôte d’onglets natif propriétaire d’un accessoire.
source-hidden / source-clipped / source-focused Visibilité, découpage/ancêtres transformés ou descendant Web ayant le focus.
reader-opt-out Votre lecteur a retourné null.
unsupported-control Balisage pris en charge, nom accessible, placement fixe et styles.
native-rejected Décodage natif des props, placement ou compatibilité de l’appareil. Le pont signale le rejet, pas l’exception native.

getStatus() résume le shell ; ce n’est pas un diagnostic par élément. La navigation normale, la suspension et le contenu non pris en charge peuvent volontairement conserver la présentation Web. Désactivez le débogage après l’enquête ; il ne modifie pas l’admissibilité à la projection.

Applications existantes

La fonction autonome enableVerticalControlArea() utilise 'verticalOnly' comme sélection par défaut. Son utilitaire setPlacement() est un adaptateur CSS Web obsolète ; utilisez setVerticalBarsLayout({ edge, inset }) du thème pour la disposition Web. La disponibilité native provient des métriques de l’appareil du plugin.

Consultez la migration depuis 1.2.1 pour la séparation des packages, les options supprimées et les changements de valeurs par défaut des objets de contrôles partiels.