Сбой сборки 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 файл для распространения.
Содержание
- Понимание проблемы с приватными пакетами
- Анализ основной причины
- Немедленные обходные пути
- Долгосрочные решения
- Специфические исправления для плагинов
- Лучшие практики для сборок iOS
Понимание проблемы с приватными пакетами
Сообщение об ошибке указывает на то, что Xcode ищет исполняемые файлы внутри приватных пакетов вместо того, чтобы распознавать их как файлы деклараций приватности. Это фундаментальное непонимание в процессе сборки, где приватные пакеты рассматриваются как исполняемые файлы Swift, а не как пакеты деклараций приватности.
Согласно проблеме Flutter GitHub #169272, эта проблема возникает именно в процессе архивации IPA, когда присутствуют приватные пакеты с файлами .xcprivacy. Система сборки Xcode ошибочно ожидает, что эти файлы являются двоичными исполняемыми файлами, а не пакетами деклараций приватности.
Основные симптомы
- Сборка работает нормально для конфигураций отладки
- Ошибка возникает именно во время
flutter build ipaили процесса архивации в Xcode - В сообщении об ошибке упоминаются отсутствующие исполняемые файлы в приватных пакетах
- Приватные пакеты правильно генерируются с файлами
PrivacyInfo.xcprivacy
Анализ основной причины
Проблема возникает из-за того, как Xcode обрабатывает приватные пакеты во время фазы архивации. Когда плагины Flutter включают декларации приватности, они создают пакеты с файлами .xcprivacy, но система сборки Xcode неверно интерпретирует их как исполняемые файлы, которые должны создаваться скриптами сборки.
Как объяснено в документации проблемы Flutter, это особенно проблематично с:
- плагином
path_provider_foundation - плагином
image_picker_ios - любым плагином, который включает декларации требований приватности
Ошибка возникает потому, что Xcode ожидает найти исполняемые файлы с определенными именами, такими как path_provider_foundation_privacy, внутри каталогов пакетов, но на самом деле это файлы деклараций приватности, а не исполняемые файлы.
Факторы, способствующие проблеме
- Конфигурация статической линковки: Ваш Podfile использует
use_frameworks! :linkage => :static - Декларации приватности: Современные плагины включают декларации требований приватности
- Процесс архивации: Проблема проявляется именно при создании IPA, а не при обычных сборках
Немедленные обходные пути
1. Изменение конфигурации Podfile
Обновите ваш 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'
# Добавление обработки приватных пакетов
config.build_settings['PRODUCT_BUNDLE_IDENTIFIER'] = 'com.yourcompany.app'
end
end
# Обходной путь для проблем с приватными пакетами
installer.pods_project.build_configurations.each do |config|
config.build_settings['ENABLE_USER_SCRIPT_SANDBOXING'] = 'NO'
end
end
2. Полная очистка и пересборка
# Полная последовательность очистки
flutter clean
rm -rf ios/Podfile.lock
rm -rf ios/Pods
rm -rf ~/Library/Developer/Xcode/DerivedData/Runner-*
cd ios && pod deintegrate && pod install
cd ..
flutter clean
flutter pub get
flutter build ios --release
3. Ручная конфигурация приватных пакетов
Если проблема сохраняется, вручную настройте приватные пакеты в вашем проекте Xcode:
- Откройте iOS-проект в Xcode
- Выберите цель Runner
- Перейдите на вкладку “Build Phases”
- Добавьте фазу “Run Script” с:
#!/bin/sh
echo "Настройка приватных пакетов"
find "${BUILT_PRODUCTS_DIR}" -name "*.bundle" -type d | while read -r bundle_dir; do
privacy_file="${bundle_dir}/PrivacyInfo.xcprivacy"
if [ -f "$privacy_file" ]; then
echo "Файл приватности найден: $privacy_file"
else
echo "Предупреждение: Файл приватности отсутствует в $bundle_dir"
fi
done
Долгосрочные решения
1. Обновление Flutter и версий плагинов
Убедитесь, что вы используете последние версии, которые решают проблемы с приватными пакетами:
flutter upgrade flutter pub outdated flutter pub upgrade path_provider_foundation image_picker_ios
Команда Flutter работала над исправлениями для этих проблем интерпретации приватных пакетов в последних версиях.
2. Настройка параметров проекта Xcode
Измените параметры вашего проекта Xcode для правильной обработки приватных пакетов:
- Откройте
ios/Runner.xcworkspaceв Xcode - Выберите проект Runner
- Перейдите в “Build Settings”
- Найдите “Privacy” и убедитесь, что параметры, связанные с приватностью, настроены правильно
- Добавьте следующие флаги в “Other Linker Flags”:
-framework Foundation-framework CoreGraphics
3. Использование альтернативных методов сборки
Если стандартный flutter build ipa продолжает давать сбой, попробуйте альтернативные подходы:
# Метод 1: Сборка напрямую с помощью Xcode
open ios/Runner.xcworkspace
# Ручная архивация в Xcode
# Метод 2: Использование xcodebuild
cd ios
xcodebuild -workspace Runner.xcworkspace -scheme Runner -configuration Release -archivePath Runner.xcarchive archive
xcodebuild -exportArchive -archivePath Runner.xcarchive -exportPath . -exportOptionsPlist ExportOptions.plist
Специфические исправления для плагинов
Для path_provider_foundation
Плагин path_provider_foundation имел несколько проблем с iOS-сборками:
-
Убедитесь, что вы используете версию 2.1.5 или новее:
yamlpath_provider: ^2.1.5 -
Добавьте следующее в ваш Podfile:
rubypod 'path_provider_foundation', :path => '../'
Для image_picker_ios
Плагин image_picker имеет специфические требования:
-
Обновите до последней версии:
yamlimage_picker: ^1.2.0 -
Убедитесь, что ваш Podfile включает:
rubypod 'image_picker_ios', :path => '../' -
В Xcode проверьте, что флаги линковки проекта и цели приложения установлены с “image_picker” на “image_picker_ios”, как указано в решении на Stack Overflow.
Лучшие практики для сборок iOS
1. Регулярное обслуживание
- Регулярно обновляйте Flutter и плагины
- Отслеживайте проблемы Flutter GitHub для исправлений проблем с приватными пакетами
- Часто тестируйте как сборки для отладки, так и релизные сборки
2. Настройка среды сборки
# Рекомендуемая предварительная очистка перед сборкой
flutter clean
rm -rf ~/.pub-cache/hosted/pub.dev/*/ios
rm -rf ios/Pods
rm -rf ios/.symlinks
# Свежая установка
flutter pub get
cd ios && pod install && cd ..
3. Оптимизация процесса архивации
- Используйте
flutter build ios --releaseсначала для проверки сборки - Архивируйте с помощью Xcode, когда методы CLI дают сбой
- Рассмотрите использование CI/CD сервисов с обновленными цепочками инструментов Flutter
4. Мониторинг и отладка
Всегда проверяйте на наличие этих конкретных шаблонов ошибок во время сборки:
- Ошибки, связанные с приватными пакетами
- Ошибки “модуль не найден”
- Сбои процесса архивации
- Проблемы с символизацией
Источники
- Проблема Flutter GitHub #169272 - Приватные пакеты интерпретируются как исполняемые файлы Swift
- Stack Overflow - Ошибка сборки Flutter iOS - framework image_picker не найден
- Stack Overflow - Flutter: Не удалось собрать iOS-приложение “ARCHIVE FAILED”
- Reddit - Проблемы с приватными пакетами Flutter iOS
- Проблема Flutter GitHub #57246 - Ошибка сборки Xcode: Модуль ‘image_picker’ не найден
- Проблема Flutter GitHub #166367 - ITMS-90048: Этот пакет недействителен
Заключение
Ошибка сборки с приватными пакетами, с которой вы столкнулись, является известной проблемой в экосистеме Flutter, особенно затрагивающей плагины, которые включают декларации приватности. Хотя это может быть неприятно, существует несколько эффективных решений:
- Немедленное исправление: Измените конфигурацию вашего Podfile и выполните полную очистку/пересборку
- Долгосрочное решение: Сохраняйте Flutter и плагины обновленными до последних версий, которые решают эти проблемы
- Альтернативный подход: Используйте процесс архивации Xcode, когда методы CLI дают сбой
- Профилактика: Регулярное обслуживание и мониторинг трекеров проблем Flutter для исправлений проблем с приватными пакетами
Ключевое понимание заключается в том, что Xcode неверно обрабатывает пакеты деклараций приватности как исполняемые файлы во время процесса архивации. Это в первую очередь проблема инструментов, а не вашего кода или конфигурации. Реализуя обходные пути и оставаясь актуальным с обновлениями Flutter, вы можете успешно собирать и распространять ваше iOS-приложение.
Помните, что эта проблема затрагивает именно релизные сборки и создание IPA — сборки для отладки обычно работают нормально. Если вы продолжаете испытывать проблемы, рассмотрите использование альтернативных методов сборки или отслеживайте проблемы Flutter GitHub для постоянных исправлений от команды Flutter.