RORK LABEN
TOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しましたTOOLING — Rorkの開発者向けリポジトリが動き続けています。rork-xcodeが7月16日、rork-deviceが7月15日、rork-plistが7月13日に更新されましたOPUS46 — RorkでClaude Opus 4.6が稼働しています。Rork MaxはClaude Codeを土台にアプリを組み立てる設計ですSIM — ブラウザ上で動くクラウドのiOSシミュレータを備え、実機へのインストールは1クリック、App Storeへの提出は2クリックと案内されていますMAX — Rork MaxはReact Nativeではなく純粋なSwiftを出力します。iPhone・iPad・Apple Watch・Apple TV・Vision Pro、そしてiMessageまでが射程ですNATIVE — HealthKit、ARKitとLiDAR、NFC、Dynamic Island、Live Activities、Metalによる3D、Core MLのオンデバイス推論まで扱えますSEED — RorkはLeft Lane Capitalが主導する1,500万ドルのシードラウンドを実施し、Peak XVとa16z Speedrunが参加しました
記事一覧/開発ツール
開発ツール/2026-04-07上級

Google Play の審査で Rork アプリが止まる場所 — AD_ID の混入・権限マージ・12人のクローズドテスト

Rork で生成した Expo アプリが Google Play で止まるとき、原因は書いた覚えのない権限にあることが多くあります。マージ後の AndroidManifest を確定させる手順、AD_ID を宣言する側と外す側の判断、12人・14日のクローズドテストの回し方をまとめました。

Google Play21Android43Rork515Expo149AD_ID権限7審査8

プレミアム記事

22時を回った頃、Play Console から一通のメールが届きました。件名は「ポリシーの問題」。

本文には、どのファイルの何行目が悪いとは書かれていません。書いてあるのは条項名と、ポリシーページへのリンクだけです。

個人開発でアプリを出していると、この一通で夜の予定が消えます。私自身、最初の数回は Play Console の画面を行ったり来たりするだけで時間を使ってしまいました。

やがて分かったのは、Rork で生成した Expo アプリが Google Play で止まる場所は、思っているより限られているということです。そしてその多くが、自分では書いた覚えのない場所にあります。


通知メールは、原因の場所を教えてくれない

まず押さえておきたいのは、通知メールと Play Console の表示は「結果」であって「原因」ではないという点です。

確認すべき場所は決まっています。

Google Play Console → [アプリ名] → ポリシーとプログラム → アプリのコンテンツ
Google Play Console → [アプリ名] → ポリシーとプログラム → ポリシーのステータス

ここで大切なのは、違反条項のリンクを必ず開くことです。メール本文の要約は短すぎて、条項のどの部分に触れたのかが読み取れません。リンク先のポリシーページには、対象となる条件と例外が具体的に書かれています。

私が習慣にしているのは、リンク先のページを開いたら、自分のアプリが「該当する」と判断された条件を一文で書き出すことです。

  • ❌「広告ポリシーに違反した」
  • ⭕「全画面広告を、ユーザーが操作を開始していない画面遷移中に表示した」

後者まで落とし込めないうちは、まだ原因を掴めていません。この一文が書けないまま修正を始めると、直したつもりの箇所が的外れで、再申請でまた同じ条項に当たります。


app.json に書いた権限リストは、権限を減らしてくれない

Rork で生成した Expo アプリで最も多いのが、権限まわりです。そして、ここには構造的な誤解があります。

app.jsonandroid.permissions を短く書き直せば権限が減ると考えてしまうのですが、これは正しくありません。

// app.json — これは「追加するもの」の指定であって、除去の指定ではありません
{
  "expo": {
    "android": {
      "permissions": ["INTERNET", "VIBRATE"]
    }
  }
}

Expo のビルドでは、依存ライブラリがそれぞれ自前の AndroidManifest.xml や config plugin を持っていて、ビルド時にそれらがマージされます。マージで入ってくる権限は、permissions 配列を短くしても消えません。

消すための指定は別にあります。

// app.json — ライブラリが差し込む権限を明示的に取り除く
{
  "expo": {
    "android": {
      "permissions": ["INTERNET", "VIBRATE"],
      "blockedPermissions": [
        "android.permission.RECORD_AUDIO",
        "android.permission.ACCESS_FINE_LOCATION",
        "com.google.android.gms.permission.AD_ID"
      ]
    }
  }
}

blockedPermissions は、マージ時に tools:node="remove" を付けて権限を打ち消す指定です。ポイントは、短縮名ではなく完全修飾名で書くことpermissions 側は "RECORD_AUDIO" のような短縮名を受け付けますが、blockedPermissions"android.permission.RECORD_AUDIO" まで書かないと一致しません。ここで静かに効かないケースをよく見ます。

誰がその権限を入れたのかを、推測せずに突き止める

権限を消す前に、まず「今どうなっているか」を確定させます。憶測で blockedPermissions に並べても、外れていれば時間が溶けるだけです。

Gradle のマニフェストマージャーは、マージの経過をレポートとして残します。

npx expo prebuild -p android
cd android && ./gradlew :app:processReleaseManifest
 
# どのライブラリがどの権限を注入したかが行単位で残っています
grep -n "AD_ID" app/build/outputs/logs/manifest-merger-release-report.txt

このレポートには ADDED from [com.google.android.gms:play-services-ads:...] AndroidManifest.xml:26:5-84 のような形で、注入元のライブラリと行番号が出ます。ここまで見て初めて、消すべきか残すべきかを判断できます。

出来上がった AAB 側から確認する方法もあります。

# 実際に配布される成果物に何が焼き込まれたかを見る
bundletool build-apks --bundle=app-release.aab --output=app.apks --mode=universal
unzip -o app.apks -d apks_out
aapt2 dump permissions apks_out/universal.apk

私は再申請の直前に、必ずこちらを通しています。設定ファイルを直したことと、成果物がそうなっていることは別だからです。EAS Build のキャッシュが効いていて、直したはずの blockedPermissions が反映されていなかった、ということが実際にありました。

確認したいこと見る場所分かること
自分が書いた権限android/app/src/main/AndroidManifest.xmlprebuild 後の自アプリ分のみ
誰が注入したかmanifest-merger-release-report.txt注入元ライブラリと行番号
最終的にどうなったかAAB を aapt2 dump permissions配布物に焼き込まれた実体

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
app.json の permissions では消えない権限を blockedPermissions とマージレポートで確定させる手順
AD_ID を宣言する側と外す側の判断表 — 対象年齢と Families ポリシーの分岐点
新規の個人アカウントに課される 12人・14日のクローズドテストを止めずに回す運用
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-29
写真の「選択した項目だけ許可」に正しく向き合う設計
iOS の写真ライブラリ限定アクセス(選択した項目だけ許可)に Rork(Expo)アプリで正しく対応します。フルアクセス・限定・拒否の3状態の判定、選んだ写真だけを扱う前提の画面設計、追加選択を促す導線までを実装コードとともに整理します。
開発ツール2026-05-14
Android 13 以降で Rork アプリのプッシュ通知が届かない — POST_NOTIFICATIONS 権限の追加手順
Android 13(API 33)以降でプッシュ通知が届かない原因は、POST_NOTIFICATIONS 権限の追加漏れです。Rork 生成コードへの追加手順を Before/After で解説します。
開発ツール2026-05-12
Rork アプリが「データセーフティ」未入力でGoogle Playにリジェクトされたときの直し方
Google PlayのデータセーフティセクションをRorkアプリ向けに正しく記入する手順を解説。AdMob・Firebase・RevenueCatなど主要SDKが収集するデータの申告漏れパターンと対処法。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →