Aller au contenu principal

Comment publier une application Capacitor sur Huawei AppGallery

Publier une application Capacitor sur Huawei AppGallery : inscription développeur, audit des services Google Play, fallbacks HMS, signature APK, assets et conseils de revue.

Application Capacitor publiée sur Huawei AppGallery

Vous pouvez publier une application Capacitor sur Huawei AppGallery avec le même build Android que celui que vous déployez sur Google Play. Inscrivez-vous à un compte HUAWEI Developers gratuit, vérifiez quels plugins dépendent des services Google Play (absents des téléphones Huawei sortis depuis fin 2019), masquez ou remplacez ces fonctionnalités, puis envoyez un APK signé dans AppGallery Connect avec une fiche et attendez la revue. Ce guide détaille chaque étape, y compris une petite vérification native à intégrer dans votre application pour détecter les services Google Play sans dépendances supplémentaires.

Qui devrait déployer sur AppGallery

AppGallery est le store par défaut sur les téléphones et tablettes Huawei. Cela est crucial si vos utilisateurs incluent :

  • Des personnes en Europe, au Moyen-Orient, en Afrique, en Amérique latine et en Asie du Sud-Est utilisant des appareils Huawei sortis après les restrictions commerciales américaines de 2019, livrés sans services Google Play et sans le Play Store.
  • Des clients entreprises ou gouvernementaux qui ont standardisé leur parc sur du matériel Huawei.

Note sur HarmonyOS : les téléphones Huawei vendus hors de Chine continentale tournent sous EMUI, basé sur Android, et installent des APK. Les appareils en Chine continentale sous HarmonyOS NEXT (HarmonyOS 5 et versions ultérieures) n'exécutent que des applications natives HarmonyOS : un APK Android ne peut donc pas y être installé. Ce guide concerne l'AppGallery basée sur Android.

Étape 1 : auditer les dépendances aux services Google Play

Capacitor lui-même ne dépend que d'AndroidX et de sa propre bibliothèque Android. Le risque vient des plugins qui embarquent des bibliothèques Google. Examinez vos dépendances :

cd android
./gradlew :app:dependencies --configuration releaseRuntimeClasspath \
  | grep -E "com.google.android.gms|com.google.firebase|com.google.android.play|billingclient" \
  | sort -u

Ensuite, classez-les entre « fonctionne sans services Google Play » et « nécessite les services Google Play ».

Dépendance Sur Huawei sans GMS Plugins typiques
Firebase Cloud Messaging Ne fonctionne pas @capacitor/push-notifications, les plugins Firebase Messaging
Google Maps SDK Ne fonctionne pas @capacitor/google-maps
Google Sign-In (play-services-auth, Credential Manager Google ID) Ne fonctionne pas Fournisseur Google de @capgo/capacitor-social-login
Google Play Billing Ne fonctionne pas @capgo/capacitor-native-purchases, RevenueCat sur Android
Play In-App Review Ne fonctionne pas @capgo/capacitor-in-app-review
Play In-App Updates Ne fonctionne pas Exemples d’helpers de mise à jour Play @capgo/capacitor-updater
Play Integrity Ne fonctionne pas Plugins d’attestation d’app sur Android
Localisation fusionnée (play-services-location) Cela dépend du plugin ; certains se rabattent sur le LocationManager d’Android @capacitor/geolocation, plugins de géolocalisation en arrière-plan
play-services-tasks, play-services-basement seul Correct (bibliothèques simples) De nombreux plugins
Firestore, Realtime Database, Storage, Remote Config, Crashlytics, Auth e-mail/mot de passe Fonctionne Plugins Firebase
les live updates Capgo Fonctionne @capgo/capacitor-updater
Connexion Apple et Facebook Fonctionne @capgo/capacitor-social-login Fournisseurs Apple / Facebook

« Ne fonctionne pas » signifie généralement que l’appel lève une erreur ou ne se résout jamais. Cela provoque rarement un crash de l’application entière, mais les testeurs vérifient sur des appareils Huawei, et un bouton inactif ou un écran vide est une raison de rejet courante.

Étape 2 : Détecter les services Google Play à l’exécution

