App Store 提出自動化ツール
Fastlane を使用した App Store および Google Play へのアプリ提出、スクリーンショット生成、メタデータ管理、レビュー最適化を自動化するエキスパート。
判断ポイント
段階的ロールアウト vs 全面ロールアウトの使い分け
IF 初回アプリバージョン OR 大規模な機能変更:
└── 段階的ロールアウトを使用: 10% → 50% → 100% を7日間かけて実施
└── 各段階でクラッシュ率とユーザーフィードバックを監視
ELSE IF ホットフィックス OR マイナーアップデート:
└── IF 緊急セキュリティ修正:
└── 即時全面ロールアウト
ELSE:
└── 50% → 100% を2~3日間かけて実施
証明書更新判断マトリックス
| シナリオ | 有効期限までの日数 | アクション |
|---|---|---|
| 配布用証明書 | < 30日 | fastlane match nuke distribution を実行し、再生成 |
| 開発用証明書 | < 30日 | fastlane match nuke development を実行 |
| プロビジョニングプロファイル | < 14日 | force_for_new_devices: true を付けて match を実行 |
| プッシュ通知証明書 | < 30日 | Apple Developer Portal で再生成し、サーバーを更新 |
提出タイプの選択
IF 内部テストが必要:
├── iOS: TestFlight 外部グループを使用(最大10,000テスター)
└── Android: 内部トラックを使用(最大100テスター)
ELSE IF 公開ベータ:
├── iOS: TestFlight 公開リンクを使用
└── Android: オプトインURL付きのクローズドトラックを使用
ELSE IF プロダクション準備完了:
├── すべてのストア要件を満たしているか確認(品質ゲートを参照)
└── プロダクション/リリーストラックを使用
障害モード
Match 認証情報の不一致
- 症状: 「証明書が見つかりません」または「プロファイルが証明書と一致しません」
- 診断: Git リポジトリの同期ずれ、またはチームメンバーが手動で証明書を生成した
- 修正:
fastlane match nukeを実行し、すべての証明書を再生成して match リポジトリにコミット
アプリアップデート却下 – 情報不足
- 症状: 「アプリをレビューするために追加情報が必要です」
- 診断: デモ用認証情報、連絡先情報、レビューノートが不足
- 修正: fastlane/metadata/review_information/ に demo_user.txt、demo_password.txt、詳細な notes.txt を追加
大規模アプリでのビルドタイムアウト
- 症状:
build_appステップ中に Fastlane がタイムアウト - 診断: アプリサイズが2GB超、または複雑なビルドプロセス
- 修正: build_app アクションに
build_timeout: 7200を追加し、インクリメンタルビルドを有効化
スクリーンショット生成の失敗
- 症状: snapshot/screengrab が空白または不正なスクリーンショットを生成
- 診断: UI テストがアニメーションを待機していない、または誤ったシミュレーターを使用
- 修正: UI テストに明示的な待機を追加し、シミュレーター名が Snapfile のデバイスリストと一致することを確認
メタデータ文字数制限超過
- 症状: 「説明が長すぎます」エラーでアップロードが失敗
- 診断: ローカライズされたメタデータがプラットフォームの制限を超過(App Store: 4000文字、Play Store: 4000文字)
- 修正: 提出前に
fastlane precheckを実行し、説明文をプラットフォーム制限内にトリミング
動作例
シナリオ: iOS と Android ターゲットを持つ React Native アプリの自動提出設定
初期評価:
- アプリは既存の手動提出プロセスを使用
- 4名の開発者チームが共有コード署名を必要とする
- 段階的ロールアウトとスクリーンショット自動化の要件
ステップ 1: 設定の決定
# プロジェクトルートで
fastlane init
# オプション4(手動設定)を選択
判断ポイント到達: 証明書管理戦略
- 初心者の選択: Xcode の自動署名を使用(CI で失敗)
- エキスパートの選択: チーム全体の証明書共有のために match をセットアップ
ステップ 2: Match を設定
# fastlane/Matchfile
git_url("https://github.com/company/certificates")
storage_mode("git")
type("appstore") # 他に development、adhoc もサポート
ステップ 3: レーンを作成(重要な判断: ベータ vs プロダクション)
# fastlane/Fastfile
desc "ビルド番号インクリメント付き TestFlight 提出"
lane :beta do
setup_ci if ENV['CI']
match(type: "appstore", readonly: true)
# 判断: ビルド番号は常にインクリメント、バージョン番号はリリース時のみ
increment_build_number(build_number: ENV['BUILD_NUMBER'])
build_app(workspace: "ios/MyApp.xcworkspace", scheme: "MyApp")
upload_to_testflight(skip_waiting_for_build_processing: true)
end
エキスパートの洞察: CI ではタイムアウトを避けるために常に skip_waiting_for_build_processing: true を使用する
ステップ 4: 初回実行前の検証
fastlane precheckを実行してメタデータを検証- 完全なスクリーンショット自動化の前に単一デバイスでテスト
- CI 環境が正しい Xcode バージョンであることを確認
結果: 提出時間を45分から8分に短縮する自動化パイプライン
品質ゲート
プロダクションレーンを実行する前に通過しなければならない提出前チェックリスト:
-
fastlane precheckが警告なしでパスすること - 必要なすべてのメタデータファイルが fastlane/metadata/[locale]/ に存在すること
- すべての必須デバイスサイズ(iPhone 6.9", 6.3", iPad 13")のスクリーンショットが生成されていること
- バージョン番号が前回リリースからインクリメントされていること
- ビルド番号が一意であり、TestFlight の最新より大きいこと
- コード署名証明書の有効期限が30日以上あること
- デモ認証情報が review_information/ に提供されていること(アプリがログインを必要とする場合)
- 段階的ロールアウトの割合が設定されていること(10%から開始を推奨)
- CI 環境変数が設定されていること: FASTLANE_USER、MATCH_PASSWORD、FASTLANE_SESSION
- ターゲット市場のすべてのローカライゼーションが完了していること
- アプリアイコンと必要なアセットが正しいフォーマットで存在すること
対象外の境界
このスキルを以下の用途に使用しないでください:
-
CI/CD パイプラインのセットアップ → 代わりに
github-actions-pipeline-builderを使用- このスキルは CI が存在することを前提としており、ワークフロー/パイプラインを作成しません
-
アプリアーキテクチャの決定 → 代わりに
react-native-architectを使用- このスキルはデプロイメントを処理し、コード構造やナビゲーションは扱いません
-
分析とクラッシュレポーティング → 代わりに
mobile-analytics-crash-reporting-expertを使用- このスキルはストア提出に焦点を当てており、リリース後の監視は扱いません
-
App Store Optimization (ASO) → 専任の ASO スペシャリストを使用
- このスキルは技術的な提出を処理し、キーワード最適化やコンバージョンは扱いません
-
バックエンド API 開発 → 代わりに
api-architectを使用- このスキルはアプリのバックエンドがプロダクション準備完了であることを前提とします
委譲すべき場合:
- ビルド設定の問題 →
react-native-architect - ゼロからの CI/CD セットアップ →
github-actions-pipeline-builder - アプリパフォーマンス監視 →
mobile-analytics-crash-reporting-expert