Мобильная разработка

Ошибка сборки Flutter iOS IPA: Build input file cannot be found

Решение ошибки сборки Flutter iOS при создании IPA с privacy bundles (path_provider_foundation_privacy). Почему Xcode ищет файлы в пакетах конфиденциальности, обходные пути и фиксы для Xcode 15.2.

Сбой сборки iOS Flutter с ошибкой “Build input file cannot be found” для пакетов конфиденциальности

Я столкнулся с ошибкой сборки при создании IPA для моего Flutter iOS приложения, конкретно с пакетами конфиденциальности для плагинов path_provider_foundation и image_picker_ios.

Сообщение об ошибке

Ошибка (Xcode): Файл сборочных входных данных не найден: '/Users/builder/Library/Developer/Xcode/DerivedData/Runner-xxx/Build/Intermediates.noindex/ArchiveIntermediates/Runner/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/path_provider_foundation_privacy.bundle/path_provider_foundation_privacy'. Не забыли ли вы объявить этот файл как выходные данные этапа скрипта или пользовательского правила сборки, которое его создает?

Детали окружения

  • Flutter: 3.16.0
  • Целевая версия iOS: 13.0
  • Xcode: 15.2
  • CocoaPods: 1.16.2
  • Плагины: image_picker: ^1.2.0, path_provider: ^2.1.5

Попытки устранения неполадок

  1. flutter clean и flutter pub get
  2. pod deintegrate и pod install
  3. Обновление до последних версий плагинов
  4. Очистка DerivedData
  5. Проверка, что пакеты конфиденциальности создаются в build/ios/Release-iphoneos/ с файлами PrivacyInfo.xcprivacy

Описание проблемы

Пакеты конфиденциальности создаются правильно с файлами PrivacyInfo.xcprivacy, но Xcode ищет исполняемые файлы с конкретными именами (path_provider_foundation_privacy, image_picker_ios_privacy) внутри этих пакетов.

Конфигурация Podfile

ruby
platform :ios, '13.0'

target 'Runner' do
 use_frameworks! :linkage => :static
 use_modular_headers!
 flutter_install_all_ios_pods File.dirname(File.realpath(__FILE__))
end

post_install do |installer|
 installer.pods_project.targets.each do |target|
 flutter_additional_ios_build_settings(target)
 target.build_configurations.each do |config|
 config.build_settings['ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES'] = 'YES'
 config.build_settings['OTHER_LDFLAGS'] ||= []
 config.build_settings['OTHER_LDFLAGS'] << '-ObjC'
 end
 end
end

Вопрос

Почему Xcode ожидает исполняемые файлы вместо стандартных пакетов конфиденциальности iOS? Есть ли проблема конфигурации в моем проекте или это известная проблема с этими конкретными версиями плагинов?

Сборка работает нормально для отладочных сборок, но не удается именно при создании IPA (процесс архивации). Мне необходимо успешно создать IPA файл для распространения.

Это ошибка Xcode при архивировании: в Xcode 15.2 инструмент для встраивания Swift (swiftStdLibTool / CopySwiftLibs) ошибочно принимает privacy bundles (например path_provider_foundation_privacy и image_picker_ios_privacy) за Swift‑исполняемые и ищет внутри них соответствующие файлы, отчего при создании IPA появляется сообщение «Build input file cannot be found». Проблема вызвана поведением Xcode, а не самими плагинами; короткие обходы — обновить/поменять версию Xcode, убрать глобальную установку ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES в Podfile или временно добавить run‑script, создающий placeholder‑файлы в privacy‑bundle.


Содержание


Почему Xcode ожидает исполняемые файлы? (Flutter iOS сборка IPA ошибка)

Кратко: Xcode (в репорте — версия 15.2) во время фазы архивации запускает механизм, который сканирует собранные продукты, чтобы найти места, где нужно встроить Swift runtime. По какой‑то причине этот инструмент начинает рассматривать файлы с именем, оканчивающимся на _privacy (например path_provider_foundation_privacy.bundle) как потенциальные Swift‑исполняемые. Он пытается прочитать/создать исполняемый файл с таким же именем внутри .bundle и падает, если такого файла нет — отсюда сообщение “Build input file cannot be found”.

Это совпадает с обсуждением на трекере Flutter: в issue описано, что privacy‑bundle содержит только ресурс PrivacyInfo.xcprivacy, но swiftStdLibTool пытается обработать его как исполняемый пакет и пишет dependency‑файлы внутрь bundle, что неправильно и приводит к ошибке при Archive (в Debug‑сборках CopySwiftLibs обычно не выполняется, поэтому они проходят) — см. обсуждение на GitHub: https://github.com/flutter/flutter/issues/169272.

Замечание про Podfile: если вы в post_install явно ставите для всех pod‑таргетов ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = ‘YES’, то вы расширяете набор таргетов, которые обрабатывает механизм встраивания Swift, и это может усилить проявление ошибки (инструмент начнёт «сканировать» больше продуктов, включая privacy‑bundles).


Проверки и быстрая отладка для Flutter iOS сборка IPA ошибка

