審査に出したら「トラッキング情報が無効」と言われた話
初めてのApp Store提出。アーカイブを作って、コマンドラインからアップロードして、審査へ提出。ここまでは何の問題もなく進んだ。ところが数分後、Appleから「バイナリが無効です」という通知と、詳細を伝えるメールが届いた。
ITMS-91064という数字
メールの本文には「ITMS-91064: Invalid tracking information」とあり、続けて「NSPrivacyTracking must be true if NSPrivacyTrackingDomains isn't empty」という一文。プライバシーマニフェスト(`PrivacyInfo.xcprivacy`)というファイルの中の設定が、Appleの検証ルールに違反している、ということだけは分かった。
このアプリでは広告表示のためにGoogleのAdMobを使っていて、広告のためのトラッキング(IDFAの利用)も行っている。だから「トラッキングする」という宣言自体は正しいはずなのに、なぜ弾かれたのか。
4つのマニフェストを全部見比べる
アプリのビルド物の中には、プライバシーマニフェストが4つ含まれていた。自分のメインアプリ用、ウィジェット用、そしてGoogleMobileAds・UserMessagingPlatformという2つの外部SDKが持っているもの。まず疑ったのは外部SDK側だったが、中身を見比べてみると、そちらは特に矛盾は無い。
残るは自分のアプリ本体のファイル。よく見ると「トラッキングする(true)」と書いてある一方で、「トラッキングに使うドメインの一覧」が空の配列になっていた。つまり「トラッキングします」と宣言しているのに、「具体的にどこに繋いでトラッキングするのか」の情報が何も無い、という中途半端な状態だった。
ドメインを書けば直るはず、なのだが
Appleの公式なルールの文言は「ドメインの一覧が空でないなら、トラッキングはtrueでなければならない」という一方向の言い回しだったので、最初はどちらを直すべきか迷った。ただ実際の広告SDKの動作を考えれば「トラッキングをtrueにしたまま、ドメインを埋める」方が正しい対応のはず。AdMobが実際に広告配信のために接続するGoogle系のドメイン(`doubleclick.net`や`googlesyndication.com`など)を、いくつか調べて追加した。
ビルド番号を1つ上げて、同じ手順でもう一度アーカイブ・アップロード。今度は無効判定のメールは来ず、そのまま審査待ちの状態に進んだ。
持ち帰ったこと
- プライバシーマニフェストの矛盾は、自分のアプリのものだけでなく外部SDKのものも含めて、複数のファイルを比較して原因を絞り込む必要がある
- 「トラッキングする」と宣言する場合、対象のドメイン一覧を空にしてはいけない。広告SDKが実際に使っているドメインを調べて明記する
- 審査提出後のエラーメールは、エラーコード(今回は`ITMS-91064`)で検索すると、同じ問題に当たった他の開発者の情報が見つかりやすい