AdMob 広告が表示されない — よくある症状と全体像
Rork で作成したアプリに AdMob 広告を実装したのに、実機で広告が一切表示されません。あるいは表示されていたはずの広告が突然消えた。さらには AdMob ダッシュボードに収益が反映されていません。こうした問題は、個人開発者にとって収益に直結するため、一刻も早く解決したいところです。
AdMob 広告が表示されない原因は大きく分けて以下の5つのカテゴリに分類できます。
- 設定ミス: アプリ ID や広告ユニット ID の誤り、テスト ID のまま本番に出している
- ポリシー関連: app-ads.txt の未設定、AdMob ポリシー違反によるアカウント制限
- 実装の問題: React Native / Expo の広告コンポーネント設定不備
- ネットワーク・環境: 広告在庫なし、地域制限、VPN の影響
- 審査・反映待ち: 新規広告ユニットの反映に最大1時間かかるケース
原因1: AdMob アプリ ID・広告ユニット ID の設定ミス
最も多い原因がこの ID の設定ミスです。AdMob では「アプリ ID」と「広告ユニット ID」の2種類があり、混同すると広告が表示されません。
アプリ ID の確認
AdMob コンソール(apps.admob.com)にログインし、対象アプリの設定画面で「アプリ ID」を確認します。形式は以下の通りです。
- iOS:
ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX - Android:
ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX
Rork で Expo を使用している場合、app.json または app.config.js に正しく設定されているか確認しましょう。
// app.json — AdMob アプリIDの設定
{
"expo": {
"plugins": [
[
"react-native-google-mobile-ads",
{
"androidAppId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX",
"iosAppId": "ca-app-pub-XXXXXXXXXXXXXXXX~XXXXXXXXXX"
}
]
]
}
}
// 期待結果: ビルド後にAdMob SDKが正しく初期化される広告ユニット ID の確認
広告ユニット ID はアプリ ID とは別の値です。バナー、インタースティシャル、リワードそれぞれに固有の ID が発行されます。
// 広告ユニットIDの定数管理(推奨パターン)
const AD_UNIT_IDS = {
banner: {
ios: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
android: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
},
interstitial: {
ios: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
android: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
},
rewarded: {
ios: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
android: 'ca-app-pub-XXXXXXXXXXXXXXXX/XXXXXXXXXX',
},
} as const;
// プラットフォーム判定
import { Platform } from 'react-native';
const bannerAdUnitId = Platform.select(AD_UNIT_IDS.banner);
// 期待結果: iOS/Androidそれぞれ正しいユニットIDが選択されるテスト広告 ID を本番で使用していないか
開発中はテスト広告 ID を使いますが、リリースビルドでテスト ID のままだと「テスト広告」すら表示されなくなるケースがあります。環境変数で切り替える仕組みにしておくと安全です。
// 環境に応じた広告ID切り替え
const getAdUnitId = (type: 'banner' | 'interstitial' | 'rewarded') => {
if (__DEV__) {
// テスト広告ID(Google公式提供)
const testIds = {
banner: 'ca-app-pub-3940256099942544/6300978111',
interstitial: 'ca-app-pub-3940256099942544/1033173712',
rewarded: 'ca-app-pub-3940256099942544/5224354917',
};
return testIds[type];
}
// 本番広告ID
return Platform.select(AD_UNIT_IDS[type]);
};
// 期待結果: 開発時はテスト広告、本番は実際の広告が表示される原因2: app-ads.txt の未設定・不備
app-ads.txt は、あなたのアプリで広告を配信する権限を持つネットワークを宣言するファイルです。これが正しく設定されていないと、広告リクエストが拒否され収益が発生しません。
app-ads.txt の設置手順
- AdMob コンソールの「アプリ」→「app-ads.txt」タブから、あなた専用のスニペットをコピー
- アプリの開発者ウェブサイトのルートディレクトリに
app-ads.txtを配置 - App Store Connect / Google Play Console に登録しているウェブサイト URL と一致させる
# app-ads.txt の例
# AdMob のパブリッシャーID を含む行(AdMobコンソールからコピー)
google.com, pub-XXXXXXXXXXXXXXXX, DIRECT, f08c47fec0942fa0確認方法
ブラウザで https://あなたのサイト.com/app-ads.txt にアクセスし、正しく表示されるか確認します。AdMob コンソールの「app-ads.txt」タブでステータスが「確認済み」になっていれば成功です。
反映には最大24時間かかることがあるため、設置直後に広告が出なくても慌てずに待ちましょう。
原因3: React Native / Expo での実装不備
Rork で生成されたアプリは React Native + Expo ベースのため、広告 SDK の設定にいくつかの注意点があります。
react-native-google-mobile-ads のインストール確認
# パッケージがインストールされているか確認
npx expo install react-native-google-mobile-ads
# Expo の config plugin が正しく適用されているか確認
npx expo config --type introspect | grep -A5 "google-mobile-ads"
# 期待結果: androidAppId と iosAppId が表示されるEAS Build でのネイティブモジュール再構築
Expo Go ではネイティブ広告 SDK は動作しません。必ず EAS Build(Development Build)で実機テストしてください。
# Development Buildの作成
eas build --profile development --platform ios
eas build --profile development --platform android
# ビルド後、実機にインストールしてテスト
# 期待結果: テスト広告バナーが画面下部に表示される広告コンポーネントの正しい実装例
// components/BannerAd.tsx — バナー広告コンポーネント
import React, { useState } from 'react';
import { View, Text, StyleSheet } from 'react-native';
import {
BannerAd as RNBannerAd,
BannerAdSize,
TestIds,
} from 'react-native-google-mobile-ads';
interface Props {
adUnitId?: string;
}
export const BannerAdComponent: React.FC<Props> = ({ adUnitId }) => {
const [adLoaded, setAdLoaded] = useState(false);
const [adError, setAdError] = useState<string | null>(null);
const unitId = __DEV__ ? TestIds.BANNER : (adUnitId ?? '');
if (!unitId) {
return null; // 広告IDが未設定の場合は何も表示しない
}
return (
<View style={styles.container}>
{adError && (
<Text style={styles.errorText}>
広告の読み込みに失敗しました: {adError}
</Text>
)}
<RNBannerAd
unitId={unitId}
size={BannerAdSize.ANCHORED_ADAPTIVE_BANNER}
requestOptions={{
requestNonPersonalizedAdsOnly: true,
}}
onAdLoaded={() => {
setAdLoaded(true);
setAdError(null);
console.log('✅ バナー広告の読み込み成功');
}}
onAdFailedToLoad={(error) => {
setAdError(error.message);
console.error('❌ バナー広告の読み込み失敗:', error);
}}
/>
</View>
);
};
const styles = StyleSheet.create({
container: {
alignItems: 'center',
marginVertical: 8,
},
errorText: {
color: '#ef4444',
fontSize: 12,
marginBottom: 4,
},
});
// 期待結果: 広告が正常に読み込まれるとコンソールに成功ログが出力されるよくあるエラーコード一覧
広告の読み込みに失敗した場合、onAdFailedToLoad コールバックでエラーコードを確認できます。
- ERROR_CODE_NO_FILL(コード3): 広告在庫がありません。時間を置いて再試行、または別の広告フォーマットを試す
- ERROR_CODE_NETWORK_ERROR(コード2): ネットワーク接続エラー。Wi-Fi/モバイルデータの接続を確認
- ERROR_CODE_INVALID_REQUEST(コード1): リクエストが無効。広告ユニット ID を再確認
- ERROR_CODE_INTERNAL_ERROR(コード0): SDK 内部エラー。アプリの再起動やSDKのバージョンアップを試行
原因4: AdMob アカウント・ポリシーの問題
広告が突然表示されなくなった場合は、AdMob のポリシー違反が疑われます。
AdMob ポリシーセンターの確認手順
- AdMob コンソール → 左メニュー「ポリシーセンター」を開く
- 警告やポリシー違反の通知がないか確認
- 「アプリのレビュー」セクションで各アプリのステータスを確認
よくあるポリシー違反と対処法
- 無効なトラフィック: 自分で広告をクリックした、テスト中に繰り返し広告を表示した → テスト時は必ずテスト広告 ID を使用する
- コンテンツポリシー違反: アダルトコンテンツ、暴力的コンテンツを含むアプリ → コンテンツを修正し、再審査をリクエスト
- 広告の配置違反: ユーザーの誤クリックを誘導する配置 → 広告とコンテンツの間に十分な余白を設ける
- アプリが審査中: 新規アプリは AdMob 側の審査が完了するまで広告が配信されない → ステータスが「準備完了」になるまで待つ
収益が反映されない場合
AdMob ダッシュボードの収益は最大48時間遅延する場合があります。また、無効なトラフィックと判定されたクリック/インプレッションは収益から差し引かれます。
「見積もり収益額」と「確定収益額」には差が生じることがあります。確定収益はその月末に確定し、翌月21日頃に支払いが行われます。
原因5: 広告在庫とネットワーク環境の問題
技術的な実装が正しくても、広告が表示されないケースがあります。
広告在庫不足(No Fill)
特に日本以外の地域や、ニッチなカテゴリのアプリでは広告在庫が少ないことがあります。対策として、AdMob メディエーションを導入し、複数の広告ネットワーク(Meta Audience Network、Unity Ads、AppLovin など)を追加することで、フィルレートを向上させられます。
VPN・プロキシの影響
開発中に VPN を使用していると、広告配信に影響が出ることがあります。テスト時は VPN をオフにして確認しましょう。
新規広告ユニットの反映時間
新しく作成した広告ユニット ID は、反映されるまで最大1時間かかります。広告ユニットを作成した直後にテストしても表示されない場合は、しばらく待ってから再試行してください。
解決できたかの確認手順
すべての修正を行ったら、以下のチェックリストで動作確認します。
app.jsonのアプリ ID が AdMob コンソールと一致している- 広告ユニット ID が正しいプラットフォーム用のものである
app-ads.txtがウェブサイトのルートに公開されている- EAS Build(Development Build)で実機テストしている(Expo Go は不可)
- テスト広告(
TestIds.BANNERなど)で正常に表示される - 本番ビルドで本番広告 ID に切り替わっている
- AdMob ポリシーセンターに警告がない
- AdMob コンソールでアプリのステータスが「準備完了」である
# 実機でのログ確認(iOS)
npx react-native log-ios | grep -i "admob\|ad\|google"
# 実機でのログ確認(Android)
adb logcat | grep -i "admob\|Ads\|Google"
# 期待結果: "Ad loaded successfully" または広告関連のエラーログが確認できる再発防止のベストプラクティス
問題を解決したら、今後同じトラブルに遭わないための予防策を導入しましょう。
- 環境変数で広告 ID を管理: ハードコードを避け、
.envファイルとapp.config.jsで管理する - テスト用と本番用の明確な分離:
__DEV__フラグでテスト ID と本番 ID を自動切り替え - CI/CD での広告 ID チェック: ビルドパイプラインにアプリ ID の整合性チェックを追加
- 定期的な AdMob ダッシュボード確認: 週1回はポリシーセンターと収益レポートを確認
- エラーログの収集: Rork アプリのクラッシュ監視を自動化する — Sentry 完全セットアップガイドを参考に、広告関連のエラーも監視対象に含める
全体を振り返って
AdMob 広告が表示されない問題は、設定ミス・ポリシー違反・実装不備・環境要因のいずれかに起因することがほとんどです。本記事で紹介したチェックリストを上から順に確認すれば、大半のケースで原因を特定できるはずです。
広告収益はアプリのマネタイズにおいて重要な柱です。正しい実装と定期的なモニタリングで、安定した収益基盤を築いていきましょう。AdMob 以外の収益化手法も含めた総合的な戦略については、Rork AIアプリ収益化完全戦略も参考にしてみてください。
広告収益の最大化やモバイルアプリのマネタイズ戦略