Чтобы подтвердить причину и понять, где править:

  • Убедитесь, что privacy‑bundles действительно присутствуют и содержат только файл PrivacyInfo.xcprivacy:
  • Пример пути (DerivedData может отличаться):
    /Users//Library/Developer/Xcode/DerivedData/Runner-/Build/Intermediates.noindex/ArchiveIntermediates/Runner/IntermediateBuildFilesPath/UninstalledProducts/iphoneos/_privacy.bundle
  • Посмотреть содержимое: ls -la "<полный_путь>/*.bundle"
  • Попробуйте архивировать из терминала, чтобы получить полный лог:
  • xcodebuild -workspace ios/Runner.xcworkspace -scheme Runner -configuration Release archive -archivePath build/Runner.xcarchive
  • В логах ищите фазу CopySwiftLibs / Embed Swift Standard Libraries и сообщение об ошибке.
  • Проверьте Podfile / post_install: есть ли там глобальная установка ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = ‘YES’ для всех pod‑таргетов — если да, временно удалите/ограничьте её.
  • Просмотрите похожие случаи (для общего контекста): https://stackoverflow.com/questions/79409806/upgrading-an-old-flutter-project-giving-privacy-errors

Исправления и обходные пути (рекомендуем в порядке приоритета)

Ниже — практические варианты. Пробуйте в указанном порядке (от наименее инвазивного к временным хаку).

  1. Обновить Xcode (рекомендуется)
  • Проверьте, не выпущен ли патч Apple, устраняющий проблему (следите за issue на GitHub). Если доступна версия Xcode >15.2 с исправлением — обновитесь и проверьте сборку. Это самый чистый вариант.
  1. Убрать или ограничить глобальную установку ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES в Podfile
  • В вашем Podfile вы принудительно ставите ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = 'YES' для всех pod‑таргетов. Рекомендация — не включать это глобально. Удалите строку или применяйте её только к тем таргетам, которые действительно нуждаются в встраивании Swift runtime.
  • Пример: упростите post_install так, чтобы не выставлять эту опцию для всех pod‑таргетов:
ruby
post_install do |installer|
 installer.pods_project.targets.each do |target|
 flutter_additional_ios_build_settings(target)
 target.build_configurations.each do |config|
 # убираем глобальную установку ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES
 config.build_settings['OTHER_LDFLAGS'] ||= []
 config.build_settings['OTHER_LDFLAGS'] << '-ObjC'
 end
 end
end
  • Если приложению всё же нужно встраивать Swift, включите этот параметр только для app target в Xcode (Runner → Build Settings → Always Embed Swift Standard Libraries = YES), но не для всех pod‑таргетов.
  1. Временный run‑script: создать placeholder‑файлы внутри privacy‑bundle до CopySwiftLibs
  • Хак: добавить Run Script в Build Phases приложения, чтобы перед фазой Embed Swift Standard Libraries создать пустые исполняемые файлы с ожидаемыми именами внутри privacy‑bundle. Это заставит swiftStdLibTool «найти» файл и не упасть.
  • Скрипт (новый Run Script в Runner target, поместите выше фазы “Embed Swift Standard Libraries”):
bash
# Выполнять только при архивировании Release
if [ "$CONFIGURATION" = "Release" ] || [ "$ACTION" = "install" ]; then
 PRODUCTS_DIR="${BUILT_PRODUCTS_DIR}/UninstalledProducts/iphoneos"
 if [ -d "$PRODUCTS_DIR" ]; then
 for bundle in "$PRODUCTS_DIR"/*_privacy.bundle; do
 [ -d "$bundle" ] || continue
 name=$(basename "$bundle" .bundle)
 file="$bundle/$name"
 if [ ! -f "$file" ]; then
 touch "$file"
 chmod +x "$file"
 fi
 done
 fi
fi
  • Минусы: это временный и хрупкий фикс (следите за код‑подписью и удаляйте, когда Xcode исправят баг). Но он часто позволяет успешно создать IPA до официального починка.
  1. Понизить/зафиксировать Xcode в CI на рабочую версию
  • Если срочно нужно собрать IPA в CI, используйте образ/машину с Xcode, где проблема не воспроизводится (например Xcode 15.1 или другая стабильная версия), либо примените run‑script в проекте и залейте изменения в репозиторий CI.
  1. Патчинг плагинов / podspec (крайний вариант)
  • Можно изменить podspec плагина (переименовать bundle или выставить специфичные build_settings), но это неудобно и ломает обновления. Лучше дождаться исправления в Xcode или у плагинов.

Дополнительно: отслеживайте обсуждение и обновления по багу в официальном issue: https://github.com/flutter/flutter/issues/169272.


Рекомендации для CI и публикации IPA

  • Если CI использует macOS‑image с Xcode 15.2 и вы не можете обновить образ, внедрите run‑script в проект и закоммитьте его (временно).
  • Лучше — зафиксировать Xcode на CI на версии, которая работает, или обновлять до версии с фиксом, когда он выйдет.
  • Перед выпуском: чистка DerivedData и pod install после изменений Podfile обязательны. Полная последовательность на CI: checkout → flutter pub get → cd ios && pod install --repo-update → xcodebuild archive…

Источники


Заключение

Причина ошибки — поведение Xcode (swiftStdLibTool), а не баг в плагинах path_provider или image_picker: при архивировании Xcode 15.2 ошибочно рассматривает privacy‑bundle как исполняемый модуль, что и вызывает «Build input file cannot be found». Для решения: сначала уберите глобальную установку ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES в Podfile и попробуйте пересобрать; если это не помогает — обновите/понизьте версию Xcode или используйте временный run‑script‑хак (создание placeholder‑файлов) до выхода исправления. Если вам нужно быстро получить рабочий IPA в CI — зафиксируйте рабочую версию Xcode или включите run‑script в проект. Удачи — и следите за обновлениями по issue: https://github.com/flutter/flutter/issues/169272.

Авторы
Проверено модерацией
Модерация
Ошибка сборки Flutter iOS IPA: Build input file cannot be found