xcframework не содержит внутренних фреймворков
Я пытаюсь создать .xcframework
файл для нескольких сторонних библиотек, которые я использую. Следуя инструкциям https://appspector.com/blog/xcframeworks, я
- Создание для конкретной платформы
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. Затем я
- Объедините индивидуальность
framework
s сформировать единый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
пакет не содержит индивидуального framework
s или папки, указанные в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
Давать возможность
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'
Сборка / архивирование .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
[О] один из ключевых моментов для включения фреймворка в архивСоздайте 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.