您可以使用同样的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
- 创建一个HUAWEI ID在 developer.huawei.com.
- 完成 身份验证 作为个人或企业。个人通常提供身份证件和银行卡详细信息;企业提供商业注册文件。审查通常需要一到两天工作时间。
- 选择账户类型和国家非常重要。华为不允许将个人账户转换为企业账户,并且已验证的国家或地区不能在之后更改。
注册是免费的。
步骤5:在AppGallery Connect中创建应用
- Open 打开.
- Platform: 平台:设备: 手机 (也适用于平板电脑)
- 应用名称、默认语言和包名。包名必须与
appId一致capacitor.config.ts并且不能在第一次上传后更改。 - 选择应用类别。
步骤 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步:上传、提交和审查
- 在 版本信息>草稿,上传APK文件 软件版本.
- 填写应用列表、评分、隐私和国家信息
- 设置发布时间(立即发布或预定发布)
- 提交审核
审核通常需要几天时间。被拒绝的应用会通过电子邮件发送,附带指南参考。常见的拒绝原因包括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个测试者规则的细节