はじめに
個人で出している iOS アプリのうち3本(小学生向けの算数・時計の学習アプリ)は、無料で AdMob の広告を出している。先日、そのうちの1本「単位変換工場」の更新版 1.0.1 を審査に出したところ、人の審査に回る前に却下された。
却下の連絡は「This is an automated message」と始まる、自動の文面だった。理由の要点はこうだ。
App Review Guideline Issue
... may include advertising but you did not select "Yes" for the
"Advertising" content descriptor ...
アプリに広告が入っているのに、年齢制限の申告で「広告」を「はい」にしていない。App Store Connect 上の状態は、審査への提出が UNRESOLVED_ISSUES、版が REJECTED になった。
1.0.0 は同じ設定で通っていた
引っかかったのは、同じアプリの 1.0.0 が、この設定のまま審査を通っていたことだ。広告の入れ方も変えていない。変えたのは名前・キーワード・新機能の欄などの文言で、年齢制限の申告には触っていなかった。
API で ageRatingDeclaration を読むと、いまはこれだけの項目が返ってくる。
advertising, ageAssurance, ageRatingOverride, ageRatingOverrideV2,
alcoholTobaccoOrDrugUseOrReferences, contests, developerAgeRatingInfoUrl,
gambling, gamblingSimulated, gracRatingClassificationNumber,
gunsOrOtherWeapons, healthOrWellnessTopics, horrorOrFearThemes,
kidsAgeBand, koreaAgeRatingOverride, lootBox, matureOrSuggestiveThemes,
medicalOrTreatmentInformation, messagingAndChat, parentalControls,
profanityOrCrudeHumor, sexualContentGraphicAndNudity, sexualContentOrNudity,
socialMedia, socialMediaAgeRestricted, unrestrictedWebAccess,
userGeneratedContent, violenceCartoonOrFantasy, violenceRealistic,
violenceRealisticProlongedGraphicOrSadistic
advertising はその1つだ。1.0.0 のときに自動の解析がこの項目を見ていなかったのか、項目そのものが後から足されたのかは、手元の記録からは分からない。分かっているのは、同じ申告のまま、1.0.0 は通り、1.0.1 は自動で止まったということだけだ。
3本とも「いいえ」だった
却下を受けて、広告を出しているほかの2本(さんすうおじさん・時計を学ぼう)も見た。その時点で、3本とも advertising が false だった。同じ自動の解析が動いているなら、残りの2本も次の更新で止まる。
API で直す
年齢制限の申告は App Store Connect の画面からも直せるが、3本あったので API で直した。順番はこうなる。
-
GET /v1/apps/<アプリのID>/appInfosで、そのアプリの appInfo を取る - 編集できる状態の appInfo の
/ageRatingDeclarationを取り、その ID を控える -
PATCH /v1/ageRatingDeclarations/<ID>にadvertising: trueを送る
{
"data": {
"type": "ageRatingDeclarations",
"id": "<ID>",
"attributes": { "advertising": true }
}
}
直したあと、App Store Connect の画面で年齢区分を確かめた。4+ のまま変わらなかった。「広告」を「はい」にしても、年齢区分が上がるわけではない。
直せるのは「次の版」の appInfo だけ
appInfo は、配信中のものと、次の版の準備中のものが別々にある。配信中の appInfo は編集できない。 直せるのは、審査に出す前か、却下されて差し戻されているものだけだ。
3本の状態は、このときそれぞれ違った。
| アプリ | そのときの状態 | 直したもの |
|---|---|---|
| 単位変換工場 | 1.0.1 が却下中 | 却下中の appInfo |
| さんすうおじさん | 1.0.3 を準備中 | 準備中の appInfo |
| 時計を学ぼう | 配信中のみ | 1.0.2 を作ってから、その appInfo |
時計を学ぼうは、次の版を作るまで直す場所が無かった。
単位変換工場は、その夜に出し直した。このとき、有料 App 契約(Paid Applications Schedule)の更新版への同意も求められて、そちらはアカウントの持ち主が画面で同意してから出し直した。審査待ちに入った版の appInfo は advertising=true になっていて、数日後に配信中になったのを確かめた。
今の状態
その後、配信中の5本の申告を API で読み直した(読み取りだけ)。
時計を学ぼう READY_FOR_SALE advertising=True
SOBAN READY_FOR_SALE advertising=False
バイナリーハンズ READY_FOR_SALE advertising=False
さんすうおじさん READY_FOR_SALE advertising=True
単位変換工場 READY_FOR_SALE advertising=True
広告を出している3本が True、出していない2本(どちらも広告なし)が False。配信中の appInfo に、直した値がそのまま引き継がれている。
提出前の検査に足した
新しいアプリを出すときに使っている提出前の検査スクリプトには、AdMob を使っているアプリに対して、この1行を出すようにした。
AdMob を使うなら ASC の年齢制限指定で「広告」を「はい」にする。
API なら ageRatingDeclarations の advertising=true。年齢区分(4+)は変わらない
広告の SDK が入っているかどうかはソースから分かるが、App Store Connect 側の申告はソースに無い。検査で拾えるのは「確かめろ」という注意までで、値そのものは画面か API で見るしかない。
前の版で通った設定は、正しい設定だと思っていた。通ったのは、その時点の自動の解析が、そこを見ていなかっただけかもしれなかった。