Vous pouvez vérifier la présence des services Google Play sans ajouter de dépendance Google en demandant au gestionnaire de paquets Android si com.google.android.gms est installé. Ajoutez un petit plugin local à votre projet Android Capacitor.

android/app/src/main/java/com/example/app/ServicesCheckPlugin.java:

package com.example.app;

import android.content.pm.PackageManager;
import com.getcapacitor.JSObject;
import com.getcapacitor.Plugin;
import com.getcapacitor.PluginCall;
import com.getcapacitor.PluginMethod;
import com.getcapacitor.annotation.CapacitorPlugin;

@CapacitorPlugin(name = "ServicesCheck")
public class ServicesCheckPlugin extends Plugin {

    private boolean isInstalled(String packageName) {
        try {
            getContext().getPackageManager().getPackageInfo(packageName, 0);
            return true;
        } catch (PackageManager.NameNotFoundException e) {
            return false;
        }
    }

    @PluginMethod
    public void getStatus(PluginCall call) {
        JSObject ret = new JSObject();
        ret.put("gms", isInstalled("com.google.android.gms"));
        ret.put("hms", isInstalled("com.huawei.hwid"));
        call.resolve(ret);
    }
}

Enregistrez-le dans MainActivity.java avant super.onCreate:

package com.example.app;

import android.os.Bundle;
import com.getcapacitor.BridgeActivity;

public class MainActivity extends BridgeActivity {
    @Override
    public void onCreate(Bundle savedInstanceState) {
        registerPlugin(ServicesCheckPlugin.class);
        super.onCreate(savedInstanceState);
    }
}

Depuis Android 11, les applications ne voient que les paquets qu’elles déclarent. Ajoutez un <queries> bloc à android/app/src/main/AndroidManifest.xml, à l'intérieur <manifest>:

<queries>
    <package android:name="com.google.android.gms" />
    <package android:name="com.huawei.hwid" />
</queries>

Appelez-le depuis TypeScript :

import { Capacitor, registerPlugin } from '@capacitor/core';

interface ServicesCheckPlugin {
  getStatus(): Promise<{ gms: boolean; hms: boolean }>;
}

const ServicesCheck = registerPlugin<ServicesCheckPlugin>('ServicesCheck');

export async function getMobileServices() {
  if (Capacitor.getPlatform() !== 'android') {
    return { gms: true, hms: false };
  }
  return ServicesCheck.getStatus();
}

La présence du package est un indicateur raisonnable. Elle ne vous dit pas si les services Google Play sont à jour ou activés ; si vous avez aussi besoin de cette info, ajoutez com.google.android.gms:play-services-base et utilisez GoogleApiAvailability.isGooglePlayServicesAvailable(), qui fonctionne même sur les appareils sans GMS.

Étape 3 : dégrader gracieusement

Use the result to switch features on and off:

import { PushNotifications } from '@capacitor/push-notifications';
import { getMobileServices } from './services';

export const features = {
  push: true,
  googleSignIn: true,
  playBilling: true,
  inAppReview: true,
};

export async function initFeatures() {
  const { gms } = await getMobileServices();

  features.push = gms;
  features.googleSignIn = gms;
  features.playBilling = gms;
  features.inAppReview = gms;

  if (features.push) {
    const perm = await PushNotifications.requestPermissions();
    if (perm.receive === 'granted') {
      await PushNotifications.register();
    }
  }
}

Solutions de repli concrètes :

  • Connexion: masquez le bouton Google et affichez plutôt une connexion par e-mail, Apple ou Facebook. Avec @capgo/capacitor-social-login vous n'initialisez que les fournisseurs que vous affichez.
  • Paiements: Google Play Billing n'est pas disponible. AppGallery possède son propre Huawei IAP. Si les achats numériques sont essentiels à votre application, intégrez Huawei IAP ou déployez le build AppGallery sans achats en le précisant dans la fiche AppGallery.
  • Envoyer: utilisez Huawei Push Kit pour les appareils HMS. Il n'existe pas de plugin Capacitor officiel ; Huawei publie des plugins Cordova sous @hmscore/* qui fonctionnent dans Capacitor, ou vous pouvez écrire un petit plugin natif autour de l'SDK de Push Kit.
  • Cartes: utilisez une carte web (Leaflet, MapLibre GL JS) dans le WebView, ce qui fonctionne sur tous les appareils, ou Huawei Map Kit.
  • Noter l'application: sur Huawei, liez vers votre page AppGallery au lieu d'appeler l'API de revue Play.
  • Liens des stores: les boutons « Mettre à jour l'application » doivent ouvrir AppGallery (appmarket://details?id=com.example.app) sur les appareils Huawei, et non le Play Store.

