xcframework не содержит внутренних фреймворков

Я пытаюсь создать .xcframeworkфайл для нескольких сторонних библиотек, которые я использую. Следуя инструкциям https://appspector.com/blog/xcframeworks, я

  1. Создание для конкретной платформы framework файлы:
# Archive for device
xcodebuild archive -scheme TestFramework -destination="iOS" -archivePath /tmp/xcf/ios.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphoneos SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

# Archive for simulator
xcodebuild archive -scheme TestFramework -destination="iOS Simulator" -archivePath /tmp/xcf/iossimulator.xcarchive -derivedDataPath /tmp/iphoneos -sdk iphonesimulator SKIP_INSTALL=NO BUILD_LIBRARIES_FOR_DISTRIBUTION=YES

На данный момент у меня есть два фреймворка с .swiftmoduleфайлы; все выглядит хорошо. Фреймворки не поставляются с.swiftinterfaceфайлы, но я думаю, что это нормально, поскольку это проекты objc. Затем я

  1. Объедините индивидуальность frameworks сформировать единый xcframework файл:
# Build xcframework with two archives
xcodebuild -create-xcframework -framework /tmp/xcf/ios.xcarchive/Products/Library/Frameworks/TestFramework.framework -framework /tmp/xcf/iossimulator.xcarchive/Products/Library/Frameworks/TestFramework.framework -output /tmp/xcf/TestFramework.xcframework

Вот, xcodebuildне выходит из строя, но выдает любопытную ошибку:

No 'swiftinterface' files found within '/Users/user/git/ReactiveObjC/output/xcf/ios.xcarchive/Products/Products/Library/TestFramework.framework/Modules/TestFramework.swiftmodule'.

Что особенно важно, .xcframework пакет не содержит индивидуального frameworks или папки, указанные вInfo.plistфайл. Очевидно, когда я пытаюсь сделать ссылку наxcframework в этом состоянии я получаю кучу ошибок компоновщика "недостающие символы".

Почему это? Что я должен сделать, чтобы получитьxcodebuild создать xcframework полностью?

NB: создание папок вручную, похоже, пока работает, но это кажется неправильным и хрупким - Apple может изменить способ xcodebuild работает в любое время.

5 ответов

Оказывается, добавление BUILD_LIBRARY_FOR_DISTRIBUTION = YES до конца xcodebuild команды было недостаточно / не работала для создания фреймворка с требуемым swiftinterfaceфайлы. Мне пришлось зайти в настройки реального проекта и вручную установитьBUILD_LIBRARY_FOR_DISTRIBUTION к YES, как подсказывает этот ответ. После того, как я получил фреймворки сswiftinterface файлов, я смог создать xcframework файл с использованием xcodebuild без проблем.

Создать XCFramework

XCFramework заменяет Fat / Universal framework. Это bundleкоторый содержит несколько .framewok для каждой архитектуры / платформы. Нам не нужно использовать lipo [О программе] для объединения и разделения фреймворков вручную

XCFramework поддерживает библиотеки с заголовками и Objective-C

  1. Давать возможность Build Libraries for Distribution(BUILD_LIBRARY_FOR_DISTRIBUTION)для вашего фреймворка. XCFramework работает только с включенным [BUILD_LIBRARY_FOR_DISTRIBUTION]. Если нет, когда вы запустите шаг 3, вы получите

            No 'swiftinterface' files found within '<some_path>/<some_name>.xcarchive/Products/Library/Frameworks/<some_name>.framework/Modules/<some_name>.swiftmodule'
    
  2. Сборка / архивирование .framework для разных архитектур / платформ

             xcodebuild archive \
     -workspace ModuleName.xcworkspace \
     -scheme "schemaName" \
     -sdk "iphoneos" \
     -arch arm64 \
     -archivePath "<some_path>/ArchiveName1.xcarchive" \
     SKIP_INSTALL=NO \
    
     xcodebuild archive \
     -workspace ModuleName.xcworkspace \
     -scheme "schemaName" \
     -sdk "iphonesimulator" \
     -arch x86_64 \
     -archivePath "<some_path>/ArchiveName2.xcarchive" \
     SKIP_INSTALL=NO \
    

    SKIP_INSTALL [О] один из ключевых моментов для включения фреймворка в архив

  3. Создайте XCFramework, используя xcodebuild -create-xcframework

             xcodebuild -create-xcframework \
         -framework "<some_path>/ArchiveName1.xcarchive/Products/Library/Frameworks/ModuleName.framework" \
         -framework "<some_path>/ArchiveName2.xcarchive/Products/Library/Frameworks/ModuleName.framework"
    

Я столкнулся с той же проблемой. Оказалось, что настройки сборки Xcode 13 переопределяют флаг SKIP_INSTALL=NO в командной строке. После того, как я установил для этого поля в настройках сборки проекта значение NO (и убедился, что для параметра Build Library For Distribution установлено значение YES), мне удалось успешно создать файл xcframework.

Преобразование в XCFramework из Cocoapods

В своем сценарии я пытаюсь собрать XCFrameworks из фреймворков FAT / lipo, созданных cocoapods.

Я добавил это в конец своего подфайла:

      post_install do |installer|
    installer.pods_project.targets.each do |target|
        target.build_configurations.each do |config|
            config.build_settings['BUILD_LIBRARY_FOR_DISTRIBUTION'] = 'YES'
        end
    end
end

Это обеспечило правильную компиляцию фреймворков, и я смог запустить нормальный xcodebuild -create-xcframework ... команда для создания XCFramework.

Примечание: я также использую cocoapods-binary плагин для предварительной сборки всех фреймворков модулей.

Я добавил файл readme с полной информацией о том, как создать xc framework.

https://github.com/awasthi027/Xcode_lib_framework_issues/blob/master/README.md

Следуйте инструкциям для создания xc framework.

Другие вопросы по тегам