ポリシー違反「コンテンツの前面に重なって表示されるGoogleが配信する広告の扱い」を解決した話

2023年10月22日

開発環境
OS:Windows 11
SDK:Android Studio Flamingo | 2022.2.1

問題

以下に示した画像はポリシー違反「コンテンツの前面に重なって表示されるGoogleが配信する広告の扱い」に該当します。 修正しなさい。

概要

とあるアプリの改修リリースを行ってから5か月が経過したある日、突如、ポリシー違反「コンテンツの前面に重なって表示されるGoogleが配信する広告の扱い」の警告メールが届きました。

ポリシー違反の発生から解決までの顛末。

ポリシー違反は突然に

アプリ「みてみて」を改修し、リリースしたのが2023年5月4日。

それから5か月が経過した10月14日、突如、ポリシー違反の警告メールが届きました。

メールが届いた時点ですでに広告配信に制限がかけられている模様。

それは困る、と慌ててAdmobのポリシーセンターを確認してみると、

ポリシーセンターに問題と関連画像が表示されていました。

検出された問題は、

「コンテンツの前面に重なって表示されるGoogleが配信する広告の扱い」

そして、添付されていた画像は、

アプリのマップ画面でした。

どうやらこのマップ画面が違反対象のようです。

う~ん、何が駄目なのか・・・

パッと見た感じでは分かりません。

なんとか解決の糸口はないかと「重なっている」点に注目してみると

Googleマップの上にバナー広告を配置していたことに気付きました。

そう確信し、レイアウトの調整を行い、アプリをリリース。

アプリがストアに展開されるのを確認し、ポリシーセンターから審査をリクエスト。

違った

そして、翌日。

早々と返ってきた返事。

ち、違ったのか・・・

こうなってくると何が駄目なのか、Admobに聞きたくなるが明確な問い合わせ先がない。

そこでなんとか意思疎通を図ろうと試みる。

リクエストのコメント欄に「コンテンツと表示が重ならないようマップ画面のレイアウトを修正しました。修正内容が間違っているなら詳細を教えて欲しい」

と記入。再度、リクエスト。

すると約2時間後・・・

また同じフォーマットでメールが返って来た!

コメントに対するリアクションもない・・・

どう改修すればよいか検討がつかない、しかし、広告配信の制限を解除したい。

広告自体を削除すれば、コンテンツと重なるという違反は解除されるはず。

これで少なくともマップ画面以外の広告は復帰できる。

そう期待し、再審査に挑んだ。

う、嘘だろ

そして翌日。

届いたメールを見て驚愕した。

デバッグ用フォルダ

ポリシー違反が解決されていない。

そ、そんなバカな・・・

広告自体を削除したのに・・・

絶望しかけたそのとき、

ふとポリシーセンターを見直してみると問題の欄に違反項目が追加されていた。

