以下のドキュメント見ながら、手元のアプリにGoogle AdMob メディエーションの広告SDKを追加しまくる作業をしました。
AdMob管理画面のウォーターフォールにも設定を追加し、ビルドも問題なかったのでアプリ更新したのですが、「広告動画見たのに報酬もらえない」という書き込みをあちこちで見かけ、とても焦りました。
どうやら特定のケースで報酬もらえない挙動になっていたようです。
応急処置
今回追加した広告ソースのどれかで報酬がもらえない挙動になっているものがいるはずなので、ひとまず手元でどの広告ソースが原因かを探りました。
Ad inspector の Single ad source test を使って各広告ソースを指定し、1つずつ確認していったところ、以下の広告ソースで報酬がもらえない問題が再現できました。
応急処置として、AdMob管理画面で、メディエーショングループのウォーターフォール設定で上記の広告を「一時停止」にしました。これでひとまず問題は発生しなくなります。
Android で再現確認したのですが、怪しいので念のため iOS でも同様に一時停止にしておきました。
まさか広告ソースによって挙動が異なるなんてことは想定しておらず、事前の動作確認が甘かったなと反省しました。
アプリ更新した日の深夜に応急処置したのですが、早めに気付くことができたのは幸いでした。
原因調査のため各広告ソースのシーケンス挙動を確認
リワード動画のシーケンスについては、以下のドキュメントに記載されています。
- https://developers.google.com/admob/android/rewarded
- https://developers.google.com/admob/ios/rewarded
リワード動画を視聴し終わると、コールバックとして以下が呼ばれます。
- Android
- iOS
アプリ側では、これらのコールバック呼び出しに応じて処理を行うのですが、シーケンス的に「報酬付与コールバック → 動画非表示コールバック」の順番で呼ばれます。
そのため、報酬付与コールバックが呼びされたときに「報酬タイプ文字列」を保持しておき、動画非表示タイミングで保持しておいた報酬タイプ文字列をもとに報酬付与を行っていました。
報酬タイプは以下で取得できます。
- Android: RewardItem#getType()
- iOS: GADAdReward.type
各広告ソースの挙動を確認したところ、以下のパターンがあることが分かりました。
- A: 非表示コールバックと報酬付与コールバックのどちらも呼ばれない
- B: 非表示コールバックも報酬付与コールバックも呼ばれるが、「報酬タイプ文字列」が空文字列
パターンBは、通常は報酬タイプ文字列はAdMob管理画面上で設定した文字列が渡されますが、それが空文字になっているというものです。
4つの広告ソースの挙動は以下のようになっていました。
- AdColony
- Android: パターンA
- iOS: パターンB
- InMobi
- Android: パターンA
- iOS: パターンAのときとパターンBのときが混在。謎。
- Unity Ads
- Android: パターンB
- iOS: パターンB
- maio
- Android: パターンAのときとパターンBのときが混在。謎。
- iOS: パターンB
対応方法について検討
パターンAについては、シーケンスが不正なので直しようがないですね。各広告ソースのSDKが完全にバグってるということになります。以下の記事でも言及しましたが、広告ソースのSDKは結構バグってる事が多いようですね…。
パターンBについては、本来はAdMob管理画面で指定した文字列が来るのが仕様のはずなので、これも広告ソース側のSDKがバグってることになります。
しかし、これはアプリ側で対処が可能なことが分かりました。アプリ側では報酬タイプ文字列自体で処理を分けるようなことはしていないのですが、「保持しているかどうか」の判定で std::string::empty() を使ってしまっていたため、空文字で渡されても「保持していない」と判定してしまい、報酬付与がスキップされてました。
パターンBのケースについて、報酬タイプ文字列が空文字だった場合でも適当なダミー文字列を入れておくようにすることで、正常シーケンスで処理させることができます。
今回はパターンBについてこの方法で修正し、問題なく動くように直して再度アプリ更新しました。
まとめ
リワード動画広告で報酬付与されないバグについて、原因と対策について紹介しました。
ゲーム内の報酬が欲しくてせっかくリワード動画を視聴してくれたのに、報酬付与されないとなるとユーザの不満は半端ないですね。実際、応急処置したり対策したアプリを更新するまでの間に★1レビューが何件か付けられてしまいました。
リワード動画広告は広告収益全体の中でもかなりのウェイトを占めるので、不具合があると色々問題になりますね。
今回は広告ソース側のSDKのバグが原因だったのもあるのですが、SDKの挙動を信頼しすぎていて細かく動作確認していなかったのも悪かったと思います。
「広告ソースのSDKはバグってる。信用ならない」ぐらいの気持ちでいるのが正しいのかもしれません。
似たようなケースで困っている方の助けになれば幸いです。
コメント