経緯
Flutter 3.7.x -> 3.10.x への環境移行を実施中、
ビルドした ipa ファイルが AppStoreConnect にアップロードできない問題にあたりました。
ローカル環境でのビルド・実機起動は確認できています。
-
flutter-build-ipa
にて ipa ファイルをビルド完了 - fastlane deliver_testflight を実施
- 無限に待ち状態から脱せない:
Waiting for the build to show up in the build list - this may take a few minutes (check your email for processing issues if this continues)
後述の手順で fastlane に頼らずアップロードするも、原因と思しき事象に変化なし。
環境情報
# Apple M1 Pro 32GB RAM
# OS Ventura 13.1
$ xcodebuild -version
Xcode 14.3.1
Build version 14E300b
$ fvm flutter --version
Flutter 3.10.1 • channel stable • https://github.com/flutter/flutter.git
Framework • revision d3d8effc68 (7 days ago) • 2023-05-16 17:59:05 -0700
Engine • revision b4fb11214d
Tools • Dart 3.0.1 • DevTools 2.23.1
結果と顛末
実施内容をすべて経ても、AppStoreConnectユーザーである立場からアクセスできる範囲でこの問題を解決できる情報にアクセスできなかったため、未解決。
もうこの他にできることは無いはず。
ということで、手詰まりなので、
現在 AppStore サポートにランボー怒りの問い合わせ中。
Xcode きやいッ。
実施内容: 出来得る限りプレーンな手順でのビルドとアップロード
flutter-build-ipa
flutter build ipa --verbose --build-number=${BUILD_NUMBER} --target lib/main.dart --export-options-plist=ios/ExportOptionsDevelopment.plist ...
[+29473 ms] Exported Runner to: /Users/****/Workspace/my-flutter-app/build/ios/ipa
** EXPORT SUCCEEDED **
ipa ファイルの validate
不正な ipa ファイルが生成されてしまったことを疑い、 validate-app を実行
xcrun altool --validate-app -f /Users/****/Workspace/my-flutter-app/build/ios/ipa/my-flutter-app.ipa --type ios --show-progress --output-format json --username **** --password ****
なお、この場合の username は AppleID で、 password は application password を発行して実施
不正な ipa ファイルの場合の結果
古いビルド番号でビルドしていたとき、 validate が失敗することを確認した
{
"tool-version": "6.315.14315",
"tool-path": "/Applications/Xcode-14.3.1-Release.Candidate.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework",
"os-version": "13.1.0",
"product-errors": [
{
"message": "The provided entity includes an attribute with a value that has already been used",
"userInfo": {
"NSUnderlyingError": "Error Domain=IrisAPI Code=-19241 \"The provided entity includes an attribute with a value that has already been used\" UserInfo={status=409, detail=The bundle version must be higher than the previously uploaded version., source={\n pointer = \"/data/attributes/cfBundleVersion\";\n}, id=****, code=ENTITY_ERROR.ATTRIBUTE.INVALID.DUPLICATE, title=The provided entity includes an attribute with a value that has already been used, meta={\n previousBundleVersion = 5048;\n}, NSLocalizedDescription=The provided entity includes an attribute with a value that has already been used, NSLocalizedFailureReason=The bundle version must be higher than the previously uploaded version.}",
"NSLocalizedDescription": "The provided entity includes an attribute with a value that has already been used",
"previousBundleVersion": "5048",
"iris-code": "ENTITY_ERROR.ATTRIBUTE.INVALID.DUPLICATE",
"NSLocalizedFailureReason": "The bundle version must be higher than the previously uploaded version: '5048'. (ID: ****)"
},
"code": -19232
}
]
}
正しい ipa ファイルの場合の結果
{
"tool-version": "6.315.14315",
"tool-path": "/Applications/Xcode-14.3.1-Release.Candidate.app/Contents/SharedFrameworks/ContentDeliveryServices.framework/Versions/A/Frameworks/AppStoreService.framework",
"success-message": "No errors validating archive at '/Users/****/Workspace/my-flytter-app/build/ios/ipa/my-flutter-app.ipa'.",
"os-version": "13.1.0"
}
TestFlight へのアップロード
xcrun altool --upload-app --type ios -f /Users/****/Workspace/my-flutter-app/build/ios/ipa/my-flutter-app.ipa --username **** --password ****
2023-05-24 13:15:18.279 INFO: [ContentDelivery.Uploader] Received build ID: ****
...
2023-05-24 13:17:32.103 INFO: [ContentDelivery.Uploader]
================
UPLOAD SUCCEEDED
Delivery UUID: ****
Transferred 131059963 bytes in 10.607 seconds (12.4MB/s)
================
No errors uploading '/Users/****/Workspace/my-flutter-app/build/ios/ipa/my-flutter-app.ipa'
アップロード自体は受け付けられている。
実際に、このときアップロードしたバージョンが AppStore に(一時的に)表示されることを確認できている。
5~10分程度時間経過すると、当該バージョンは非表示になる。
どうやら、AppStore 内部的に何らかの理由で受け付けられていないらしい。
AppStoreConnect API でのビルドの確認
curl -X GET 'https://api.appstoreconnect.apple.com/v1/builds?filter[app]=****' --header 'Authorization: Bearer APP_STORE_CONNECT_TOKEN'
curl -X GET 'https://api.appstoreconnect.apple.com/v1/builds/BUILD_ID' --header 'Authorization: Bearer APP_STORE_CONNECT_TOKEN'
- BUILD_ID
- アップロードのときに得られた Received build ID
- APP_STORE_CONNECT_TOKEN
- AppStoreConnect API を利用するための TOKEN. 利用方法はこの記事では省略
- この記事 の方法で生成した
上記2 APIとも、当該ビルドに関する結果を得られず。