(Google Admob) Ad Placements API for Unity 広告プレースメントの不具合

10-05,2022

ネットを調べると、
『AdMob広告を、Ad Placements API 広告プレースメントで簡単実装!』
みたいな記事がかなり出てきますが、
不具合らしきものを発見したので、ここに残しておきます。


最初に直面した謎現象



状況としては、
Ad Placements API 広告プレースメントを用いて、
バナー、インタースティシャル、リワードの3種類を実装してリリースしました。

ところが、10個くらいのアプリに同様の実装をしましたが、
内2つくらいのアプリで、謎現象が発生しました。

『実機やユーザーデバイス上で、広告は表示されるのに、 
 そのレポートがAdmob側で反映されない』というもの。


具体的には、例えば、

 バナー広告 表示回数 1021
 リワード広告 表示回数 32

とか表示されているのに、

 インタースティシャル広告は、存在自体がレポートされていない

・・・みたいな。

この場合、どんなにユーザーがその広告を見たとしても、
その収益は、恐らく0円になっています。


この謎現象が、自分でどんなに模索しても判明せず、
Google AdmobフォーラムやUnityフォーラムで質問したりもしましたが、回答はなく、
もちろん、検索しても、この現象のことに触れている記事はありませんでした。


謎現象の正体(予想)



 これは、Unityのインスペクター上で、
 AdMob Ad Placements の広告ユニットIDを変更した際、
 変更しているにもかかわらず、内部的には変更されていない
 ・・・という不具合が、原因と思われます。

 内部的には変更されていなかった、と私が判断できたのは、
 自分で広告ユニットIDが間違ってないかを確認した際に、何故か、
 インタースティシャル広告を実装させたオブジェクトが存在するシーンファイルが、
 変更もしていないのに、
 クラウド上のファイルと比較して、"更新されている状態"になっていたから。

 実際には、PlasticSCMの更新リストに、触ってもいないMain.sceneファイルが追加されていたのを見て、私は不信に思い、diffしてみると・・・、
 まさに、その時点で、なぜか今頃になって、インタースティシャル広告のユニットIDが、古いものから新しいものへ変更されていたのでした。

 当然、それまで古いIDだったわけではもちろんなく、インスペクター上は、新しいIDでしたが、
 何故かそのタイミングまで、内部的には更新されていなかった、
 ・・・ということが、その現象から推察できました。


 しかし、そもそも、Admobの広告ユニットIDは、
 多分、シーンファイルに紐づくものではなく、
 プロジェクトファイルに紐づくもののはずでは…と予想します。
 にもかかわらず、更新されていたのはシーンファイルの方。

 これはもしかしたら、Google AD Setting上の広告ユニットIDは、
 プロジェクトファイルに保存され、ちゃんと正しいIDに変更されてはいるが、
 その広告ユニットを実際に適用するオブジェクトに、
 何かのタイミングで、広告ユニットIDが自動的に受け渡され、
 オブジェクトの方にも、そのIDが個別に保存されているのでは!?


 だから、プロジェクトファイルの方、つまりGoogle AD Setting上で広告ユニットIDを変更しただけでは、オブジェクトに紐づくIDの方は更新されておらず、
 おそらく、そのオブジェクトを選択するとか、開く…みたいなアクションをした時に、
自動的にそっちが更新されるような仕組みかもしれません。あるいは定期的なクロールとか。

 そうであるなら、オブジェクトの方を一切いじらずに、リリースすると、
 Google AD Setting上での広告ユニットIDは正しくても、
 アプリ実行時、オブジェクトの方に、そのIDが受け渡されておらず、
 正しいIDが送信されていない・・・、ということになってしまうのかもしれません。


 オブジェクトの方にIDを受け渡す自動クロールのようなものがあるのかもしれないですが、UnityEditorや開発者の挙動によっては、それがうまくいかないケースがあったりして、プログラムがそれを保証できていない可能性があります。
 これは Google Admob AD Placements が、各ユニットIDを、インスペクター上で設定できるというメリットを提供したはいいものの、その構造の不完全さのようなものだと予想します。
 ここではインスペクターと便宜上言ってはいますが、実際には、エディター拡張によって入力させており、それをオブジェクト側が毎動作内で取得していくのではなく、エディター上でオブジェクトの方を更新させる、という挙動のような所に問題がありそうです。


 例えば、開発状況によっては、
 オブジェクトの方を先に作り、ソースも作り、全部終わったあとで、
 Google AD Setting上で広告ユニットIDを設定する
 ・・・みたいなケースは、結構な確率で予想されます。

 広告ユニットIDが判明するのは、AdMob側でアプリを登録した時であり、
 アプリが完成したあとで登録して広告IDを発行させたりするならば、こういう順番は頻発します。

 そしてその状況で、シーン内のオブジェクトに正しいIDが受け渡せていない場合があると、
 ビルドしても、間違ったIDを、内部では使用されてしまい、
 AdMob側がそれを正しく受信できないことで、上記の現象が発生するのでは、と予想します。


現実的な対策



対策1

1つは、Google AD Setting上で広告ユニットIDを設定した後は、
かならず、シーン内で広告を実装しているオブジェクトを選択したり、開いたりして、
IDが受け渡されるようにする機会を意識した方が良いでしょう。

ただ、実際どんなタイミングで受け渡されているのか不明のため、それをやっても不安ではありますが。

ちゃんと受け渡されたかどうかを確認する方法としては、
シーンファイルの中身を開き、広告ユニットIDの項目を検索してみると、出てくるので、
そのIDが正しいかどうかを確認することで、整合性を確認することができます。


対策2

もう1つの対策としては、
正規のSDKを使うです。


広告プレースメントAPIは、そもそもベータ段階のSDKであり、
ベータと明示しているので、信用が薄いことをGoogle側が提示しています。

見たところ、本家のSDKがどんどんVerupされていっているのに、
こちらはまったく更新されていないようなので、そういう面からも、使わない方が吉かと思います。


今回の報告は、私の実体験からの予想であり、
SDK内部のソースを全部見て言っている確証のあるものではないので、
あくまで報告例の1つとして、このことで困っている人の助けになればなと思い、世界に残しておきます。