Fragments of verbose memory

冗長な記憶の断片 - Web技術のメモをほぼ毎日更新

Feb 15, 2026 - 日記

Greenlight: App Store提出前に拒否リスクをローカルで検知するCLI

Greenlight: App Store提出前に拒否リスクをローカルで検知するCLI cover image

App Storeの審査で拒否されると、修正→再提出→再審査のサイクルで数日から数週間のロスが発生します。プライバシーポリシーの不備、必須APIの説明不足、禁止されたAPIの使用など、拒否理由は多岐にわたり、事前に気づくのは困難です。

Greenlight は、提出前にこれらの拒否リスクをローカル環境で検知するオープンソースのCLIツールです。ソースコード、プライバシーマニフェスト、IPAバイナリ、App Store Connectのメタデータを解析し、Appleの審査ガイドラインに違反する可能性のある問題を事前に発見します。

Greenlightとは?

Greenlightは、RevylAI が開発したApp Store提出前のコンプライアンススキャナーです。主な特徴は以下の通りです。

  • 完全オフライン動作: アカウント登録不要、ファイルのアップロード不要
  • 包括的なスキャン: コード、プライバシーマニフェスト、バイナリ、メタデータを一括検査
  • 高速: 1秒以内に全スキャン完了
  • CI/CD統合: JSON/JUnit形式の出力でパイプラインに組み込み可能
  • AI連携: Claude Code/Codexスキルとして、問題の自動修正が可能

インストール

前提条件

  • macOS : Homebrew経由でのインストールが推奨
  • Go : 1.21以上(Go経由でインストールする場合)

手順

Homebrewを使用する場合(macOS)、以下のコマンドでRevylAIのtapからGreenlightをインストールします。

1
brew install revylai/tap/greenlight

インストール後、greenlight --versionでバージョンを確認できます。

Go経由でインストールする場合:

1
go install github.com/RevylAI/greenlight/cmd/greenlight@latest

ソースからビルドする場合:

1
2
3
git clone https://github.com/RevylAI/greenlight.git
cd greenlight && make build
# バイナリは build/greenlight に生成されます

基本的な使い方

すべてのスキャンを一度に実行

preflightコマンドで、すべてのスキャナーを並列実行します。

1
2
3
4
5
6
7
8
# カレントディレクトリをスキャン
greenlight preflight .

# IPAバイナリを含めてスキャン
greenlight preflight . --ipa build.ipa

# JSON形式で出力(CI/CD向け)
greenlight preflight . --format json --output report.json

このコマンドは、以下の4つのスキャナーを実行します。

スキャナー検査内容
metadataapp.json / Info.plist: アプリ名、バージョン、バンドルID形式、アイコン、プライバシーポリシーURL、目的文字列
codescan30種類以上のコードパターン: プライベートAPI、シークレット、決済違反、ATT(App Tracking Transparency、アプリ追跡の透明性)欠落、ソーシャルログイン、プレースホルダー
privacyPrivacyInfo.xcprivacy の完全性、Required Reason APIs、トラッキングSDK vs ATT実装
ipaバイナリ: Info.plistキー、起動ストーリーボード、アプリアイコン、アプリサイズ、フレームワークのプライバシーマニフェスト

コードスキャンのみ実行

ソースコードのみをスキャンする場合は、codescanコマンドを使用します。

1
greenlight codescan /path/to/project

このコマンドは、Swift、Objective-C、React Native、Expoプロジェクトを対象に、以下のような問題を検出します。

  • プライベートAPIの使用(§2.5.1)— CRITICAL
  • ハードコードされたシークレット/APIキー(§1.6)— CRITICAL
  • デジタル商品の外部決済(§3.1.1)— CRITICAL
  • 動的コード実行(§2.5.2)— CRITICAL
  • 暗号通貨マイニング(§3.1.5)— CRITICAL
  • ソーシャルログイン使用時のSign in with Apple欠落(§4.8)
  • IAP(In-App Purchase、アプリ内課金)使用時のRestore Purchases欠落(§3.1.1)
  • 広告/トラッキングSDK使用時のATT(App Tracking Transparency)欠落(§5.1.2)
  • アカウント作成時の削除オプション欠落(§5.1.1)
  • 文字列内のプレースホルダーコンテンツ(§2.1)
  • 競合プラットフォームへの言及(§2.3)
  • ハードコードされたIPv4アドレス(§2.5)
  • 安全でないHTTP URL(§1.6)
  • 曖昧なInfo.plist目的文字列(§5.1.1)
  • Expo設定の問題(§2.1)

