Sauter au contenu principal

Qu'est-ce que l'architecture de plugin ? Une guide complet pour 2026

Qu'est-ce que l'architecture de plugin - Apprenez ce qu'est l'architecture de plugin et comment elle alimente les applications comme Capacitor et Electron, ainsi que les compromis en matière de sécurité, de cycle de vie et de

Qu'est-ce que l'architecture de plugin ? Une guide complet pour 2026

Votre application commence comme un monolithe propre. Ensuite, les clients demandent un nouveau fournisseur de paiement, l'équipe de bureau a besoin d'une intégration de fichier différente et les versions mobiles accumulent des workarounds spécifiques au plateau. Bientôt, chaque fonctionnalité touche les mêmes modules centraux, chaque mise à jour risque une régression non liée et personne ne peut expliquer quel équipe possède la limite d'intégration.

C'est là que l'architecture de plugin est conçue pour répondre. Une application hôte stable expose des points d'extension définis, tandis que des plugins independents mettent en œuvre du comportement contre ces contrats. Le modèle peut rendre un grand système plus facile à étendre, mais il introduit également la gestion du cycle de vie, le travail de compatibilité, les préoccupations de distribution et une surface de sécurité plus large.

Tableau de Contenu

Pourquoi les équipes adoptent-elles l'architecture de plugin

Une équipe a généralement recours aux plugins après la deuxième ou la troisième expansion d'un produit, et non au début. Une application Capacitor peut commencer avec l'authentification et les paiements à l'intérieur du codebase principal. Une application Electron peut placer l'accès au système de fichiers, le stockage cloud, la mise en page et les workflows spécifiques aux clients directement dans le processus hôte. Cette approche semble efficace tandis que l'ensemble des fonctionnalités est petit. Cela devient coûteux lorsque chaque nouvelle intégration nécessite des modifications au code partagé code et des lancements coordonnés.

Architecture de plugin separe l'hôte de la fonctionnalité facultative ou remplaçable. L'hôte possède la coquille de l'application, l'état partagé, la navigation, les autorisations et les workflows de base. Un plugin possède une capacité délimitée, comme un appareil API natif, un adaptateur d'analytique, un fournisseur de stockage ou une commande d'édition. Les deux côtés communiquent à travers un contrat, et non à travers des appels arbitraires dans les internals l'un de l'autre.

La valeur architecturale provient de cette frontière. Un système de plugins est généralement construit autour d'interfaces, de classes abstraites, de sujets d'événements ou d'un registre de services. Les plugins mettent en œuvre ces contrats et sont découverts à l'initialisation ou à l'exécution. Cela isole la logique de base de la logique d'extension, réduisant la couplage et permettant aux équipes d'ajouter ou de remplacer le comportement sans modifier le fichier binaire de l'hôte, comme décrit dans la La référence de l'architecture de plugin de l'Université de Waterloo.

Ce que le modèle résout

Le modèle fonctionne bien lorsque plusieurs équipes doivent étendre le même produit sans éditer constamment les mêmes modules. Une équipe de paiement peut maintenir un adaptateur de fournisseur tandis que l'hôte continue à posséder l'état de la facturation. Une équipe de bureau peut supporter les différences du système d'exploitation derrière une interface d'application unique. Une fonctionnalité spécifique pour le client peut être activée par l'enregistrement plutôt que de fusionner dans chaque installation.

Cette séparation améliore également la remplacement. Si l'hôte dépend d'une stabilité StorageProvider En contract, vous pouvez remplacer une implémentation tout en gardant l'application stable. Le bénéfice n'est pas que les mises à jour deviennent automatiques. Le bénéfice est que la limite de mise à jour devient visible et testable.

Les équipes qui adoptent des composants open-source rencontrent souvent la même distinction entre une extension réutilisable et une dépendance non gérée. Le Les avantages open-source guide offre un contexte utile pour évaluer ce compromis.

Règle pratique : Une limite de plugin doit supprimer les connaissances de l'hôte. Si l'hôte connaît toujours les particularités de chaque fournisseur, le système a déplacé des fichiers sans réduire la couplage.

Ce à quoi cela ne résout pas

Les plugins ne sauveront pas un API. Si le contrat change chaque fois qu'une équipe de fonctionnalité a besoin d'une nouvelle option, chaque plugin devient un projet de migration. Ils ne résolvent pas non plus les problèmes d'appartenance. Quelqu'un doit encore passer en revue les implémentations, publier des conseils de compatibilité, répondre aux échecs et retirer les extensions abandonnées.

