跳过主要内容

如何在华为应用市场上发布一个Capacitor应用

发布Capacitor应用于华为应用市场:开发者注册、谷歌服务审计、HMS备选、APK签名、列表资产和审查提示

文章来源

马丁·多纳迪厄

作者

Valeria

Reviewer

Jordan

Editor

如何在华为应用市场上发布一个Capacitor应用

您可以使用同样的Android构建在华为应用市场上发布一个Capacitor应用。注册一个免费的华为开发者账号,检查哪些插件依赖Google Play服务(自2019年底以来发布的华为手机上缺失),隐藏或替换这些功能,然后在AppGallery Connect中上传一个签名的APK并添加一个列表,等待审核。这一指南将涵盖每一步,包括您可以在应用中添加的小型本机检查以检测Google Play服务而无需额外依赖项。

谁应该在应用市场上发布

应用市场是华为手机和平板电脑的默认商店。如果您的用户包括:

  • 欧洲、中东、非洲、拉丁美洲和东南亚地区使用华为设备的用户,自2019年美国贸易限制后发布的设备不带Google Play服务和Play商店。
  • 企业或政府客户,标准化使用华为硬件。

关于HarmonyOS的注意事项:华为手机在非中国大陆地区运行的EMUI(基于Android的系统),安装APK。中国大陆地区运行HarmonyOS NEXT(HarmonyOS 5及后续版本)的设备,只运行native HarmonyOS应用,因此Android APK无法到达。这个指南是关于基于Android的应用市场。

步骤1:检查Google Play服务依赖项

Capacitor 只依赖于 AndroidX 和自己的 Android 库。风险来自于那些拉入 Google 库的插件。检查你的依赖项:

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

然后将它们分成“不需要 Google Play 服务”和“需要 Google Play 服务”的两类。

依赖项 在华为设备上不使用 GMS 典型的插件
Firebase 云消息推送 不工作 @capacitor/push-notifications, Firebase 消息推送插件
Google 地图 SDK 不工作 @capacitor/google-maps
Google 登录 (play-services-auth, Google ID 凭证管理器) 不支持 Google 提供的 @capgo/capacitor-social-login
Google Play Billing 不支持 @capgo/capacitor-native-purchases, Android 上的 RevenueCat
Play 应用内评分 不支持 @capgo/capacitor-in-app-review
Play 应用内更新 不支持 Play 更新助手在 @capgo/capacitor-updater
Play 安全性 不支持 Android 应用认证插件
融合位置 (play-services-location) 依赖于插件;一些回退到 Android 的 LocationManager @capacitor/geolocation, 背景地理位置插件
play-services-tasks, play-services-basement 独自 精细 (普通库) 许多插件
Firestore、实时数据库、存储、远程配置、崩溃日志、电子邮件/密码身份验证 工作 Firebase 插件
Capgo 实时更新 工作 @capgo/capacitor-updater
Apple 和 Facebook 登录 工作 @capgo/capacitor-social-login Apple / Facebook 提供者

“不工作”通常意味着调用抛出或永远不会解决。它很少会导致整个应用程序崩溃,但审阅者在华为设备上测试,并且死的按钮或空白屏幕是常见的拒绝原因。

步骤 2:检测 Google Play 服务

上下文:关于 Capgo 页面。角色: UI 标签。见于:关于.astro 页面。消息键 `about_how_step_label` (关于如何步骤标签)。 com.google.android.gms is installed. Add a tiny local plugin to your Capacitor Android project.

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

注册它在 MainActivity.java 前 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);
    }
}

自 Android 11 开始,应用程序只能看到它们自己声明的其他包。添加一个 <queries> 块 android/app/src/main/AndroidManifest.xml块到 <manifest>:

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

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

包的存在是一个合理的代理。它不会告诉你Google Play服务是否最新或启用;如果你还需要这个,添加 com.google.android.gms:play-services-base 并使用 GoogleApiAvailability.isGooglePlayServicesAvailable(),即使在没有GMS的设备上也能工作。

步骤3:优雅退化

使用结果来开启或关闭功能:

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

