AdMobメディエーションで広告ソースを追加する際に知っておくべきこと

AdMob

AdMobでの広告収益を最大化していくには、メディエーションの利用が不可欠になります。メディエーションに対応した広告ソースを追加するには、以下などを参考に対応していくことになります。

そして、広告ソースが正しく接続できたかどうかを確認するには、Ad inspector (広告インスペクタ)を使うことになります。

自分のアプリではないのですが、とあるプロジェクトで広告ソースを追加したのに Ad inspector で確認できず、原因の追求に非常に手間取ったケースがありました。

今回は Ad inspector を使った確認を行う際に知っておくべきことを紹介したいと思います。

広告アダプターの初期化時に何が行われるか

Mobile Ads SDK を初期化するには、Androidでは MobileAds.initialize() を、iOSでは GADMobileAds.startWithCompletionHandler: を呼び出すのですが、このときに以下のことが行われます。

  • AdMob広告関連機能の初期化
  • 広告アダプターの初期化
  • 広告のプリロード

メディエーションを使って広告ソースを使っていない場合は、初期化すればすぐ広告が表示可能になります。しかし、メディエーションを使っている場合には正しく広告アダプターが初期化されないと各広告ソースからの広告が配信されません。

広告アダプターの初期化の際、以下のようなことが行われます。

  1. AdMob のアプリ(AndroidManifest.xml の com.google.android.gms.ads.APPLICATION_IDInfo.plist の GADApplicationIdentifier で指定)に追加されている「広告ユニット」の情報を取得
  2. その広告ユニットが追加されている「メディエーショングループ」内で、「広告ユニットのマッピング」が必要な広告ソースの情報を取得
  3. 取得した広告ソースの情報を元に、その広告ソースに紐づくアダプタークラスを動的に取得
  4. アダプタークラスの取得に成功したら、初期化を実行

これらについて、明確な仕様が書いたドキュメントは見つけていないのですが、実際に確認した結果となります。ドキュメントとしては以下が参考になります。

Adapters タブにエラーが出るケース

前述の上記の 3. でアダプタークラスが見つからないと、Adapters タブで該当の広告ソース名のところに 「Adapter not found」が表示されます。

同様に、4. でアダプターが初期化に失敗したり初期化前に Ad inspector を表示したりすると「Didn’t initialize」が表示されます。

Ad inspector の Adaptersの表示画面 (https://support.google.com/admob/answer/10159602 から抜粋)

Adapter not found が出る場合

Adapter not found」が出た場合は、AdMob管理画面での登録は正常に行われており、単純にアプリ側でSDK組み込みがまだの場合というケースが大半になると思います。

たとえば開発用アプリでは組み込んで動作確認したが、まだストアで更新していない場合は本番アプリの Ad inspector で表示されることになります。

Didn’t initialize が出る場合

Didn’t initialize」が出る場合は、以下のどちらかになると思います(これら以外にもあるかもしれません)。

  • SDK組み込みを行ったがSDK初期化処理などが漏れている
  • アプリ起動してから Ad inspector を表示するタイミングが早すぎた

特に後者が結構引っかかりやすい罠ですね。大半がこれに該当すると思います(Adapter found だが Didn’t initialize で困ったケースは経験が無いです)。

Mobile Ads SDK を初期化のAPIは非同期で、Google Mobile Ads SDK を初期化する の項目にも「30秒のタイムアウト」という表現があるので、最大で30秒ぐらいかかります(実際はここまでかかることはあまりないと思います)。

想定通りの結果にならない場合は、アプリ起動してから30秒ぐらい待ってから表示させてみるとよい思います。

Adapters タブに表示されない場合

Adapters タブに表示されない場合、以下のケースが考えられます。

  • アプリに紐づいている広告ユニットが属するメディエーショングループに広告ソースが追加されていない
  • アプリに紐づいている広告ユニットが属するメディエーショングループに広告ソースが追加されているが、広告ソースが「一時停止」になっている
  • Mobile Ads SDK の初期化が完了してない
  • Mobile Ads SDK の初期化が完了しているが、アダプターが初期化されていない
  • AdMobアプリIDが間違っている

よく勘違いしがちなのが、「広告SDKを組み込んでいないのが原因なのでは?」というものですが、これは完全に誤りです。

広告ソースが正しく登録されているのに広告SDKが組み込まれていない場合は 「Adapter not found」が出るはずで、「Adapters タブに表示されない」ということにはならないです。

広告ソースが追加されていない

広告ソースを追加する際に、対象のメディエーショングループをミスっていて、アプリに紐づいた広告ユニットが含まれていないケースなどが該当しますね。

アプリが複数あって、広告ユニットも複数あって、メディエーショングループも複数ある、というような状況だと、複雑なのでミスが発生しやすいと思います。

まずはこれを念入りにチェックすべきですね。

広告ソースが「一時停止」になっている

広告ソースを正しくメディエーショングループに追加していても、「一時停止」になっているとアダプタークラスの取得処理が走らないようで、Adapters タブに表示されません。

AdMob管理画面で「有効」になっているかをチェックしましょう。

Mobile Ads SDK の初期化が完了してない

Mobile Ads SDK の初期化APIは非同期なので、アプリ起動直後だとまだ初期化が完了していない可能性があります。その際、Adapters タブで「Initializing」などが表示されてくれればよいのですが、そういったものは一切出ずに真っ白になります。

前述しましたが、Ad inspector での確認は、アプリ起動して30秒ほど待ってからにするのがよいです。

Mobile Ads SDK の初期化が完了しているが、アダプターが初期化されていない

これは結構な罠で、Mobile Ads SDK の初期化が完了する前に広告のロードなどが走ると発生します。

MobileAds.initialize() のドキュメント には以下の記述があります。

If this method is not called, the first ad request automatically initializes the Google Mobile Ads SDK.

If this method is not called とありますが、初期化完了後のコールバック OnInitializationCompleteListener が呼ばれていない状態でも同様になります。

初期化完了前に広告リクエストが発生してしまうと、自動で初期化されるようなのですが、この自動初期化が走るとアダプターが初期化されません

例えば、バナー広告のスタートガイド などには

注: Mobile Ads SDK へのすべての呼び出しはメインスレッドで行ってください。

と書いてあり、通常は MobileAds.initialize() は Activity.onCreate() のタイミングで呼び出すことになります。

しかし、これを別スレッドで呼び出すようなことをしていると、このケースの問題が発生します。

とあるプロジェクトで前任者から引き継いだコードがなぜか onCreate() で以下のようになっており、嵌まりました(前任者が一体何を考えて別スレッドでの呼び出しにしていたのかは正直理解不能です)。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // ❌ 参考にしては行けないコード。別スレッドで MobileAds.initialize() を呼び出してはいけない
        Activity activity = this;
        new Thread(new Runnable() {
            public void run() {
                MobileAds.initialize(activity, new OnInitializationCompleteListener() {
                    @Override
                    public void onInitializationComplete(InitializationStatus initializationStatus) {
                        // ...
                    }
                });
            }
        }).start();
    }

