アップロードしたのに配信されない・弾かれる iOS ビルドの3つの原因
公開済みアプリに新ビルドを上げたら version closed で弾かれる、TestFlight が Missing Compliance で止まる、prebuild 後のアーカイブが codegen 欠落で落ちる。アップロード周りで詰まる3つを実例でまとめる。
ビルドのアップロードは、成功したように見えて先に進まないことが多い。弾かれる・配信保留になる・そもそもアーカイブが作れない。原因が分かれている3つをまとめる。
1. 公開済みバージョンに新ビルドを上げると弾かれる
事象
すでに App Store で公開済みのアプリに、TestFlight 配信用の新しいビルドを上げると、次のエラーで弾かれる。
Invalid Pre-Release Train. The train version '1.0.0' is closed for new build submissions
または「より大きいバージョンを含める必要があります(must contain a higher version)」と言われる。ビルド番号は上げているのに通らない。
原因
ビルド番号(CFBundleVersion)だけ上げてもダメだ。すでに承認・公開済みのバージョン番号(例:1.0.0)は「トレイン」が閉じていて、そこへは TestFlight 用でも新しいビルドを足せない。
上げるべきはマーケティングバージョン(CFBundleShortVersionString)の方だ(1.0.0 → 1.0.1)。
解決策
マーケティングバージョンを上げる。Expo / React Native なら3か所を揃える。
app.jsonのexpo.versionInfo.plistのCFBundleShortVersionStringproject.pbxprojのMARKETING_VERSION
どれかがズレていると、ビルド側とメタデータ側で食い違ってまた弾かれる。1.0.1 で揃えてから再アーカイブする。
2. TestFlight が Missing Compliance で止まる
事象
アップロード自体は成功したのに、ビルドが「コンプライアンス情報がありません(Missing Compliance)」の状態で配信保留になる。標準の HTTPS しか使っていないアプリでも起きる。
原因
ITSAppUsesNonExemptEncryption を設定していないと、輸出コンプライアンスの回答が未入力扱いになり、配信が止まる。毎回 Web 画面で「いいえ」を押せば進むが、ビルドのたびに手作業になる。
解決策
App Store Connect API(ASC API)で自動解除できる。.p8 鍵から ES256 の JWT を作り、対象ビルドに PATCH を投げる。
PATCH /v1/builds/{id}
{
"data": {
"type": "builds",
"id": "{id}",
"attributes": { "usesNonExemptEncryption": false }
}
}
これで以後の配信が進む。恒久対策は、そもそも回答を焼き込んでおくこと。Expo なら app.json に書く。
{
"expo": {
"ios": {
"infoPlist": { "ITSAppUsesNonExemptEncryption": false }
}
}
}
焼き込んでおけば、次のビルドからは Missing Compliance 自体が出ない。
3. prebuild 後のアーカイブが codegen 欠落で落ちる
事象
app.json を変えて expo prebuild したあと、アーカイブが「Build input file cannot be found」で落ちる。欠けていると言われるのは React Native のコード生成物だ。
Build input file cannot be found:
'.../ios/build/generated/ios/.../ComponentDescriptors.cpp'
RCTAppDependencyProvider.mm が無い、といったメッセージも同じ系統だ。
原因
expo prebuild は既存の ios/ ディレクトリを再利用する。このとき React Native の codegen 生成物(ios/build/generated)が古いまま残り、新しい構成と食い違ってアーカイブが入力ファイルを見失う。
解決策
欠けたファイルを1つずつ補おうとしない。ios/ を作り直す。
npx expo prebuild --clean
--clean を付けると ios/ を再生成し、pod install まで通してくれる。codegen 生成物も作り直されるので、入力ファイル欠落が解消する。
補足
- 2と3は、
app.jsonへの焼き込み(ITSAppUsesNonExemptEncryption/ クリーンなprebuild)で「次回から起きない」状態にできる。その場しのぎの手作業を繰り返さないこと - ASC API は
.p8鍵さえあれば JWT を自作して叩ける。ビルドの処理状況(processingState)の確認にも同じ仕組みが使えるので、一度組んでおくと Web 画面を見に行く回数が減る
※ 本記事にはアフィリエイトリンクが含まれます。