实用降级方案:

  • 登录:隐藏Google按钮并显示电子邮件、Apple或Facebook登录代替。使用 @capgo/capacitor-social-login 你只初始化你显示的提供者。
  • 付款:Google Play Billing不可用。AppGallery有自己的Huawei IAP。如果数字购买是你的应用的核心,或者在AppGallery中集成Huawei IAP,或者在列表中说明你的应用不支持购买。
  • 推送: 使用华为推送 Kit 为 HMS 设备。没有官方 Capacitor 插件;华为发布 Cordova 插件在 @hmscore/* 在 Capacitor 中运行,或者您可以编写一个小型的原生插件围绕推送套件 SDK。
  • Maps评分
  • : 在华为,链接到您的 AppGallery 页面而不是呼叫 Play 评分 __CAPGO_KEEP_0__。: on Huawei, link to your AppGallery page instead of calling the Play review API.
  • 应用商店链接) 在华为设备,而不是 Play 商店。appmarket://details?id=com.example.app在一个真实的华为设备或华为云调试服务上测试。一个模拟器与 Google API 将隐藏每一个这些问题。

步骤 4:注册一个 HUAWEI 开发者账户

context

  1. 创建一个HUAWEI ID在 developer.huawei.com.
  2. 完成 身份验证 作为个人或企业。个人通常提供身份证件和银行卡详细信息;企业提供商业注册文件。审查通常需要一到两天工作时间。
  3. 选择账户类型和国家非常重要。华为不允许将个人账户转换为企业账户,并且已验证的国家或地区不能在之后更改。

注册是免费的。

步骤5:在AppGallery Connect中创建应用

  1. Open 打开.
  2. Platform: 平台:设备: 手机 (也适用于平板电脑)
  3. 应用名称、默认语言和包名。包名必须与 appId 一致 capacitor.config.ts 并且不能在第一次上传后更改。
  4. 选择应用类别。

步骤 6:构建并签署发布包

上下文:关于Capgo页面。角色:UI标签。见于:关于.astro页面。消息键 `about_how_step_label` (关于如何步骤标签)。

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

AppGallery支持APK和AAB。APK路线更简单:您使用自己的密钥签署它,Huawei不需要持有您的签名密钥。 android/app/build.gradle 在 keystore.properties(从环境变量加载密码或

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

APK 位于 android/app/build/outputs/apk/release/。如果您需要一个keystore, Android keystore生成器 会创建一个。请务必安全保管:每次AppGallery更新都必须使用相同的密钥签名。

如果您上传一个AAB文件,AppGallery则需要使用其App Signing服务,这意味着Huawei将生成并保留最终签名密钥,同Play App Signing的模式一样。

在上传之前,请检查以下几点:

  • versionCode 必须随着每次上传而增加。
  • APK中的应用名称应与AppGallery列表中的名称匹配。
  • 如果您在境外地区发布应用,请在列表中提供英文(美国)作为语言。
  • 自2026年9月30日起,Android开发者认证将适用于在巴西、印度尼西亚、新加坡和泰国安装的认证设备上的应用。Huawei设备不具有Google服务,但如果同一包也在认证设备上从Google Play外部安装,则需要在Android开发者控制台中注册包名。

第7步:准备列表

AppGallery的列表有其自己的规范,与Apple和Google不同:

字段 需求
图标 216 x 216 PNG(512 x 512 也接受),不添加圆角
截图 3 到 8 张,450 x 800 或 800 x 450 px(或比例更大),同一方向
简要介绍 最多 80 个字符
介绍 最多 8,000 个字符
隐私政策 URL 如果应用程序收集个人数据,则必填
年龄限制 AppGallery Connect中的问卷
测试账户 如果应用程序具有登录功能,则必填
国家/地区 显式选择分发国家

请勿重复使用显示Google Play logo、其他制造商品牌的Android设备框架或“在Google Play上获取”徽章的截图。Huawei拒绝引用其他商店的列表。对于其他资产,重复使用您为其他商店制作的资产;我们的 App Store和Google Play列表指南 涵盖了它们。

第8步:上传、提交和审查

  1. 在 版本信息&gt;草稿,上传APK文件 软件版本.
  2. 填写应用列表、评分、隐私和国家信息
  3. 设置发布时间(立即发布或预定发布)
  4. 提交审核

审核通常需要几天时间。被拒绝的应用会通过电子邮件发送,附带指南参考。常见的拒绝原因包括Capacitor应用的:

  • 功能无法在没有Google Play服务的情况下正常工作 (登录按钮无效,地图屏幕空白)
  • 重复应用:应用程序的包名已经在AppGallery中由其他开发者发布,或者Huawei从Google Play中复制了您的应用。请联系Huawei开发者支持,提供证明您拥有该应用的证据
  • 其他商店参考 在截图或文本中
  • 缺失的英文 用于国际发行。
  • 隐私政策 缺失或无法从应用内部访问。

AppGallery Connect 还有一个发布 API,因此您可以在首个版本发布后从 CI 自动上传。

步骤 9:保持更新速度

context: About Capgo 页面。角色:UI 标签。位置:关于.astro 页面。消息键 `about_how_step_label` (关于如何步骤标签)。 Capgo 实时更新 Capgo 实时更新

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

直接将新包推送到已安装在 Huawei、Google 和 Apple 设备上的应用程序,因为更新器从您的 __CAPGO_KEEP_0__ 端点获取包,而不使用 Google Play 服务。使用专用通道,如果您的 Huawei 构建具有不同的功能: Capgo updater docs __CAPGO_KEEP_0__ 更新器文档中已解释了通道和配置。

Checklist

  • 依赖项审计完成,仅GMS功能列表
  • 添加并测试了在真实Huawei设备上的运行时服务
  • 隐藏或替换了Google-only功能(推送、登录、计费、地图、评论)
  • HUAWEI Developers账户已验证
  • 使用相同的包名创建的应用 capacitor.config.ts
  • 使用备份的keystore签名的Release APK versionCode 更新
  • 图标、3到8张截图、简要和详细介绍、隐私政策
  • 列表资产中没有Google Play的引用
  • 如果需要,审计员的测试账户
  • 已提交,正在监控审计邮件

如果您还要准备Google Play,请阅读 如何创建Apple和Google Play开发者账户 了解12个测试者规则的细节

实时更新 Capacitor 应用

当 web 层 bug 活跃时,通过 Capgo 将修复推送,而不是等待几天的应用商店审批。用户在后台接收更新,而原生更改仍在正常审查路径中。

来自 Martin 的人性化支持

立即开始

最新博客

Capgo 为您提供创建真正专业的移动应用所需的最佳见解