Saltar al contenido principal

Cómo publicar una app de Capacitor en Huawei AppGallery

Publica una app de Capacitor en Huawei AppGallery: registro de desarrollador, auditoría de Google Play services, fallbacks de HMS, firma de APK, recursos de la ficha y consejos para la revisión.

Aplicación Capacitor publicada en Huawei AppGallery

Puedes publicar una app Capacitor en Huawei AppGallery con el mismo build de Android que envías a Google Play. Regístrate en una cuenta gratuita de HUAWEI Developers, verifica qué plugins dependen de Google Play services (ausentes en teléfonos Huawei lanzados desde finales de 2019), oculta o reemplaza esas funciones, luego sube un APK firmado en AppGallery Connect con un listing y espera la revisión. Esta guía cubre cada paso, incluyendo una pequeña verificación nativa que puedes integrar en tu app para detectar Google Play services sin dependencias adicionales.

Quién debería publicar en AppGallery

AppGallery es la tienda predeterminada en teléfonos y tablets Huawei. Es relevante si tus usuarios incluyen:

  • Personas en Europa, Oriente Medio, África, América Latina y Sudeste Asiático que usan dispositivos Huawei lanzados después de las restricciones comerciales de EE. UU. de 2019, los cuales no incluyen Google Play services ni la Play Store.
  • Clientes empresariales o gubernamentales que estandarizaron en hardware Huawei.

Una nota sobre HarmonyOS: los teléfonos Huawei vendidos fuera de China continental ejecutan EMUI, basado en Android e instala APKs. Los dispositivos en China continental que ejecutan HarmonyOS NEXT (HarmonyOS 5 y posteriores) solo ejecutan apps nativas de HarmonyOS, por lo que un APK de Android no llega a ellos. Esta guía se centra en la AppGallery basada en Android.

Paso 1: Auditar dependencias de Google Play services

Capacitor en sí mismo solo depende de AndroidX y su propia librería de Android. El riesgo proviene de plugins que incorporan librerías de Google. Revisa tus dependencias:

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

Luego, clasifícalos en "funciona sin Google Play services" y "requiere Google Play services".

Dependencia En Huawei sin GMS Plugins típicos
Firebase Cloud Messaging No funciona @capacitor/push-notifications, plugins de mensajería de Firebase
Google Maps SDK No funciona @capacitor/google-maps
Google Sign-In (play-services-auth, Credential Manager Google ID) No funciona Proveedor de Google para @capgo/capacitor-social-login
Google Play Billing No funciona @capgo/capacitor-native-purchases, RevenueCat en Android
Play In-App Review No funciona @capgo/capacitor-in-app-review
Reproducir actualizaciones en la app No funciona Prueba los helpers de actualización en @capgo/capacitor-updater
Play Integrity No funciona Plugins de attestation de apps en Android
Ubicación fusionada (play-services-location) Depende del plugin; algunos usan LocationManager de Android como respaldo @capacitor/geolocation, plugins de geolocalización en segundo plano
play-services-tasks, play-services-basement solo Precisa (bibliotecas simples) Muchos plugins
Firestore, Realtime Database, Storage, Remote Config, Crashlytics, Auth con email/password Trabajo Plugins de Firebase
actualizaciones Live Update de Capgo Trabajo @capgo/capacitor-updater
Login con Apple y Facebook Trabajo @capgo/capacitor-social-login Proveedores de Apple / Facebook

“No funciona” suele significar que la llamada lanza un error o nunca se resuelve. Rara vez tumba la app entera, pero los revisores prueban en dispositivos Huawei y un botón muerto o una pantalla en blanco es un motivo de rechazo habitual.

Paso 2: Detectar Google Play services en tiempo de ejecución

Puedes comprobar Google Play services sin añadir ninguna dependencia de Google, preguntando al gestor de paquetes de Android si com.google.android.gms está instalado. Añade un pequeño plugin local a tu proyecto de 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);
    }
}

Regístralo en MainActivity.java antes 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);
    }
}

Desde Android 11, las apps solo ven los paquetes que declaran. Añade un <queries> bloque a android/app/src/main/AndroidManifest.xml, dentro de <manifest>:

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

