НейроАгент

Сбой сборки Flutter iOS: исправление ошибки пакета конфиденциальности

Решение сбоев сборки Flutter iOS с пакетами конфиденциальности. Полное руководство по исправлению ошибок Xcode 'Build input file cannot be found' для плагинов path_provider_foundation и image_picker_ios.

Вопрос

Сбой сборки 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 ищет исполняемые файлы внутри приватных пакетов вместо того, чтобы распознавать их как файлы деклараций приватности. Это фундаментальное непонимание в процессе сборки, где приватные пакеты рассматриваются как исполняемые файлы 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 для решения проблемы интерпретации приватных пакетов:

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'
      
      # Добавление обработки приватных пакетов
      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. Полная очистка и пересборка

bash
# Полная последовательность очистки
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:

  1. Откройте iOS-проект в Xcode
  2. Выберите цель Runner
  3. Перейдите на вкладку “Build Phases”
  4. Добавьте фазу “Run Script” с:
bash
#!/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 и версий плагинов

Убедитесь, что вы используете последние версии, которые решают проблемы с приватными пакетами:

bash
flutter upgrade
flutter pub outdated
flutter pub upgrade path_provider_foundation image_picker_ios

Команда Flutter работала над исправлениями для этих проблем интерпретации приватных пакетов в последних версиях.

2. Настройка параметров проекта Xcode

Измените параметры вашего проекта Xcode для правильной обработки приватных пакетов:

  1. Откройте ios/Runner.xcworkspace в Xcode
  2. Выберите проект Runner
  3. Перейдите в “Build Settings”
  4. Найдите “Privacy” и убедитесь, что параметры, связанные с приватностью, настроены правильно
  5. Добавьте следующие флаги в “Other Linker Flags”:
    • -framework Foundation
    • -framework CoreGraphics

3. Использование альтернативных методов сборки

Если стандартный flutter build ipa продолжает давать сбой, попробуйте альтернативные подходы:

bash
# Метод 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-сборками:

  1. Убедитесь, что вы используете версию 2.1.5 или новее:

    yaml
    path_provider: ^2.1.5
    
  2. Добавьте следующее в ваш Podfile:

    ruby
    pod 'path_provider_foundation', :path => '../'
    

Для image_picker_ios

Плагин image_picker имеет специфические требования:

  1. Обновите до последней версии:

    yaml
    image_picker: ^1.2.0
    
  2. Убедитесь, что ваш Podfile включает:

    ruby
    pod 'image_picker_ios', :path => '../'
    
  3. В Xcode проверьте, что флаги линковки проекта и цели приложения установлены с “image_picker” на “image_picker_ios”, как указано в решении на Stack Overflow.


Лучшие практики для сборок iOS

1. Регулярное обслуживание

  • Регулярно обновляйте Flutter и плагины
  • Отслеживайте проблемы Flutter GitHub для исправлений проблем с приватными пакетами
  • Часто тестируйте как сборки для отладки, так и релизные сборки

2. Настройка среды сборки

bash
# Рекомендуемая предварительная очистка перед сборкой
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. Мониторинг и отладка

Всегда проверяйте на наличие этих конкретных шаблонов ошибок во время сборки:

  • Ошибки, связанные с приватными пакетами
  • Ошибки “модуль не найден”
  • Сбои процесса архивации
  • Проблемы с символизацией

Источники

  1. Проблема Flutter GitHub #169272 - Приватные пакеты интерпретируются как исполняемые файлы Swift
  2. Stack Overflow - Ошибка сборки Flutter iOS - framework image_picker не найден
  3. Stack Overflow - Flutter: Не удалось собрать iOS-приложение “ARCHIVE FAILED”
  4. Reddit - Проблемы с приватными пакетами Flutter iOS
  5. Проблема Flutter GitHub #57246 - Ошибка сборки Xcode: Модуль ‘image_picker’ не найден
  6. Проблема Flutter GitHub #166367 - ITMS-90048: Этот пакет недействителен

Заключение

Ошибка сборки с приватными пакетами, с которой вы столкнулись, является известной проблемой в экосистеме Flutter, особенно затрагивающей плагины, которые включают декларации приватности. Хотя это может быть неприятно, существует несколько эффективных решений:

  1. Немедленное исправление: Измените конфигурацию вашего Podfile и выполните полную очистку/пересборку
  2. Долгосрочное решение: Сохраняйте Flutter и плагины обновленными до последних версий, которые решают эти проблемы
  3. Альтернативный подход: Используйте процесс архивации Xcode, когда методы CLI дают сбой
  4. Профилактика: Регулярное обслуживание и мониторинг трекеров проблем Flutter для исправлений проблем с приватными пакетами

Ключевое понимание заключается в том, что Xcode неверно обрабатывает пакеты деклараций приватности как исполняемые файлы во время процесса архивации. Это в первую очередь проблема инструментов, а не вашего кода или конфигурации. Реализуя обходные пути и оставаясь актуальным с обновлениями Flutter, вы можете успешно собирать и распространять ваше iOS-приложение.

Помните, что эта проблема затрагивает именно релизные сборки и создание IPA — сборки для отладки обычно работают нормально. Если вы продолжаете испытывать проблемы, рассмотрите использование альтернативных методов сборки или отслеживайте проблемы Flutter GitHub для постоянных исправлений от команды Flutter.