Utilisez les plugins lorsque vous avez un véritable besoin d'une mise à jour independante, d'une capacité optionnelle, de plusieurs implémentations ou d'autonomie d'équipe. N'introduisez-les pas simplement parce que un framework rend la registration facile. Si une équipe possède l'ensemble du produit, l'extension de point est peu probable de changer, et la fonctionnalité doit toujours être livrée avec l'hôte, un module normal peut être plus simple et plus sûr.

Composants clés d'un système de plugin

Un système de plugin a quatre pièces qui doivent être claires avant la mise en production code : l' application hôtela la limite de contratla les pluginset la le chargeur. L'ambiguïté dans l'une quelconque d'entre elles crée des problèmes opérationnels qui ne seront pas exposés par la compilation.

Un diagramme illustrant les quatre composants de base d'un système de plugins : Application Hôte, Limite de Contrat, Plugins et Chargeur.

Le hôte fournit l'environnement de runtime et la politique. Le contrat définit la connexion entre l'hôte et l'extension. Un plugin implémente ce contrat, tandis que le chargeur découvre, valide, démarre et arrête celui-ci. Cette limite ressemble à une prise électrique standardisée : un appareil ne peut être remplacé que lorsque la forme et les règles de sécurité de la prise restent stables.

l'application hôte

L'application hôte possède des capacités qui ne devraient pas être recréées par les plugins. Dans un produit Electron, ces capacités peuvent inclure le processus principal, la gestion des fenêtres, la gestion des mises à jour, l'état d'authentification et les menus de l'application. Dans un produit Capacitor , elles peuvent inclure l'application JavaScript, la navigation, la configuration partagée et l'environnement d'initialisation du pont natif.

L'application hôte possède également la politique. Elle décide quels plugins sont autorisés, quand ils chargent, quelle configuration ils reçoivent et comment une erreur affecte l'expérience utilisateur. Cette politique fait partie de la limite de sécurité. Un plugin devrait demander une capacité approuvée à travers l'hôte au lieu de pénétrer dans les internes non liés, où un petit changement d'implémentation peut devenir un problème de permission ou de compatibilité.

La limite du contrat

Le contrat définit ce que les deux côtés peuvent supposer. Il peut s'agir d'une interface TypeScript, d'un protocole natif, d'un sujet d'événement, d'une classe abstraite ou d'une entrée de registre. Il devrait spécifier les entrées, les sorties, les erreurs, les attentes de cycle de vie, les exigences de capacité et le comportement de compatibilité.

Maintenez le contrat plus petit que son implémentation. Un interface peut exposer FileExporter et canExport, export, tandis que les bibliothèques de fichiers système et les détails spécifiques au plateau sont masqués. Les contrats stables réduisent la couplage, mais ils n'éliminent pas le travail de versionnage. Une fois qu'un plugin dépend d'un contrat, modifier une méthode ou une garantie de cycle de vie peut obliger à des sorties coordonnées et à la migration __CAPGO_KEEP_0__. disposePour une vue spécifique à code, cette

guide aux plugins Capacitor guide to Capacitor plugins HTML text fragment from a longer Capgo UI string (parent key `capwesome_diff_plugins_capgo`). Page/area: Capawesome comparison page. Role: Long marketing or legal paragraph. Seen in: page capwesome.astro. Preserve Capgo product/brand and developer terms exactly. Message key `capwesome_diff_plugins_capgo` (Capwesome Diff Plugins Capgo).

aide à clarifier quel comportement appartient derrière le pont JavaScript-natif. Le pont est également une limite de cycle de vie, donc l'initialisation, les demandes d'autorisation et la mise au rebut nécessitent un traitement explicite plutôt que des hypothèses sur la durée de vie du processus.

Les plugins et le chargeur de plugins : les plugins mettent en œuvre le contrat et déclarent l'identité, les versions du contrat prises en charge, les capacités requises, le schéma de configuration et l'état de cycle de vie. Ils peuvent être livrés avec l'hôte, arriver d'un registre, charger en tant que modules partagés ou utiliser une distribution contrôlée. Chaque choix change la surface de sécurité et la réponse de l'équipe lorsque l'extension est compromise ou abandonnée.

