From 4792cba7942004f7f6e9352a62d2fbd751e579a6 Mon Sep 17 00:00:00 2001 From: Mohamed Boudra Date: Fri, 8 May 2026 21:42:24 +0700 Subject: [PATCH] fix(fastlane): create editable App Store version before deliver submit_review reached the deliver step but failed with "could not find an editable version for 'IOS'". With skip_metadata + skip_screenshots, deliver does not auto-create the "Prepare for Submission" entry on App Store Connect, so submitting fails when the marketing version has not been created yet. Use Spaceship's ensure_version! to create or reuse the editable App Store version for the build's marketing version, and pass app_version to deliver so it targets the right entry. --- packages/app/fastlane/Fastfile | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/packages/app/fastlane/Fastfile b/packages/app/fastlane/Fastfile index 486538439..d41dcb8ef 100644 --- a/packages/app/fastlane/Fastfile +++ b/packages/app/fastlane/Fastfile @@ -25,6 +25,7 @@ platform :ios do app = Spaceship::ConnectAPI::App.find(APP_IDENTIFIER) UI.user_error!("Could not find app #{APP_IDENTIFIER} on App Store Connect") if app.nil? + valid_build = nil deadline = Time.now + (30 * 60) loop do builds = Spaceship::ConnectAPI::Build.all( @@ -34,7 +35,10 @@ platform :ios do build = builds.find { |b| b.pre_release_version&.platform == "IOS" } state = build&.processing_state UI.message("Build #{build_number} processing state: #{state || 'unknown'}") - break if state == "VALID" + if state == "VALID" + valid_build = build + break + end if state == "INVALID" || state == "FAILED" UI.user_error!("Build #{build_number} failed App Store processing (state: #{state}).") end @@ -44,9 +48,18 @@ platform :ios do sleep(30) end + app_version = valid_build.pre_release_version.version + UI.message("Submitting build #{build_number} as App Store version #{app_version} for review") + + # Ensure an editable App Store version exists for this marketing version. + # deliver requires a "Prepare for Submission" version on App Store Connect + # and won't auto-create one when skip_metadata + skip_screenshots are set. + app.ensure_version!(app_version, platform: Spaceship::ConnectAPI::Platform::IOS) + deliver( api_key: api_key, app_identifier: APP_IDENTIFIER, + app_version: app_version, build_number: build_number.to_s, submit_for_review: true, automatic_release: true,