Testez sur un appareil Huawei réel ou le service de débogage cloud de Huawei. Un émulateur avec les API Google masquera chacun de ces problèmes.

Étape 4 : Créer un compte HUAWEI Developers

  1. Créez un HUAWEI ID sur developer.huawei.com.
  2. Complète vérification d'identité en tant que particulier ou entreprise. Les particuliers fournissent généralement une pièce d'identité et des coordonnées bancaires ; les entreprises fournissent des documents d'immatriculation. L'examen prend généralement un à deux jours ouvrés.
  3. Choisissez soigneusement le type de compte et le pays. Huawei ne permet pas de convertir un compte particulier en compte entreprise, et le pays ou la région vérifié ne peut pas être modifié ultérieurement.

L'inscription est gratuite.

Étape 5 : Créer l'application dans AppGallery Connect

  1. Ouvrez AppGallery Connect &gt; Mes applications &gt; Nouvelle application.
  2. Plateforme : Android. Appareil : Téléphone mobile (couvre aussi les tablettes).
  3. Nom de l’app, langue par défaut et nom du package. Le nom du package doit correspondre appId dans capacitor.config.ts et ne peut pas être modifié après le premier upload.
  4. Choisissez la catégorie de l’app.

Étape 6 : Compiler et signer le package de release

AppGallery accepte les formats APK et AAB. La méthode APK est plus simple : vous le signez avec votre propre clé, et Huawei n'a pas besoin de détenir votre clé de signature.

bun run build
bunx cap sync android
cd android
./gradlew assembleRelease