Le chargeur transforme les déclarations en un système en cours d'exécution. Il découvre les candidats, valide les métadonnées, vérifie les permissions et les versions, charge code, construit le plugin, enregistre les services ou les gestionnaires, et gère l'activation et la mise au rebut. Vue d'ensemble de l'architecture du modèle de plugin pour .NET.

Un chargeur qui ne fait que import() est incomplet. Le comportement de production nécessite également l'isolement des erreurs, la détection des doublons, la journalisation, les temps d'attente, la gestion de l'arrêt et une décision pour les versions incompatibles. Sans ces contrôles, un plugin lent, dangereux ou obsolète peut devenir une dépendance cachée de l'hôte entier.

Modèles de plugins courants et quand les utiliser

Les modèles de plugins diffèrent principalement en fonction de la manière dont l'hôte et l'extension communiquent. Les systèmes basés sur les événements diffusent des faits. Les registres de services fournissent un accès explicite. Les systèmes basés sur les capacités contrainent ce que le plugin est autorisé à faire. Le choix entre eux nécessite plus qu'une copie du modèl’utilisé par un framework populaire.

Comparaison de tableau des modèles de plugin basés sur les événements et les registres de services et de l'injection de dépendances pour l'architecture de plugin logicielle.

Plugins basés sur les événements

Le hôte publie des événements tels que document.saved, session.started, ou update.failed. Les plugins s'abonnent et réagissent sans que l'hôte sache leurs types concrets. C'est un bon ajustement pour les analyses, la telemétrie, la journalisation d'audit, les notifications et d'autres effets secondaires qui ne devraient pas bloquer le flux principal.

La mode de panne est l'ambiguïté. Si un événement n'a pas de garantie de livraison claire, un plugin peut supposer qu'il reçoit tous les événements lorsque l'hôte ne fournit qu'une livraison au meilleur effort.

Les registres de services et l'injection de dépendances

Un registre permet aux plugins de fournir des services nommés, tandis que les consommateurs demandent ces services à travers une interface définie. L'injection de dépendances rend les relations plus explicites et peut valider les dépendances requises lors du démarrage. Cette approche convient aux IDE, aux applications d'entreprise et aux produits où les plugins contribuent des commandes, des fournisseurs de stockage, des compilateurs ou des adaptateurs de protocole.

Le compromis est un couplage plus fort aux contrats de services et à la configuration de démarrage. Un fournisseur manquant peut empêcher l'hôte de démarrer, et les cycles de dépendances peuvent être difficiles à diagnostiquer. Les interfaces versionnées et la clarté de l'optionnalité sont plus importantes ici que la commodité.

Modèle Meilleure correspondance Contexte : Page/zone : Page de produit Capgo Builder / produit de construction native cloud. Rôle : Étiquette de navigation ou élément de navigation court. Clé de message `native_build_builder_compare_fit_feature` (Native Build Builder Compare Fit Feature).
Risque de production Événementiel Télémétrie, audit, notifications
L'ordre caché et les hypothèses de livraison Registre de services Échecs de dépendances et couplage de démarrage
Architecture basée sur les capacités Outils sensibles ou isolés Complexité des politiques et API restreintes

Plugins basés sur les capacités

Un design basé sur les capacités donne à chaque plugin un ensemble contrôlé d'opérations. Au lieu de concéder un accès général au système de fichiers ou à la réseau, l'hôte fournit des handles ou des fonctions spécifiques. Ce modèl’est de plus en plus pertinent pour les assistants AI et les outils de développement, où les extensions peuvent nécessiter des actions puissantes mais ne devraient pas recevoir une autorité non limitée.

Pour les équipes conçant des systèmes orientés outils, le guide ThirstySprout sur l'architecture AI fournit un contexte architectural plus large. La décision pratique est simple : choisissez les événements pour des réactions découpées, les services pour une collaboration structurée fiable et les capacités lorsque les limites de permission sont importantes. Un filtre utile est de se poser trois questions. Le plugin a-t-il besoin d'un accès synchronisé à faible latence ? Il gère-t-il des données sensibles ou exécute-t-il des __CAPGO_KEEP_0__ non fiables ? Plusieurs équipes publieront-elles indépendamment ? Ces réponses élargissent généralement le modèl’avant que les préférences de framework ne soient discutées. Conception des API et des hooks de cycle de vie des plugins

