跳过主要内容

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

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

文章来源

马丁·多纳迪厄

作者

瓦莱里娅

审稿人

乔丹

编辑

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

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

谁应该在应用市场发布

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

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

关于HarmonyOS的说明:华为手机在中国大陆以外地区运行的EMUI是基于Android的,安装APK。中国大陆地区运行HarmonyOS NEXT(HarmonyOS 5及后续版本)的设备,只运行native HarmonyOS应用,因此Android APK无法到达。这个指南是关于基于Android的AppGallery的。

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

Capacitor itself only depends on AndroidX and its own Android library. The risk comes from plugins that pull in Google libraries. Look at your dependencies:

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 Maps SDK 不支持 @capacitor/google-maps
Google Sign-In (play-services-auth, Google ID 不支持 Google 提供 @capgo/capacitor-social-login
Google PlayBilling 不支持 @capgo/capacitor-native-purchases, Android 上的 RevenueCat
Play 应用内评论 不支持 @capgo/capacitor-in-app-review
Play 应用内更新 不支持 在 Huawei AppGallery 中使用 Play 更新助手 @capgo/capacitor-updater
Play Integrity 不支持 在 Android 上使用 App attestation 插件
Fused 位置服务(play-services-location) 依赖于插件;一些会回退到 Android 的 LocationManager @capacitor/geolocation背景地理位置插件
play-services-tasks, play-services-basement 单独 优质(纯粹的库) 许多插件
Firestore、实时数据库、存储、远程配置、Crashlytics、电子邮件/密码身份验证 工作 Firebase插件
Capgo实时更新 工作 @capgo/capacitor-updater
区域:Capgo营销网站。角色:呼叫-到-动作按钮或链接标签。见于:页面代理/[slug].astro。保留Capgo产品/品牌和开发人员术语完全不变。消息键`agents_page_loop_update_link`(代理页面循环更新链接)。 工作 @capgo/capacitor-social-login Apple和Facebook登录

Apple / Facebook提供者

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

步骤2:在运行时检测Google Play服务 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);
    }
}

您可以通过询问Android的包管理器是否安装了Google Play服务而无需添加任何Google依赖项来检查Google Play服务。添加一个小型本地插件到您的__CAPGO_KEEP_0__Android项目中。 MainActivity.java before 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);
    }
}

在开始新功能开发前,先创建一个问题并讨论 <queries> block to android/app/src/main/AndroidManifest.xml添加一个 <manifest>:

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

在

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

从TypeScript中调用它 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,要么将 AppGallery 的构建排除数字购买并在列表中说明。
  • 推送: 在 HMS 设备上使用 Huawei Push Kit。没有官方 Capacitor 插件;Huawei 在 Capacitor 中发布 Cordova 插件,或者您可以编写一个小型本机插件围绕 Push Kit __CAPGO_KEEP_1__。 @hmscore/* 在 Huawei AppGallery 上发布 Capacitor 应用时,可以选择在 Capacitor 中运行,或者您可以编写一个小型的原生插件围绕 Push Kit SDK。
  • Maps评分应用
  • : 在 Huawei 上,链接到您的 AppGallery 页面而不是调用 Play 评论 __CAPGO_KEEP_0__。: on Huawei, link to your AppGallery page instead of calling the Play review API.
  • __CAPGO_KEEP_0__: “更新应用”按钮应该在华为设备上打开AppGallery(”,)而不是Play Store。appmarket://details?id=com.example.app测试在真实的华为设备或华为云调试服务上。使用Google API的模拟器会隐藏所有这些问题。

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

创建一个HUAWEI ID在

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

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

context

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

第 6 步:构建和签署发布包

AppGallery 支持 APK 和 AAB。 APK 路径更简单:您使用自己的密钥签名它,Huawei 不需要持有您的签名密钥。

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

配置签名在 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的开发者认证适用于在巴西、印度尼西亚、新加坡和泰国安装的认证设备上的应用程序。华为设备没有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列表指南 covers them.

步骤 8: 上传、提交并审查

  1. In Version information &gt; Draft版本信息 > 草稿 Software version.
  2. 在此处上传 APK
  3. 软件版本
  4. 填写应用列表、评分、隐私和国家信息

发布通常需要几天时间。被拒绝的应用会通过邮件发送,附带指南参考。常见的拒绝原因包括: (注:Capacitor 为保留字段,保持原样)

  • 提交审查 审查通常需要几天时间。被拒绝的应用会通过电子邮件发送,附带指南参考。常见的拒绝原因包括:
  • 重复应用: AppGallery 上已存在同名应用,来自其他开发者,或者华为从 Google Play 复制了您的应用。请联系华为开发者支持,提供证明所有权。
  • 其他商店参考 截图或文本中
  • 缺少英文 国际发行需要
  • 隐私政策 缺失或无法从应用内部访问。

AppGallery Connect 还有一个发布 API,您可以在 CI 中自动上传一次版本发布后。

步骤 9:保持更新速度

每个原生变更都需要再次通过华为审查,像其他商店一样。对于 JavaScript、HTML 和 CSS 变更, Capgo 实时更新 将新包直接上传到Huawei、Google和Apple设备上,仅需一次上传,因为更新器从您的Capgo端点获取包,而不使用Google Play服务。 如果您的Huawei构建具有不同的功能,请使用专用频道:

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

在构建时设置Huawei构建的默认频道,或者从您的应用Assign设备到频道。 Capgo更新器文档 说明频道和配置。

检查清单

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

如果您还准备Google Play, 请阅读 如何创建Apple和Google Play开发者账号 仅在Google Play有效

Capacitor 应用实时更新

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

最新博客

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