Configurer la signature dans android/app/build.gradle (chargez les mots de passe depuis des variables d'environnement ou keystore.properties, ne les commitez jamais) :

android {
    signingConfigs {
        release {
            storeFile file(System.getenv("ANDROID_KEYSTORE_PATH") ?: "upload-keystore.jks")
            storePassword System.getenv("ANDROID_KEYSTORE_PASSWORD")
            keyAlias System.getenv("ANDROID_KEY_ALIAS")
            keyPassword System.getenv("ANDROID_KEY_PASSWORD")
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
        }
    }
}

L'APK se trouve dans android/app/build/outputs/apk/release/. Si vous avez besoin d'un keystore, le générateur de keystore Android en ligne en crée un. Gardez-l’en sécurité : chaque future mise à jour sur AppGallery devra être signée avec la même clé.

Si vous envoyez un AAB à la place, AppGallery exige son service App Signing, ce qui signifie que Huawei génère et détient la clé de signature finale, selon le même modèle que Play App Signing.

Quelques points à vérifier avant l'upload :

  • versionCode doit augmenter à chaque upload.
  • Le nom de l’application dans l’APK doit correspondre au nom de la fiche AppGallery.
  • Si vous distribuez en dehors de la Chine continentale, ajoutez l’anglais (US) comme langue dans la fiche.
  • Depuis le 30 septembre 2026, la vérification des développeurs Android s’applique aux applications installées sur des appareils certifiés au Brésil, en Indonésie, à Singapour et en Thaïlande. Les appareils Huawei sans services Google ne sont pas certifiés Google, mais si le même package s’installe également depuis l’extérieur de Google Play sur des appareils certifiés, enregistrez le nom du package dans la console Android Developer.

Étape 7 : Préparer la fiche

La fiche AppGallery a ses propres spécifications, différentes de celles d’Apple et de Google :

Champ Exigence
Icône PNG 216 x 216 (512 x 516 également accepté), sans coins arrondis ajoutés par vous
Captures d'écran 3 à 8, 450 x 800 ou 800 x 450 px (ou plus grand à proportion égale), même orientation
Présentation brève Jusqu’à 80 caractères
Présentation Jusqu’à 8 000 caractères
URL de la politique de confidentialité Obligatoire si l’app collecte des données personnelles
Classement par âge Questionnaire dans AppGallery Connect
Compte de test Requis si l’app propose une connexion
Pays / régions Sélectionnez explicitement les pays de distribution

Ne réutilisez pas de captures d’écran affichant le logo Google Play, des cadres d’appareils Android portant la marque d’autres fabricants, ou des badges « Get it on Google Play ». Huawei rejette les fiches qui font référence à d’autres stores. Pour le reste des assets, réutilisez ce que vous avez créé pour les autres stores ; notre guide de publication sur l’App Store et Google Play les couvre.

Étape 8 : upload, soumission et revue

  1. Dans Informations de version &gt; Brouillon, envoyez l’APK sous Version du logiciel.
  2. Remplissez la fiche, la note, la confidentialité et les pays.
  3. Définissez l’heure de publication (immédiate après approbation ou planifiée).
  4. Soumettre pour examen.

L’examen prend généralement quelques jours ouvrés. Les rejets arrivent par e-mail avec la référence de la directive. Les plus courantes pour les apps Capacitor :

  • Fonctionnalités qui ne fonctionnent pas sans les services Google Play (bouton de connexion inactif, écran de la carte vide).
  • Dupliquer l'application: une application avec le même nom de package existe déjà sur AppGallery par un autre développeur, ou Huawei a précédemment copié votre application depuis Google Play. Contactez le support développeur de Huawei avec une preuve de propriété.
  • Autres références aux stores dans les captures d'écran ou le texte.
  • Anglais manquant pour la distribution internationale.
  • Politique de confidentialité manquante ou inaccessible depuis l'application.

AppGallery Connect dispose également d'un API de publication, vous permettant d'automatiser les uploads depuis votre CI une fois la première version en ligne.

Étape 9 : Gardez des mises à jour rapides

Chaque changement natif repasse par la revue Huawei, comme sur les autres stores. Pour les changements JavaScript, HTML et CSS, les live updates Capgo livrez le nouveau bundle directement aux applications installées sur les appareils Huawei, Google et Apple avec un seul upload, car l’updater récupère les bundles depuis votre endpoint Capgo et n'utilise pas les services Google Play. Utilisez un canal dédié si votre build Huawei comporte des fonctionnalités différentes :

bunx @capgo/cli@latest bundle upload --channel huawei

Définissez le canal par défaut pour le build Huawei au moment du build, ou affectez les appareils au canal depuis votre application. Le documentation de l'updater Capgo explique les canaux et la configuration.

Checklist

  • Audit des dépendances effectué, fonctionnalités GMS uniquement listées
  • Vérification des services runtime ajoutée et testée sur un appareil Huawei réel
  • Fonctionnalités Google masquées ou remplacées (push, connexion, facturation, cartes, avis)
  • Compte HUAWEI Developers vérifié
  • Application créée avec le même nom de package que capacitor.config.ts
  • APK de release signé avec un keystore sauvegardé, versionCode incrémenté
  • Icône, 3 à 8 captures d'écran, introduction brève et complète, politique de confidentialité
  • Aucune référence à Google Play dans les assets de la fiche
  • Compte de test pour les reviewers si nécessaire
  • Soumission effectuée, e-mail de revue surveillé

Si vous préparez aussi Google Play, lisez comment créer des comptes développeurs Apple et Google Play pour la règle des 12 testeurs qui ne s’applique que là-bas.

Live updates pour les apps Capacitor

Lorsqu'un bug de la couche web est en ligne, déployez le correctif via Capgo au lieu d'attendre des jours l'approbation des stores. Les utilisateurs reçoivent la mise à jour en arrière-plan, tandis que les changements natifs suivent le circuit de validation habituel.

Les derniers articles du blog

Capgo vous offre les meilleures informations pour créer une application mobile vraiment professionnelle.