Un plugin code peut rester stable pendant des années, ou transformer chaque mise à jour de plateforme en un problème de compatibilité. Définissez la plus petite capacité que l'hôte peut supporter, puis spécifiez le comportement de cycle de vie avant de créer des adaptateurs de plateforme.

Échecs de dépendances et couplage de démarrage

A plugin API can remain stable for years, or turn every platform update into a compatibility problem. Define the smallest capability the host can support, then specify lifecycle behavior before writing platform adapters.

A diagramme illustrant une guide à trois étapes pour concevoir les API et les hooks de cycle de vie des plugins pour le développement logiciel.

Définir la surface API

Separez les concepts stables des détails d'implémentation. Un plugin Capacitor pourrait exposer un API JavaScript typé tel que scan, authorizeou getStatusalors que iOS et Android traduisent ces appels en comportement natif. Le contrat JavaScript devrait documenter les erreurs de permission, les fonctionnalités indisponibles, l'annulation et les différences de plateforme. La supposition que chaque plateforme se comporte de la même manière pousse la complexité dans chaque appelant.

Electron a besoin d'une frontière différente. Gardez les capacités Node dans les code privilégiés, et exposez des APIs étroites et explicites à travers un pont de chargement de préalable vers les processus de rendu. Donner à un rendu un accès Node large peut accélérer un prototype, mais cela crée un contrat qui devient difficile à sécuriser et à modifier.

Écrivez :

  • Entrées et sorties : Définir les schémas, la nullabilité et les réponses à l'échec.
  • Exigences de capacité : Dites si le plugin nécessite un stockage, un réseau, des notifications ou des permissions natives.
  • Règles de concurrence : Documenter si les appels peuvent se chevaucher et comment fonctionne l'annulation.
  • Politique de compatibilité : Expliquer quelles modifications sont additives et quels en nécessitent une nouvelle version de contrat.

Les équipes travaillant de part et d'autre d'une frontière Capacitor native et JavaScript peuvent utiliser ce Capacitor guide de développement de plugin comme référence pratique.

Faire le cycle de vie explicite

Un plugin nécessite plus qu'un constructeur. Un cycle de vie fonctionnel peut inclure init, activate, deactivate, et dispose. init vérifie la configuration et prépare les références. activate s'inscrit aux écouteurs ou expose des services. deactivate arrête de nouvelles tâches, tandis que dispose libère des releases, des listeners, des timers, des handles de fichiers et des ressources natives.

Ces états sont importants lors de la re création de la fenêtre Electron, de la suspension de l'application mobile, des modifications des drapeaux de fonctionnalité, de la désintégration des tests et des échecs partiels. Un plugin qui s'inscrit un listener à chaque activation sans le supprimer peut produire des notifications dupliquées et conserver un état d'application périmé.

Règle de cycle de vie : Tout allocation en activation nécessite un propriétaire évident et un chemin de libération également évident.

Separez la charge de la charge

Le chargeur doit décider si code peut être chargé. Le contrat doit décider ce que le plugin chargé peut faire. La séparation de ces responsabilités soutient la versionnement independent, l'option de déchargement, les drapeaux de fonctionnalité et le roulage partiel sans nécessiter un redéploiement de l'hôte.

Les changements de version nécessitent la même discipline. Évitez de modifier le sens d'une méthode existante. Ajoutez une nouvelle méthode, introduisez un adaptateur ou publiez une nouvelle interface tout en laissant disponible le contrat ancien pendant la migration. Testez les anciens et les nouveaux plugins contre l'hôte avant la distribution, et faites en sorte que les combinaisons incompatibles échouent avec un diagnostic clair au lieu d'une exception de démarrage générique.

La conception du cycle de vie affecte également le support opérationnel. Enregistrez la version du plugin, l'état d'activation et l'étape de défaillance afin qu'un problème de production puisse être réduit à la charge, à l'initialisation, à la gestion des permissions ou à la mise en ordre. Sans ces limites, une panne native ou une erreur de rendu peut ressembler à un défaut de l'hôte, et les équipes perdent du temps à investiguer la mauvaise couche.

Compromis entre sécurité et tests que vous ne pouvez pas ignorer

Extensibility isn’t free. Every plugin can add code paths, dependencies, permissions, update behavior, and failure modes that the host team didn’t write. Academic work on plug-and-play systems explicitly identifies the expanded attack surface created by plugins, and a security study identified vulnerability types that earlier literature hadn’t covered, as discussed in this préimprimé sur la sécurité des plug-ins.

Le risque devient plus aigu lorsque les plugins gèrent des identifiants, des fichiers locaux, des données des clients ou des actions de déploiement. Un plugin peut être considéré comme fiable par l'hôte parce qu'il a été installé par un canal approuvé. Cette décision de confiance nécessite des preuves, pas la routine.

Réduisez la zone d'impact

Utilisez des contrôles stratifiés plutôt qu'un seul case à cocher d'approbation.

  • Sandbox d'exécution : Exécutez des extensions non fiables ou à haut risque dans un processus ou un espace de temps qui limite l'accès direct à l'hôte.
  • Portée des capacités : Fournissez des opérations nommées au lieu d'un accès réseau, de fichiers système ou natif large.
  • Vérifiez la provenance : Signez des ensembles de fichiers, enregistrez les versions et rejetez les artefacts modifiés.
  • Appliquer la politique de runtime : Permettre aux administrateurs de désactiver un plugin, de restreindre les environnements ou de bloquer les capacités sans recompiler l'hôte.
  • Surveiller le comportement : Capturer les échecs de chargement, les refus de permission, les plantages et l'utilisation anormale des ressources.

Le sandboxing a un coût. La communication inter-processus ajoute de la sérialisation, une complexité de débogage et parfois de la latence. Exécuter tout en-processus est plus facile à appeler mais fait en sorte qu'une erreur de plugin soit plus capable de faire tomber l'hôte. Le choix approprié dépend de la confiance, de la sensibilité des données et des conséquences d'une compromission.

Testez la frontière, pas seulement l'hôte

Les tests unitaires de l'hôte ne détecteront pas un plugin qui s'inscrit avec le mauvais nom d'événement, qui libère un écouteur, qui retourne un schéma non valide ou qui suppose l'existence d'une fonctionnalité de plateforme. Les tests de contrat doivent charger chaque plugin contre le contrat de l'hôte pris en charge et vérifier les appels réussis, les erreurs attendues et le comportement de la mise à la poubelle.

Les tests d'isolement doivent démarrer le plugin avec seulement ses capacités déclarées. Les tests fin-à-fin doivent charger les bundles de plugin réels dans un hôte de production similaire, exercer les mises à jour, interrompre l'activation et redémarrer après une erreur. Testez également le chemin de distribution. Un artefact signé que le chargeur ne peut pas récupérer, stocker ou rembobiner est toujours une panne.

Principe de sécurité : Traitez chaque plugin comme un composant de la chaîne d'approvisionnement et chaque transition de cycle de vie comme une production code.

Le guide de la sécurité des vulnérabilités de l'application est pertinent lorsque la limite du plugin devient partie d'un programme de sécurité mobile ou de bureau plus large. La prise en charge des plugins crée une obligation de maintenance permanente. Quelqu'un doit passer en revue les dépendances, les implémentations de patch, les tests des modifications de contrat et supprimer les extensions qui ne répondent plus aux normes du produit.

Évolutions récentes de l'architecture des plugins pour les outils de développement et l'IA

Les systèmes de plugins pour les assistants d'IA et les outils de développement dépassent les simples add-ons. Les matériaux de 2025 et 2026 décrivent un déplacement vers des systèmes modulaires, basés sur des capacités, dans lesquels le sandboxing, la gouvernance, l'observabilité et la politique de runtime importent plus que la liste des fonctionnalités d'un plugin, comme le montre cette analyse de l'architecture des plugins de l'assistant de codage de l'IA.

Un outil d'IA peut avoir besoin d'inspecter des fichiers, d'invoker des commandes, de consulter des services ou de modifier code. La conférence d'une extension large accorde une autorité. Un modèle de capacité peut exposer des actions individuelles, exiger une approbation explicite, appliquer une politique d'exécution et enregistrer ce qui s'est passé. WebAssembly se présente comme une approche de sandboxing préférée pour ce type de système car elle peut fournir un environnement d'exécution plus contraint que l'exécution non contrainte en processus code.

