Ошибка сборки 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
Попытки устранения неполадок
flutter cleanиflutter pub getpod deintegrateиpod install- Обновление до последних версий плагинов
- Очистка DerivedData
- Проверка, что пакеты конфиденциальности создаются в
build/ios/Release-iphoneos/с файламиPrivacyInfo.xcprivacy
Описание проблемы
Пакеты конфиденциальности создаются правильно с файлами PrivacyInfo.xcprivacy, но Xcode ищет исполняемые файлы с конкретными именами (path_provider_foundation_privacy, image_picker_ios_privacy) внутри этих пакетов.
Конфигурация Podfile
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 ошибка)
- Проверки и быстрая отладка для Flutter iOS сборка IPA ошибка
- Исправления и обходные пути (рекомендуем в порядке приоритета)
- Рекомендации для CI и публикации IPA
- Источники
- Заключение
Почему 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
Исправления и обходные пути (рекомендуем в порядке приоритета)
Ниже — практические варианты. Пробуйте в указанном порядке (от наименее инвазивного к временным хаку).
- Обновить Xcode (рекомендуется)
- Проверьте, не выпущен ли патч Apple, устраняющий проблему (следите за issue на GitHub). Если доступна версия Xcode >15.2 с исправлением — обновитесь и проверьте сборку. Это самый чистый вариант.
- Убрать или ограничить глобальную установку ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES в Podfile
- В вашем Podfile вы принудительно ставите
ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = 'YES'для всех pod‑таргетов. Рекомендация — не включать это глобально. Удалите строку или применяйте её только к тем таргетам, которые действительно нуждаются в встраивании Swift runtime. - Пример: упростите post_install так, чтобы не выставлять эту опцию для всех pod‑таргетов:
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‑таргетов.
- Временный 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”):
# Выполнять только при архивировании 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 до официального починка.
- Понизить/зафиксировать Xcode в CI на рабочую версию
- Если срочно нужно собрать IPA в CI, используйте образ/машину с Xcode, где проблема не воспроизводится (например Xcode 15.1 или другая стабильная версия), либо примените run‑script в проекте и залейте изменения в репозиторий CI.
- Патчинг плагинов / 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…
Источники
- Репорт и обсуждение в репозитории Flutter: https://github.com/flutter/flutter/issues/169272
- Похожая заметка/обсуждение на Stack Overflow: https://stackoverflow.com/questions/79409806/upgrading-an-old-flutter-project-giving-privacy-errors
- Руководство Flutter по деплою iOS (для общих шагов создания IPA): https://docs.flutter.dev/deployment/ios
Заключение
Причина ошибки — поведение 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.