ヒントを出してくれているのかい!(涙

新たに追加された問題は、「サイトの仕様:ナビゲーション」であった。

ガイドラインを確認すると広告の近くにボタンなどを配置し、誤操作を誘発してしまうのはポリシー違反になるとのこと。

その点を考慮し、レイアウト調整を行い、アプリをリリース。

再審査をリクエストした。

ポリシー違反解除

問題発生から4日。

ついにポリシー違反が解除されました。

はてさて最初の指摘でこの修正ができるものなんだろうか?という疑問が沸き起こる。

最終的にポリシー違反が解除されたレイアウトが以下です。

回答

今月のみてみて(2023年9月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2023年9月1日~2023年9月30日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

前回のアプリ改修日が2023年5月4日。

そして、いまだ改修が進まぬ状況。

それでもユーザー数の変動があるのはありがたい話。

(インストールの上位国)

今月もフィリピン、インドネシアがインストール率上位を維持。

スウェーデンは初めてか。

2023年9月30日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

Hosting(Webサイト)で少しアクセスが伸びる。

Webサイトはおまけ要素なので上限80%超えてきたらWebサイトを閉じるか検討しないとだがそこまで伸びないか。

2023年9月1日~2023年9月30日のAdMob

今月はAdMob広告収入:56円、 Firebase使用料:0円となりました。

今月のみてみて

(今月の投稿ピックアップ)

久々に通いたくなる博多らーめんのお店を発見。

今後の改善案

(未消化の課題)

・アプリ起動処理の見直し

・チャット機能強化

・アプリUIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

今月のみてみて(2023年7月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2023年6月23日~2023年7月22日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

前回のアプリ改修日が2023年5月4日。

それから約2ヶ月半、アプリの改修は停滞。

そして、ユーザー数は微減傾向。

その間もたまに使っているがアプリの遅延が気になるので抜本的な対策をとりたいところ。

(インストールの上位国)

フィリピン、インドネシアのインストールを維持。

アラブ首長国連邦、インドは期待。

2023年7月23日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

まだまだ微々たる使用量ですが安定してます。

2023年6月23日~2023年7月22日のAdMob

今月はAdMob広告収入:111円、 Firebase使用料:0円となりました。

今月のみてみて

(今月の投稿ピックアップ)

京都河原町でモンスターエナジーの先行無料配布

もう店頭にも並んでますね。

今後の改善案

(未消化の課題)

・アプリ起動処理の見直し

・チャット機能強化

・アプリUIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

今月のみてみて(2023年4月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2023年4月28日~2023年5月27日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

前にアプリの起動処理に修正をかけたところが遅延の原因となっていたようで修正。

それが起因となったわけではないとおもうが、ユーザー数は微増、かつ、IN>OUTの状態。

(インストールの上位国)

このあたりは変動なし。

インドネシアは伸びませんでした。

南アフリカでインストールされたのは新たなトレンドです。

2023年5月27日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

ユーザー数の微増に伴い、ダウンロード容量が増加。

ユーザー数の増加割合に対するダウロード容量の増加分が気になるが、まだ微増すぎて判断しずらい。

2023年4月28日~2023年5月27日のAdMob

今月はAdMob広告収入:103円、 Firebase使用料:0円となりました。

今月のみてみて

(今月の投稿ピックアップ)

投稿ありがとうございます!

プライバシーを考慮してもらっているのか気になりますが。。。

今後の改善案

(未消化の課題)

・アプリUIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

,

今月のみてみて(2023年3月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2023年3月20日~2023年4月21日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

今月も改修を入れることができなかったのですが、なんとか現状維持です。

(インストールの上位国)

インドネシアが伸びてきました。

と言うよりフィリピンの勢いが落ちてきた結果なのかもしれません。

2023年4月21日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

先月と同様です。

心配することがない使用量です。

2023年3月20日~2023年4月21日のAdMob

今月はAdMob広告収入:73円、 Firebase使用料:0円となりました。

今月のみてみて

(今月の投稿ピックアップ)

投稿ありがとうございます!

今後の改善案

(未消化の課題)

・アプリUIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

(アプリ使用中の気付き)

・投稿機能の改善

,

今月のみてみて(2023年2月)

Firebase連携アプリ、みてみてエストーク伊勢125社巡り

このうち、みてみてにフォーカスを当て、Firebaseのアクセス動向やアプリの改善を考察する開発記事です。

Realtime Database+Storage構成の投稿アプリ

まずはアプリのユーザー数の変動とともにFirebaseのアクセス動向を確認します。

2023年2月19日~2023年3月18日のユーザー数の変動

(ユーザー数の変動)

1ヶ月の新規獲得ユーザー数

ユーザー数の変動自体は先月とかわらず。

今月は改善を入れれなかったのでむしろ健闘している、と言いたい。

(インストールの上位国)

今月もフィリピンがインストール数トップです。

ありがとうございます。

マレーシアも伸びがありますが、第3の国が出てきて欲しいところ。

2023年3月19日直近のFirebaseの変動

(Firebaseの変動)

直近のfirebaseの動き
1ヶ月のfirebase使用量

ユーザー数に比例して使用量は減少してます。

flutterで作ったWeb版、みてみてWebも見られているようでなりより。

2023年1月19日~2023年2月18日のAdMob

今月はAdMob広告収入:106円、 Firebase使用料:0円となりました。

今月のみてみて

(今月の投稿ピックアップ)

ありません。。。

誰か投稿してください。

今後の改善案

(未消化の課題)

・アプリUIブラッシュアップの継続

・フレンドグループ化と共有機能の追加

(アプリ使用中の気付き)

・投稿機能の改善

,

Admob広告ユニットIDをデバッグとリリースで使い分ける

2023年1月23日

開発環境
OS:Windows 10
SDK:Android Studio Dolphin | 2021.3.1

概要

Admobから与えられたアプリID、広告ユニットIDをデバッグモードで使用してしまうとAdmobから警告を来て、収益に影響が出てしまいます。
そうならないためにもリリースとデバッグモードで広告ユニットIDを分けて定義しておくと便利です。

Admobを表示するときに必要となるID

Admobをアプリに表示させるにはアプリIDと広告ユニットID、少なくとも2つのIDを定義する必要があります。

アプリID、広告ユニットIDはAdmobで作成することができますが、

アプリのデバッグ時に使用することはできません。

代わりにデバッグ時にはサンプルIDを使用します。

【 サンプルアプリID 】

ca-app-pub-3940256099942544~3347511713

サンプル広告ユニットID

広告フォーマットサンプル広告ユニットID
アプリ起動ca-app-pub-3940256099942544/3419835294
バナーca-app-pub-3940256099942544/6300978111
インタースティシャルca-app-pub-3940256099942544/1033173712
インタースティシャル動画ca-app-pub-3940256099942544/8691691433
報酬型ca-app-pub-3940256099942544/5224354917
報酬型インタースティシャルca-app-pub-3940256099942544/5354046379
ネイティブアドバンスca-app-pub-3940256099942544/5354046379
ネイティブアドバンス動画ca-app-pub-3940256099942544/1044960115
サンプル広告ユニットID一覧

デバッグ用定義とリリース用定義

アプリIDと広告ユニットIDはstring.xmlに定義して管理します。

まずリリース用のアプリID、広告ユニットIDをstring.xmlに定義します。
(下3行がID定義となります。)

<resources>
    <string name="app_name">Look Look</string>
  ・・・
  ・・・
  ・・・
    <string name="ts_adview">Advertisement will be displayed from now on.</string>
    <string name="ad_attribution">Ad</string>
    <!-- admob -->
    <string name="admob_id_manifest">ca-app-pub-xxxxxxxxxxxxxxxx~xxxxxxxxxx</string>
    <string name="admob_id_bottom_main">ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx</string>
    <string name="admob_id_bottom_map">ca-app-pub-xxxxxxxxxxxxxxxx/xxxxxxxxxx</string>
</resources>

次にデバッグ用のアプリID、広告ユニットIDをstring.xmlに定義します。

デバッグ用のstring.xmlは最初は存在しないため、新たにデバッグ用フォルダ内に作成します。

【 デバッグ用フォルダの場所 】

(プロジェクトフォルダ)/app/src/debug/res/values/string.xml

※フォルダがない場合はフォルダも作成します。

※多言語化対応している場合は言語毎のvaluesフォルダ(例えば日本語の場合、values-ja
 フォルダ)にstring.xmlを格納します。
 string.xmlの定義内容は全て同じで問題ありません。

デバッグ用フォルダ
<resources>
    <!-- admob -->
    <string name="admob_id_manifest">ca-app-pub-3940256099942544~3347511713</string>
    <string name="admob_id_bottom_main">ca-app-pub-3940256099942544/6300978111</string>
    <string name="admob_id_bottom_map">ca-app-pub-3940256099942544/6300978111</string>
</resources>

string.xmlには、AdmobのサンプルIDだけ定義すればOKです。

アプリID、広告ユニットIDを参照する

あとはstring定義を参照するだけです。

(AdroidManifestの定義例)

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
  ・・・
    <application
  ・・・
        <meta-data
            android:name="com.google.android.gms.ads.APPLICATION_ID"
            android:value="@string/admob_id_manifest" />
  ・・・
        <activity
            android:name=".MainActivity"
            android:exported="true"
            android:theme="@style/AppTheme.NoTitleMain">
  ・・・
       </activity>
  ・・・  
    </application>
</manifest>

(レイアウトXMLの定義例)

<?xml version="1.0" encoding="utf-8"?>
<ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    xmlns:ads="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MapsActivity">


    <com.google.android.gms.ads.AdView
        android:id="@+id/adViewMap"
        ads:adSize="SMART_BANNER"
        ads:adUnitId="@string/admob_id_bottom_map"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:layout_constraintStart_toStartOf="parent"
        android:layout_marginStart="0dp"
        app:layout_constraintBottom_toBottomOf="parent"
        android:layout_marginBottom="0dp">
    </com.google.android.gms.ads.AdView>
</androidx.constraintlayout.widget.ConstraintLayoutt>

これでデバッグとリリースの使い分けができるようになりました。

いつも通りにデバッグを行えばサンプルIDが参照され、リリースアプリの作成を行えば、リリース用IDが参照されるようになります。

ファミリーポリシー違反がやって来たヤァ!ヤァ!ヤァ!

概要

神経衰弱を題材にしたミニゲーム”サイキック・パワー”、
このアプリは対象年齢を0歳以上(全ユーザー対象)としており、ファミリーポリシーの遵守が必須です。

ですが、アプリに連携させているAdmobがファミリーポリシー違反をやらかしたそうで。。。

唐突にファミリーポリシー違反通知がメールに送られてきました。

内容としては、アプリがファミリーポリシーに違反しており、Google Playからアプリを削除したとのこと。

このアプリでのポリシー違反指摘は初めてです。

ですが、過去にも何度かファミリーポリシー違反となったことはあります。

その度にAdmobのイニシャル処理とリクエスト処理を改善したり、Admob設定を変更したりと対応してきました。

そして、ファミリーポリシーに則る必要のあるアプリ全てに水平展開もしてきたのですが。

(ファミリーポリシーを遵守するためのAdmobコーディングについてはこちらの記事。)

(ファミリーポリシーを遵守するためのAdmob設定についてはこちらの記事。)

それでは今回の理由は何なのか?

Admobの配信設定を見直す

ファミリーポリシー違反の理由がこちらでした。

審査結果通知

ファミリーポリシー違反の理由は2点。

1つ目は、広告のフォーマット違反。
広告表示から5秒後に広告を閉じることができなかった、とのこと。

2つ目は、広告のコンテンツ違反。
Admobから配信されている広告に子供にふさわしくないコンテンツが含まれていた、とのこと。

そこで配信設定の見直しを行います。

まず1つ目は5秒ルールの遵守。

アプリにはインタースティシャル広告、バナー広告を設置しているのですが、インタースティシャル広告と5秒ルールの相性が悪そうでした。

そこでインタースティシャル広告の配信から動画を削除しました。

そして、2つ目は広告のコンテンツ違反です。

メールに添付されていた違反広告の画像を見るとギャンブル系のゲーム広告のようです。

そこでブロックのコントロール設定を変更することにしました。

Google Admob コンソール

まずはGoogle Admobコンソールを表示して広告配信を制御したいアプリを選びます。
そして、メニューの「ブロックのコントロール」を選択。

Google Admob コンソール

次に一般カテゴリを選択し、ふさわしくないと思われる「レジャー/ギャンブル」の配信をブロックしました。

あとは、再審査を促すため、バージョンのみを変更したアプリを再リリース。

再審査の結果、合格となりました。

しばらくは様子見となりそうです。

ファミリーポリシーを遵守するためのAdmob設定

概要

ヒットアンドブローを題材にしたミニゲーム”サムライロード”、
このアプリは対象年齢を10歳以上としており、ファミリーポリシーの遵守が必須です。

そのため、Admobのイニシャル処理とリクエスト処理に子供向け設定を入れていたのですが、アプリの更新審査のタイミングでファミリーポリシー違反となりました。
(ファミリーポリシーを遵守するためのAdmobコーディングについてはこちらの記事。)

なぜ?

Admobの配信カテゴリを設定する

アプリの更新審査に落ちた理由がこちらです。

審査結果通知

Admobから配信されている広告に子供にふさわしくないコンテンツが含まれていた、とのこと。

テレビ、動画、音楽、その他情報配信系の広告を表示するとファミリーポリシー違反となるようです。

そこで、Admob側の設定を変更することにしました。

Google Admob コンソール

まずはGoogle Admobコンソールを表示して広告配信を制御したいアプリを選びます。
そして、メニューの「ブロックのコントロール」を選択。

Google Admob コンソール

次に一般カテゴリを選択し、ふさわしくないと指摘されたテレビ、動画、音楽の配信をブロックしました。

あとは、再審査を促すため、バージョンのみを変更したアプリを再リリース。

再審査の結果、合格となりました。

ファミリーポリシーを遵守するためのAdMobコーディング

概要

Google Playでアプリをリリースする際に設定するアプリの対象年齢(ターゲットユーザー)。

今回はアプリの対象年齢に13歳未満を含める場合に必要となるAdMobのコーディングについて記事にしました。

AdMobに子供向け広告をリクエストする

GooglePlayで設定するアプリの対象年齢は以下のように分かれています。

No対象年齢ファミリー向けプログラム
15歳以下必須
26~8歳必須
39~12歳必須
413~15歳任意
516~17歳任意
618歳以上任意
ターゲットユーザー設定

ターゲットユーザーの設定としては13歳以上か、13歳未満かが大きな分岐点となります。

なぜなら13歳未満をターゲットに含める場合は

ファミリーポリシーを遵守するために子供向けの広告を表示することが求められるからです。

では、子供向けの広告を表示するにはどうすればよいのか?

Admobのヘルプを調べると下記のコードが示されていました。

Bundle extras = new Bundle();
extras.putString("max_ad_content_rating", "G");
AdRequest request = new AdRequest.Builder()
 .addNetworkExtrasBundle(AdMobAdapter.class, extras)
 .tagForChildDirectedTreatment(true) .build();

ただし、これを実際にコーディングしようとしても

tagForChildDirectedTreatmentメソッドが見つかりません

どうしたものかとネット検索してみた結果、タグ指定はイニシャル処理にあわせて実行するのがよさそうだという結論に至りました。

通常のAdMobイニシャル処理

MobileAds.initialize(this)

子供向けのAdMobイニシャル処理

val requestConfiguration = MobileAds.getRequestConfiguration().toBuilder()
    .setTagForChildDirectedTreatment(TAG_FOR_CHILD_DIRECTED_TREATMENT_TRUE)
    .setMaxAdContentRating(MAX_AD_CONTENT_RATING_G)
    .build()
MobileAds.setRequestConfiguration(requestConfiguration)
MobileAds.initialize(this)

子供向けに実装する場合は、イニシャル処理の前に子供向けタグとレーティングGを設定します。

また、AdMob表示のための広告リクエストでもレーティングGを設定しておきます。

通常のバナー広告リクエストと表示処理

val adView : AdView = findViewById(R.id.adView)
val adRequest = AdRequest.Builder().build()
adView.loadAd(adRequest)

子供向けのバナー広告リクエストと表示処理

val adView : AdView = findViewById(R.id.adView)
val extras = Bundle()
extras.putString("max_ad_content_rating", "G")
val adRequest = AdRequest.Builder().addNetworkExtrasBundle(AdMobAdapter::class.java, extras).build()
adView.loadAd(adRequest)

通常のリクエストにレーティング設定を追加すればOKです。

Admobから配信されるカテゴリを制御する方法は以下の記事を参照ください。