Le modèl’opérationnel change également. Les équipes ont besoin de crochets déterministes pour l'initialisation, l'annulation, les temps limites, la suppression et l'évaluation de la politique. Elles ont besoin d'observabilité qui répond à la question de savoir quelles capacités ont été exécutées, avec quelles entrées, sous quelle politique, et si le résultat a été accepté. Un plugin qui fonctionne dans une démo locale mais ne peut pas être audité dans un environnement client n'est pas prêt pour un déploiement gouverné.

Pour les équipes qui délivrent des applications Capacitor ou Electron, la même pression apparaît à travers les mises à jour en direct et la livraison spécifique à l'audience. L'hôte doit savoir quel bundle est actif, quel contrat il soutient, et si une extension échouée peut être désactivée ou annulée. Une application de bureau peut également avoir besoin de canaux séparés pour les tests internes, les clients en phase de test et la mise en production générale.

Les développeurs qui explorent la coordination d'agents peuvent utiliser L'aperçu du serveur MCP d'AuricIDE comme contexte pour comprendre comment la découverte de l'outil et les capacités déléguées s'intègrent dans les assistants modernes. La leçon architecturale est durable : les futurs plugins seront jugés moins par la rapidité avec laquelle ils ajoutent un bouton et plus par la précision avec laquelle l'hôte contrôle leur autorité.

Pratiques de Migration et Meilleures Pratiques pour les Équipes

Démarrez avec une couture existante, pas un marché futur imaginaire. Trouvez un module avec une entrée stable et une sortie, plusieurs implémentations ou une variation spécifique au client claire. Extraigez cette capacité derrière une interface tout en gardant la mise en œuvre actuelle comme le premier plugin.

Conserve le travail sur les fonctionnalités en préservant le chemin d'appel ancien à travers un adaptateur. Ajoutez des tests de contrat avant de déplacer code, puis introduisez des diagnostics de chargeur, des journaux de cycle de vie et une vérification de compatibilité explicite. N'extraigez pas un gestionnaire de l'état central ou un noyau d'authentification en premier. Ces zones ont trop d'hypothèses implicites et transformeront la migration en une refonte.

La distribution mérite une attention de conception dès le début. Utilisez un registre ou un magasin de bundles contrôlés, vérifiez les signatures, conservez l'historique de versions et définissez des canaux pour le développement, la mise en scène, la production ou des clients sélectionnés. Le la guide en cinq étapes pour distribuer des plugins personnalisés Capacitor context

HTML text fragment from a longer Capgo UI string (parent key `capwesome_diff_plugins_capgo`). Page/area: Capawesome comparison page. Role: Long marketing or legal paragraph. Seen in: page capwesome.astro. Preserve Capgo product/brand and developer terms exactly. Message key `capwesome_diff_plugins_capgo` (Capwesome Diff Plugins Capgo).

fournit une référence pratique pour les équipes travaillant sur ce chemin de mise à jour.

  • Une plateforme de plugins utilisables nécessite également des documents, des modèles, un débogage local, des matrices de compatibilité, des implémentations d'exemple et un propriétaire pour le support. Les développeurs ne s'adoptent pas un point d'extension qu'ils ne peuvent pas comprendre, tester ou diagnostiquer. Utilisez ce tableau de vérification lors du prochain examen d'architecture :
  • Frontière : Le hôte peut-il dépendre d'une interface au lieu d'un plugin concret ?
  • Cycle de vie : Sont définis l'activation, la désactivation, l'échec et la suppression ?
  • Compatibilité : Le hôte peut-il rejeter clairement les versions non prises en charge ?
  • Test : Les tests de contrat et fin-à-fin chargent-ils des bundles réels ?
  • Distribution : Lequipe peut-elle vérifier, cibler, surveiller et annuler les sorties ?
  • Propriété : Est-ce que quelqu'un est responsable de la documentation, des correctifs et de la suppression ?

Capgo est une option pour les équipes de CapacitorJS et Electron qui ont besoin de la livraison de bundles web signés, de canaux ciblés, de la protection automatique du retour en arrière, de l'observabilité des sorties par appareil et des intégrations avec un plugin de mise à jour open-source. Capgo __CAPGO_KEEP_0__

Actualisations en direct pour les applications Capacitor

When a web-layer bug is live, ship the fix through Capgo instead of waiting days for app store approval. Users get the update in the background while native changes stay in the normal review path.

Support humain de Martin

Démarrer maintenant

Dernières actualités de notre blog

Capgo vous donne les meilleures informations dont vous avez besoin pour créer une application mobile vraiment professionnelle.