プライバシーマニフェストの検証

プライバシー関連のコンプライアンスのみをスキャンする場合:

1
greenlight privacy /path/to/project

このコマンドは、以下を検証します。

  • PrivacyInfo.xcprivacy (プライバシーマニフェストファイル)の存在と適切な設定
  • コード内で検出されたRequired Reason APIとマニフェストの宣言の一致
  • トラッキングSDKの検出とATT実装の有無
  • すべての項目を自動的にクロスリファレンス

IPAバイナリの検査

ビルド済みのIPAファイルを検査する場合:

1
greenlight ipa /path/to/build.ipa

このコマンドは、以下を検査します。

  • PrivacyInfo.xcprivacyの存在
  • Info.plistの完全性と目的文字列の品質
  • App Transport Securityの設定
  • アプリアイコンの存在とサイズ
  • 起動ストーリーボードの存在
  • アプリサイズ(200MBのセルラーダウンロード制限との比較)
  • 埋め込まれたフレームワークのプライバシーマニフェスト

App Store Connectのチェック

App Store Connectに登録済みのアプリをAPIで検査する場合:

1
2
3
4
5
6
7
8
# 初回のみ: APIキーの設定
greenlight auth setup

# または: Apple IDでサインイン
greenlight auth login

# すべてのティアを実行
greenlight scan --app-id 6758967212

このコマンドは、以下をチェックします。

  • メタデータの完全性(説明、キーワード、URL)
  • 必須デバイスサイズのスクリーンショット検証
  • ビルド処理ステータス
  • 年齢制限と暗号化コンプライアンス
  • コンテンツ分析(プラットフォーム言及、プレースホルダー)

応用例: CI/CDパイプラインへの統合

GitHub Actionsでの使用例:

1
2
3
4
5
6
7
8
- name: App Store compliance check
  run: |
    greenlight preflight . --format json --output greenlight-report.json
    # CRITICALな問題が見つかった場合はパイプラインを失敗させる
    if jq -e '.summary.critical > 0' greenlight-report.json > /dev/null; then
      echo "CRITICAL issues found — fix before submission"
      exit 1
    fi

JUnit形式での出力(scanコマンドのみ対応):

1
greenlight scan --app-id $APP_ID --format junit --output greenlight.xml

Claude Code/Codexスキルとの連携

Greenlightは、Claude CodeやCodexのスキルとして使用でき、AIが問題を自動修正します。

Claude Codeでの設定

プロジェクトの.claude/ディレクトリにスキルファイルを配置します。

1
2
3
# スキルファイルをコピー
mkdir -p .claude/skills
cp /path/to/greenlight/SKILL.md .claude/skills/greenlight.md

その後、Claudeに以下のように指示します。

Run greenlight preflight and fix everything until it passes

Claudeは以下の手順を実行します。

  1. greenlight preflight .を実行
  2. すべての検出結果を読み取り
  3. 各問題を修正(CRITICAL → WARN → INFOの順)
  4. 再実行し、GREENLITになるまで繰り返し

Codexでの設定

Codex-native スキルパッケージを使用する場合:

1
2
mkdir -p ~/.codex/skills/app-store-preflight-compliance
cp -R codex-skill/* ~/.codex/skills/app-store-preflight-compliance/

Codexで以下のように呼び出します。

Use $app-store-preflight-compliance to run Greenlight preflight and fix all findings until GREENLIT.

注意点

以下の点に注意が必要です。

  • App Store Connect APIの使用: greenlight scanコマンドは、App Store Connect APIキーまたはApple IDが必要です
  • オフライン動作の制限: preflightcodescanprivacyipaコマンドは完全オフラインですが、scanコマンドはネットワーク接続が必要です
  • 検出精度: 静的解析のため、実行時にのみ発生する問題は検出できません
  • ガイドライン更新: Appleの審査ガイドラインは頻繁に更新されるため、Greenlightも定期的にアップデートする必要があります

まとめ

Greenlightは、App Store提出前の拒否リスクを事前に検知する強力なツールです。完全オフラインで動作し、1秒以内に包括的なスキャンを完了します。CI/CDパイプラインへの統合やAIとの連携により、開発フローに組み込むことで、審査の手戻りを大幅に削減できます。

iOSアプリ開発者の方は、ぜひ試してみてください。

参考リンク