Llámala desde 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 presencia del paquete es un indicador útil. No confirma si Google Play services está actualizado o habilitado; si también necesitas eso, añade com.google.android.gms:play-services-base y usa GoogleApiAvailability.isGooglePlayServicesAvailable(), que funciona incluso en dispositivos sin GMS.

Paso 3: Degradación elegante

Usa el resultado para activar o desactivar funciones:

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();
    }
  }
}

Fallbacks prácticos:

  • Iniciar sesión: oculta el botón de Google y muestra en su lugar el inicio de sesión con email, Apple o Facebook. Con @capgo/capacitor-social-login solo inicializas los proveedores que muestras.
  • Pagos: Google Play Billing no está disponible. AppGallery tiene su propio Huawei IAP. Si las compras digitales son clave para tu app, integra Huawei IAP o publica la build de AppGallery sin compras e indícalo en la ficha.
  • Push: usa Huawei Push Kit para dispositivos HMS. No hay un plugin oficial de Capacitor; Huawei publica plugins de Cordova en @hmscore/* que funcionan en Capacitor, o puedes escribir un pequeño plugin nativo para el SDK de Push Kit.
  • Mapas: usa un mapa web (Leaflet, MapLibre GL JS) dentro del WebView, que funciona en cualquier dispositivo, o Huawei Map Kit.
  • Valorar la app: en Huawei, enlaza a tu página de AppGallery en lugar de llamar al API de reseñas de Play.
  • Enlaces de tiendas: Los botones “Actualizar la app” deben abrir AppGallery (appmarket://details?id=com.example.app) en dispositivos Huawei, no en la Play Store.

Prueba en un dispositivo Huawei real o en el servicio de depuración en la nube de Huawei. Un emulador con Google APIs ocultará todos estos problemas.

Paso 4: Crear una cuenta de HUAWEI Developers

  1. Crea un HUAWEI ID en developer.huawei.com.
  2. Completa la verificación de identidad como particular o como empresa. Los particulares suelen aportar un documento de identidad y datos de tarjeta bancaria; las empresas, documentos de registro mercantil. La revisión suele tardar de uno a dos días hábiles.
  3. Elige bien el tipo de cuenta y el país. Huawei no permite convertir una cuenta individual en una de empresa, y el país o la región verificados no se pueden cambiar después.

El registro es gratuito.

Paso 5: Crea la app en AppGallery Connect

  1. Abrir AppGallery Connect &gt; Mis apps &gt; Nueva app.
  2. Plataforma: Android. Dispositivo: Teléfono móvil (también incluye tablets).
  3. Nombre de la app, idioma predeterminado y package name. El package name debe coincidir appId en capacitor.config.ts y no se puede cambiar tras el primer upload.
  4. Elige la categoría de la app.

Paso 6: Compilar y firmar el paquete de release

AppGallery acepta APK y AAB. La ruta APK es más sencilla: la firmas con tu propia clave y Huawei no necesita guardar tu clave de firma.

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

Configura la firma en android/app/build.gradle (carga las contraseñas desde variables de entorno o keystore.properties, nunca las commitees):

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

El APK está en android/app/build/outputs/apk/release/. Si necesitas un keystore, el Generador de keystore para Android crea uno. Guárdalo con seguridad: cada futura actualización en AppGallery debe firmarse con la misma clave.

Si subes un AAB en su lugar, AppGallery requiere su servicio de App Signing, lo que significa que Huawei genera y conserva la clave de firma final, el mismo modelo que Play App Signing.

Algunas cosas a verificar antes de subir:

  • versionCode debe aumentar con cada subida.
  • El nombre de la app en el APK debe coincidir con el nombre en AppGallery.
  • Si distribuyes fuera de China continental, incluye inglés (US) como idioma en el listing.
  • Desde el 30 de septiembre de 2026, la verificación de desarrolladores de Android aplica a apps instaladas en dispositivos certificados en Brasil, Indonesia, Singapur y Tailandia. Los dispositivos Huawei sin servicios de Google no están certificados por Google, pero si el mismo paquete se instala fuera de Google Play en dispositivos certificados, registra el package name en la Android Developer Console.

Paso 7: Preparar el listing

El listing de AppGallery tiene sus propias especificaciones, distintas a las de Apple y Google:

Campo Requisito
Icono 216 x 216 PNG (512 x 512 también aceptado), sin esquinas redondeadas (no las añadas tú)
Screenshots De 3 a 8, 450 x 800 o 800 x 450 px (o proporcionalmente mayor), misma orientación
Breve introducción Hasta 80 caracteres
Introducción Hasta 8.000 caracteres
URL de la política de privacidad Obligatorio si la app recopila datos personales
Age rating Cuestionario en AppGallery Connect
Cuenta de prueba Obligatorio si la app tiene inicio de sesión
Países / regiones Selecciona explícitamente los países de distribución

No reutilices capturas de pantalla que muestren el logotipo de Google Play, marcos de dispositivos Android de otros fabricantes o insignias de “Get it on Google Play”. Huawei rechaza las listas que hacen referencia a otras tiendas. Para el resto de los recursos, reutiliza lo que creaste para las otras tiendas; nuestro Guía de la ficha en App Store y Google Play los cubre.

Paso 8: Subir, enviar y revisar

  1. En Información de versión &gt; Borrador, sube el APK en Versión de software.
  2. Completa la ficha, la clasificación, la privacidad y los países.
  3. Configura el momento de publicación (inmediato tras la aprobación o programado).
  4. Envía a revisión.

La revisión suele tardar unos días hábiles. Los rechazos llegan por email con la referencia de la directriz. Los más comunes en apps de Capacitor:

  • Funciones que no funcionan sin Google Play services (botón de inicio de sesión que no hace nada, pantalla del mapa en blanco).
  • Duplicar app: ya existe en AppGallery una app de otro desarrollador con el mismo nombre de paquete, o Huawei copió antes tu app desde Google Play. Contacta con el soporte para desarrolladores de Huawei con pruebas de propiedad.
  • Otras referencias a tiendas en capturas de pantalla o texto.
  • Falta inglés para distribución internacional.
  • Política de privacidad faltantes o no accesibles desde dentro de la app.

AppGallery Connect also has a Publishing API, so you can automate uploads from CI once the first version is live.

Paso 9: Mantén las actualizaciones rápidas

Cada cambio nativo pasa por la revisión de Huawei de nuevo, igual que en las otras tiendas. Para cambios en JavaScript, HTML y CSS, actualizaciones Live Update de Capgo entrega el nuevo bundle directamente a las apps instaladas en dispositivos Huawei, Google y Apple con una sola subida, porque el updater obtiene los bundles desde tu endpoint de Capgo y no usa Google Play services. Usa un channel dedicado si tu build de Huawei tiene funciones distintas:

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

Configura el channel por defecto para el build de Huawei en tiempo de compilación, o asigna dispositivos al channel desde tu app. La documentación del updater de Capgo explica los channels y la configuración.

Checklist

  • Auditoría de dependencias hecha, funciones exclusivas de GMS listadas
  • Comprobación de servicios en runtime añadida y probada en un dispositivo Huawei real
  • Funciones exclusivas de Google ocultas o reemplazadas (push, sign-in, billing, maps, review)
  • Cuenta de HUAWEI Developers verificada
  • App creada con el mismo package name que capacitor.config.ts
  • APK de release firmado con un keystore con backup, versionCode actualizado
  • Icono, 3 a 8 capturas, introducción breve y completa, política de privacidad
  • Sin referencias a Google Play en los assets
  • Cuenta de prueba para revisores si es necesario
  • Enviado, email de revisión monitorizado

Si también estás preparando Google Play, lee cómo crear cuentas de desarrollador en Apple y Google Play sobre la regla de los 12 testers que solo aplica allí.

Live updates para apps Capacitor

Cuando un bug de la capa web está en producción, publica el fix a través de Capgo en lugar de esperar días a la aprobación de la app store. Los usuarios reciben la actualización en segundo plano mientras los cambios nativos siguen el flujo de revisión habitual.

Lo último de nuestro blog

Capgo te da la información clave que necesitas para crear una app móvil realmente profesional.