ATTが表示されないことを理由にiOSアプリが却下された件
app_tracking_transparency
というパッケージでATTを表示するようにしていたのだが、12月にアプリを更新しようとしたところ、ATTの表示が確認できないということでiOSアプリが却下された。
Guideline 2.1 - Information Needed
We're looking forward to completing our review, but we need more information to continue. Your app uses the AppTrackingTransparency framework, but we are unable to locate the App Tracking Transparency permission request when reviewed on iOS 17.2.
App Reviewでのメッセージより
この文章での却下は今までにもあり、どこにATT許可リクエストが表示されるかを「App Reviewに関する情報」のメモのところに書いて再提出すると審査が通ってきていた。
(メモだけでだめな場合は、動画も添付すると審査が通ったこともあった)。
ただ、今回はすでにそうした手順を踏んだアプリであったため、すでに上記のメモや動画を添付していた。
もしかしたら、App ReviewでのメッセージにあるiOS 17.2では表示されてないのかな?と思い、iOS 17.2でのSimulatorでATT表示を確認することに。
しかし、ATTダイアログは表示された。
一旦、このSimulatorでATTダイアログ表示される動画を、App Reviewでのメッセージの返信に添付することに。
しかし、App Reviewからは最初と同じメッセージが返ってきた。。
調べてみると、Testflight経由だと表示されない場合があるらしい。
ということで、すでに動画添付してるしTestflightの問題かもしれないよ~という趣旨の内容を、上記リンクとともにApp Reviewに返信してみた。
すると、今回は文章が異なる返信が返ってきた。
ただ、内容自体は、ドキュメントを参照して正しく実装してくださいとのこと。
そこで、app_tracking_transparency
のissuesを見てみると、以下のissueがあった。
この方の場合は、ATTの表示前にdelayed処理を入れて解決したらしい。
ただ個人的にこれって根本的な解決なのか?っていう感想があり、特に急ぎの更新でもなかったため一旦この問題から手を引くことに。
そうこうしているうちに、AdMobのGDPR対応の期限が来ていた。
一応自動でGDPRメッセージが表示されるようになるらしいが(インタースティシャル広告やアプリ起動時広告表示時に?)、自分でGDPRの設定をしたほうがアプリアイコンが表示されたりちゃんとアプリ起動時にGDPRメッセージを表示できたりするらしい。
ということで、FlutterでのGDPRメッセージの実装方法を調べると、GDPRメッセージを表示するフローの一部として、追加のAPIの呼び出しなくATTダイアログを表示することができるとのこと。
そこで、app_tracking_transparency
の使用をやめて、上記リンクの方法でATTも表示することに。
手順(すでにapp_tracking_transparency
でATTの実装をしていた前提、詳細は上のリンクを参照)
- AdMob管理画面の「プライバシーとメッセージ」のところから「欧州の規制」と「IDFA説明メッセージ」それぞれでメッセージを作成し公開
-
app_tracking_transparency
とそれ関連のコードを削除 - Xcodeでプロジェクトを開き、Generalタブ内のFrameworksで
AppTrackingTreansparency.framework
を追加 - 下記コードを追加し、ATTを表示させていたところに
gdpr()
を追加
void loadForm() {
ConsentForm.loadConsentForm(
(ConsentForm consentForm) async {
var status = await ConsentInformation.instance.getConsentStatus();
if (status == ConsentStatus.required) {
consentForm.show(
(FormError? formError) {
// Handle dismissal by reloading form
loadForm();
},
);
}
},
(FormError formError) {
// Handle the error
},
);
}
Future<void> gdpr() async {
//TODO: for debug
/* ConsentInformation.instance.reset();
ConsentDebugSettings debugSettings = ConsentDebugSettings(
debugGeography: DebugGeography.debugGeographyEea,
//testIdentifiers: [],
);
final ConsentRequestParameters params = ConsentRequestParameters(
consentDebugSettings: debugSettings,
); */
//for debug end
final ConsentRequestParameters params = ConsentRequestParameters();
ConsentInformation.instance.requestConsentInfoUpdate(
params,
() async {
if (await ConsentInformation.instance.isConsentFormAvailable()) {
loadForm();
}
},
(FormError error) {
// Handle the error
},
);
}
注意点
- SimulatorなどでGDPR表示を確認するには、
//for debug
のところのコメントアウトを外し、下の競合するparams
変数の行をコメントアウトする。なお、Android Emulatorで表示を確認する場合は、testIdentifiers
にテストデバイスIDを指定する必要があるらしい(情報元)(私はテストデバイスIDの指定方法がよくわからなくなったのでAndroid Emulatorでの表示確認は見送りました;;)。 - AdMob管理画面でのメッセージ作成のところで、アプリを追加することを忘れないように
- 表示されるメッセージを多言語対応にするには、メッセージ作成ページの「デフォルトの言語」の下にある「別の言語」で対応したい言語にチェックする
- GDPRメッセージが表示されるか否かで、ATTメッセージの表示形式が変化する。GDPRメッセージが表示されない場合は、AdMob管理画面で設定したIDFA説明メッセージが表示された後にATTダイアログが表示される。GDPRメッセージが表示される場合は、GDPRの同意ボタンを押すと、IDFA説明メッセージが表示されずにATTダイアログが表示される。(※ここでいうATTダイアログとは、
Info.plist
のNSUserTrackingUsageDescription
で設定した文が表示されるダイアログのこと)
これでApp Store Connectから審査に提出したところ、何事もなかったかのように審査に通過した。
なお、今回はATTメッセージの表示問題を優先的に解決するため、GDPRメッセージの表示自体は公式ページを参考に簡単に実装した。
より詳しくGDPRメッセージの実装方法について知りたい方は以下のリンクが参考になると思います。