以下のように直接呼び出すようにしたところ、解消しました(というかこれが普通です、むしろスレッド使うほうがムズいのでは)。

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // メインスレッドで MobileAds.initialize() を呼び出す正しいコード
        MobileAds.initialize(this, new OnInitializationCompleteListener() {
            @Override
            public void onInitializationComplete(InitializationStatus initializationStatus) {
                // ...
            }
        });
    }

AdMobアプリIDが間違っている

これは通常だと考えられないのですが、AndroidManifest.xml の com.google.android.gms.ads.APPLICATION_IDInfo.plist の GADApplicationIdentifier で指定したAdMobアプリIDが、AdMob管理画面での正しいアプリIDではないというものです。

「一体何を言っているのか?仮にそんな状態になっていたら広告自体表示されないのでは?」と思うのが自然だと思います。

しかし、なんと実は広告ユニットIDが正しければ、なんとAdMobアプリIDの指定を間違っていても広告は表示可能になっています。

エラーでも出してくれて広告表示してくれないほうが問題に気付けてエンジニア的には助かるのですが、親切にもフォールバックするようになっているのでしょうか…。

そのため、間違いにずっと気付かず、メディエーションでアダプターが初期化されない問題の調査時に初めて気付くというパターンです。

複数のアプリを作っていて、別のアプリをベースにして次のアプリを作るようなケースで、アプリIDの変更漏れなどがあると発生すると思います。

これも、とあるプロジェクトですでに本番リリース済みのアプリで遭遇した問題なのですが、「まさかアプリIDが間違っているはずはない」という思い込みがありました。

広告ソースの追加周りや広告ユニットIDなど、諸々確認しても間違いがなく、調査が難航して途方に暮れていました。そして、念のためと思って確認したらアプリIDが違うという衝撃の事実が発覚しました。

正しいアプリIDを AndroidManifest.xml / Info.plist で指定したら、問題が解消しました。

これはかなりの罠だと思うので、思い込みを捨てて確認すべきポイントになります。

まとめ

広告ソースを追加したのに想定通りにならないケースについて、実際の事例を含めて紹介しました。

AdMobメディエーションをがっつり使い込んでいる人が少ないためか、このあたりのトラブルシューティング的な記事って結構少ないと思います(自分が探せていないだけでしょうか…)。

メディエーションでの広告ソース追加に関連する作業で困った方の助けになれば幸いです。

コメント

タイトルとURLをコピーしました