Google Play に配布するのと同じ Android ビルドで、Capacitor アプリを Huawei AppGallery に公開できます。無料の HUAWEI Developers アカウントを登録し、Google Play サービスに依存するプラグイン(2019年末以降にリリースされた Huawei 端末には未搭載)を確認して、該当する機能を非表示にするか置き換えます。その後、AppGallery Connect にリスト情報付きで署名済み APK をアップロードし、審査を待ちます。本ガイドでは、追加の依存関係なしに Google Play サービスの検出をアプリに組み込める小さなネイティブチェックを含む、各ステップを解説します。
AppGalleryで配信すべき対象
AppGalleryはHuaweiのスマートフォンやタブレットにおける標準のストアです。以下のようなユーザー層がいる場合は、AppGalleryへの対応が重要になります:
- 2019年の米国の貿易制限以降に発売されたHuaweiデバイスを使用している、欧州、中東、アフリカ、ラテンアメリカ、東南アジアのユーザー。これらのデバイスにはGoogle Play開発者サービスやPlay Storeが搭載されていません。
- Huaweiのハードウェアを標準採用している企業や政府機関の顧客。
HarmonyOSに関する注意:中国本土以外で販売されているHuawei端末はAndroidベースのEMUIを搭載しており、APKをインストール可能です。一方、中国本土でHarmonyOS NEXT(HarmonyOS 5以降)を搭載したデバイスは、ネイティブのHarmonyOSアプリのみを実行するため、AndroidのAPKは動作しません。本ガイドでは、AndroidベースのAppGalleryについて解説します。
ステップ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なしのHuawei端末 | 代表的なプラグイン |
|---|---|---|
| Firebase Cloud Messaging | 動作しません | @capacitor/push-notifications、Firebase メッセージングプラグイン |
| Google Maps SDK | 動作しません | @capacitor/google-maps |
Google サインイン(play-services-auth、Credential Manager Google ID) |
動作しません | Googleプロバイダーの @capgo/capacitor-social-login |
| Google Play Billing | 動作しません | @capgo/capacitor-native-purchases、Android向けRevenueCat |
| アプリ内レビューを再生 | 動作しません | @capgo/capacitor-in-app-review |
| アプリ内更新を再生 | 動作しません | Playの更新ヘルパー @capgo/capacitor-updater |
| Play Integrity | 動作しません | Android向けアプリ認証プラグイン |
融合位置情報(play-services-location) |
プラグインによる; 一部は Android の LocationManager にフォールバック | @capacitor/geolocation, バックグラウンド位置情報プラグイン |
play-services-tasks, play-services-basement 単独 |
Fine (プレーンライブラリ) | 多くのプラグイン |
| Firestore、Realtime Database、Storage、Remote Config、Crashlytics、メール/パスワード認証 | 動作 | Firebase プラグイン |
| Capgo Live Updates | 動作 | @capgo/capacitor-updater |
| Apple と Facebook のログイン | 動作 | @capgo/capacitor-social-login Apple / Facebook プロバイダー |
「動作しない」は、通常、呼び出しが例外を投げるか、解決されないことを意味します。アプリ全体がクラッシュすることは稀ですが、審査員は Huawei デバイスでテストするため、ボタンが無反応になったり、画面が白紙になったりすることは一般的な却下理由です。
ステップ 2: 実行時にGoogle Play servicesを検知する
Google の依存関係を追加せずに、Android のパッケージマネージャーに com.google.android.gms がインストールされているかを確認できます。Capacitor Android プロジェクトに小さなローカルプラグインを追加してください。
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 services が最新かつ有効かどうかはわかりません。その確認も必要なら、 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 があります。デジタル購入がアプリのコア機能である場合、Huawei IAP を統合するか、購入機能を含まない AppGallery ビルドを公開し、その旨をリストに明記してください。
- プッシュ通知:HMS 搭載デバイスには Huawei Push Kit を使用してください。公式の Capacitor プラグインはありません。Huawei は Cordova プラグインを以下で公開しています
@hmscore/*これらは Capacitor で動作します。または、Push Kit の SDK をラップした小さなネイティブプラグインを自作することもできます。 - Map:WebView 内で Web マップ(Leaflet、MapLibre GL JS)を使用すると全デバイスで動作します。Huawei Map Kit も選択肢です。
- アプリを評価する:Huawei では、Play レビューの API を呼び出す代わりに、AppGallery のページへのリンクを設定してください。
- ストアへのリンク:「アプリを更新」ボタンは、Huawei デバイスでは Play Store ではなく AppGallery(
appmarket://details?id=com.example.app)を開くようにしてください。
実際の Huawei デバイス、または Huawei のクラウドデバッグサービスでテストしてください。Google API 付きエミュレーターでは、これらの問題のすべてが隠れてしまいます。
ステップ 4: HUAWEI Developersアカウントを登録する
- で HUAWEI ID を作成してください developer.huawei.com.
- 完了 本人確認 個人または法人として登録します。個人は身分証明書と銀行カード情報を、法人は事業登録書類を提出します。審査には通常1〜2営業日かかります。
- アカウントタイプと国は慎重に選択してください。Huaweiでは個人アカウントを法人アカウントに変更できず、確認済みの国または地域も後から変更できません。
登録は無料です。
ステップ 5: AppGallery Connectでアプリを作成する
- 開く AppGallery Connect > My apps > New app.
- プラットフォーム: Androidでは。デバイス: スマートフォン (タブレットにも対応)
- アプリ名、デフォルト言語、パッケージ名。パッケージ名は
appIdにおけるcapacitor.config.tsと一致する必要があり、初回アップロード後は変更できません。 - アプリのカテゴリを選択します。
ステップ 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サービスを利用する必要があります。これはPlay App Signingと同様のモデルで、Huaweiが最終的な署名キーを生成・保持します。
アップロード前のチェックリスト:
versionCodeアップロードのたびに増やす必要があります。- APK内のアプリ名は、AppGalleryのリスト表示名と一致させる必要があります。
- 中国本土以外で配布する場合は、リストに英語(米国)を言語として指定してください。
- 2026年9月30日以降、Androidの開発者認証は、ブラジル、インドネシア、シンガポール、タイの認証済みデバイスにインストールされるアプリに適用されます。GoogleサービスなしのHuaweiデバイスはGoogle認証済みではありませんが、同じパッケージが認証済みデバイス上でGoogle Play以外からもインストールされる場合は、Android Developer Consoleにパッケージ名を登録してください。
ステップ 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のロゴ、他社メーカーのブランドが入ったAndroid端末フレーム、「Google Play で手に入れよう」バッジを含むスクリーンショットは再利用しないでください。Huaweiは他のストアに言及したリスティングを拒否します。その他のアセットは、他のストア向けに作成したものを再利用してください。 App Store と Google Play の公開ガイド を扱っています。
ステップ 8: アップロード、申請、審査
- では バージョン情報 > 下書き、APK を以下にアップロードします ソフトウェアのバージョン.
- リスト情報、評価、プライバシー、対象国を入力します。
- リリース時刻を設定します(承認後すぐ、または予約)。
- 審査に提出します。
審査には通常数営業日かかります。拒否はガイドラインの参照付きでメールで通知されます。Capacitor アプリでよくある理由:
- Google Play サービスなしでは動作しない機能 (反応しないログインボタン、空白のマップ画面など)。
- 重複アプリ: 同じパッケージ名を持つアプリが別の開発者によって AppGallery に既に存在するか、Huawei が以前 Google Play からアプリをコピーした可能性があります。所有権の証明を添えて Huawei 開発者サポートに連絡してください。
- 他のストアへの言及 スクリーンショットやテキスト内での。
- 英語の欠落 海外配信のために。
- プライバシーポリシー アプリ内から見つからない、またはアクセスできない状態です。
AppGallery ConnectにはAPIも用意されているため、初版リリース後はCIからのアップロードを自動化できます。
ステップ 9: アップデートを高速に保つ
他のストアと同様、ネイティブコードの変更は再度Huaweiの審査が必要です。JavaScript、HTML、CSSの変更については、 Capgo Live Updates 1回のアップロードで、Huawei、Google、Appleのデバイス上のインストール済みアプリに新しいbundleを直接配信できます。updaterはCapgoエンドポイントからbundleを取得し、Google Play servicesを使用しないためです。Huaweiビルドに異なる機能がある場合は、専用のchannelを使用してください:
bunx @capgo/cli@latest bundle upload --channel huawei
ビルド時にHuaweiビルド用のデフォルトchannelを設定するか、アプリからデバイスをchannelに割り当てます。 Capgo updaterのドキュメント でchannelと設定について説明しています。
チェックリスト
- 依存関係の監査完了、GMS専用機能のリストアップ完了
- ランタイムサービスのチェックを追加し、実機Huaweiデバイスでテスト済み
- Google専用機能(push、sign-in、billing、maps、review)を非表示または置き換え済み
- HUAWEI Developersアカウントの認証完了
- 既存アプリと同じパッケージ名でアプリを作成済み
capacitor.config.ts - バックアップ済みkeystoreで署名したリリースAPK
versionCodeバンプ済み - アイコン、スクリーンショット3〜8枚、簡単な説明と詳細な説明、プライバシーポリシー
- ストア掲載物にGoogle Playへの言及がないこと
- 必要に応じてレビュアー用のテストアカウントを用意
- 提出済み、レビュー用メールを監視中
Google Playの準備も行う場合は、こちらを読んでください Apple と Google Play の開発者アカウントの作成方法 12人のテスターという、そこだけで適用されるルールについて。