App Store審査リジェクト後の修正・再提出をApp Store Connect APIで実行する

App Store審査でリジェクトされた後のビルド差し替え・スクリーンショット更新・再提出の全工程をApp Store Connect APIで実行した記録

iosappstoreconnectapiflutterautomation

台本(フルテキスト)

動画の掛け合いを書き起こしたものです。音声を再生しづらい場合はこちらをお読みください。

オープニング

  • App Store 審査リジェクト後の修正・再提出を API で実行
  • ブラウザ操作なしで全工程を自動化
つむぎ
今日はどんな内容を紹介するの?
そら
App Store Connect の審査でリジェクトされた後、修正から再提出までの全工程を API で実行した記録を紹介します。
つむぎ
どんなアプリでリジェクトされたの?
そら
JPS Explorer というジャパンサーチの文化資源探索アプリで、初回提出時に 2 つの問題を指摘されました。
つむぎ
どんな問題だったの?
そら
1 つ目はチップ画面でのエラーで、In-App Purchase の商品が App Store Connect に未登録だったためです。2 つ目はカメラ検索のクラッシュで、Info.plist に NSCameraUsageDescription が未設定でした。

修正内容

  • Info.plist にカメラ・写真ライブラリの権限記述を追加
  • IAP 商品未登録時は「準備中」メッセージに変換
つむぎ
カメラのクラッシュはどう修正したの?
そら
Info.plist にカメラと写真ライブラリの権限記述を追加しました。Flutter の image_picker パッケージを使う場合、この記述がないと実機でクラッシュします。シミュレータでは発見できない問題です。
つむぎ
チップ画面はどう修正したの?
そら
In-App Purchase の商品が未登録の場合、StoreKit がエラーを返します。そのエラーをそのまま表示するのではなく、「準備中です」というメッセージに変更しました。
つむぎ
修正後はビルド番号を上げる必要があるの?
そら
はい。リジェクトされたビルドと同じビルド番号では再アップロードできないため、pubspec.yaml のビルド番号を +1 する必要があります。

API による再提出の手順

  • ビルドアップロード → processingState VALID を待つ → 新ビルド紐付け
  • 暗号化コンプライアンス設定後にサブミッション再提出
つむぎ
API での再提出はどんな手順なの?
そら
まず flutter build ipa でビルドしてアップロードします。その後、builds API でビルドの processingState が VALID になるまでポーリングします。
つむぎ
新しいビルドを紐付けるにはどうするの?
そら
appStoreVersions の relationships/build に PATCH リクエストで新しいビルド ID を設定します。その後、暗号化コンプライアンスも新ビルドごとに設定が必要です。
つむぎ
最後の再提出はどうするの?
そら
リジェクト時の UNRESOLVED_ISSUES 状態のサブミッション ID に対して、submitted: true を PATCH で送信します。新しいサブミッションを作る必要はなく、既存のものを再利用します。

タイミングの注意点

  • 再提出直後は「not ready」エラーになる場合がある
  • 数分待って再試行すると成功することが多い
つむぎ
API 操作でハマりやすい点はあるの?
そら
再提出時に「Version is not ready to be submitted yet」エラーが返ることがあります。ビルドの紐付けやスクリーンショットの処理が内部的に完了していない場合に発生するようです。
つむぎ
どうすれば解決するの?
そら
数分待ってから再試行すれば解決しました。App Store Connect のブラウザで「審査準備完了」と表示されるタイミングと、API で提出可能になるタイミングにずれがある場合もあります。
つむぎ
スクリーンショットの差し替えはリジェクト後にできるの?
そら
できます。審査中の WAITING_FOR_REVIEW 状態では変更できなかったスクリーンショットが、リジェクト後は編集可能になります。

まとめ

  • リジェクト後の修正・再提出を App Store Connect API で自動化
  • ブラウザ不要でビルド差し替えから再提出まで完結
つむぎ
今日のポイントをまとめてほしいな。
そら
App Store Connect API を使うことで、ビルドアップロードから再提出まで全工程をブラウザなしで実行できます。
つむぎ
iOS 開発でシミュレータでは気づけない問題もあるのね。
そら
そうです。NSCameraUsageDescription の未設定はシミュレータでは発見できない典型的な問題です。実機でのテストが重要です。
つむぎ
暗号化コンプライアンスは新しいビルドごとに設定が必要なのね。
そら
はい。既設定のビルドに再度設定すると 409 エラーになりますが、これは無視して問題ありません。新ビルドへの設定のみ行えば大丈夫です。