Создание универсального фреймворка с использованием Xcode 8?
IOS Framework моей компании предназначен для работы на реальном устройстве iOS. Упомянутая структура в настоящее время генерируется как дополнительная цель в проекте XCode, который также генерирует приложение. (Это облегчает отладку фреймворка.)
Недавно мы получили запросы, чтобы он также работал в симуляторе. Теперь я могу сделать это, и следующим шагом будет создание скомпилированной версии, которая работает как на реальном устройстве, так и в симуляторе. К сожалению, мне не удалось найти какой-либо материал, указывающий, что кто-то сделал это с помощью Xcode 8. Существуют материалы, объясняющие, как работают более старые версии Xcode, но то, что работает в одной версии Xcode, может не работать или быть целесообразным в более поздней версии. версия. (У нас уже был один метод создания универсального разрыва фреймворка.) Я пытался использовать несколько сценариев до Xcode 8, но ни один из них не работал.
Кому-нибудь удалось создать универсальный фреймворк для iOS с использованием Xcode 8? Если так, как это можно сделать?
Заранее благодарен за любую помощь, которую может оказать любой.
Аарон Адельман
4 ответа
Это возможно, поскольку в настоящее время я разрабатываю универсальные фреймворки на iOS, watchOS и tvOS на Xcode 8.
Для этого я создаю Aggregate target(кроссплатформенный) и добавляю скрипт запуска на этапе сборки. Сценарий в основном компилирует iOS-мишень для iphoneimulator и iphoneos
После этого он создает новый двоичный файл, объединяющий их обоих (lipo -create -output)
Не могли бы вы опубликовать свой текущий скрипт сборки для создания универсального фреймворка, чтобы я мог показать вам, что вы делаете неправильно?
Примите во внимание, что сценарий не может быть вашей проблемой здесь, ваша проблема может заключаться в настройке вашей действующей архитектуры, вашей архитектуры или даже в том, как вы подписываете цель. На данный момент я рекомендую оставить флажок "Автоматически управлять подписью" в общих настройках целевого объекта и не устанавливать флажки, а также вручную настраивать профили обеспечения и сертификаты.
Запустить скрипт:
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}/iOS"
# Step 1. Build Device and Simulator versions on iOS
xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphonesimulator -destination 'platform=iOS Simulator,name=iPhone 6' clean build
xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" -sdk iphoneos clean build
# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/iOS"
# Step 3. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
# Step 4. Convenience step to copy the framework to the project's directory
mkdir -p "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS"
cp -R "${UNIVERSAL_OUTPUTFOLDER}/iOS/${PROJECT_NAME}.framework" "${TMPDIR}/${PROJECT_NAME}/Frameworks/iOS"
# Step 6. Create .tar.gz file for posting on the binary repository
cd "${TMPDIR}"
# We nest the framework inside a Frameworks folder so that it unarchives correctly
tar -zcf "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_NAME}/Frameworks/"
mv "${PROJECT_NAME}.framework.tar.gz" "${PROJECT_DIR}/"
# Step 7. Convenience step to open the project's directory in Finder
#open "${PROJECT_DIR}"
Примите во внимание, что я установил для Build Active Architecture Only значение NO в настройках сборки, также допустимыми архитектурами являются arm64, x86_64, i386, armv7, armv7s. Архитектура - это ${ARCHS_STANDARD} armv7s.
Я также установил пользовательскую настройку сборки BITCODE_GENERATION_MODE битовый код. С помощью этого параметра сборки я обязательно создаю двоичные файлы с включенным битовым кодом.
Построить iOS/tvOS универсальный / толстый фреймворк
https://github.com/unchartedworks/universalbuild
Использование:
universalbuild (-p | --project name.xcodeproj) (-s | --scheme schemename) (-c | --configuration имя_конфигурации)
Пример:
git clone https://github.com/cruisediary/Pastel.git
cd Pastel
universalbuild -p ./Pastel.xcodeproj -s Pastel -c Debug
Запустите скрипт для создания универсальной платформы (без проблем с рекурсией)
#!/bin/sh
UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
# Next, work out if we're in SIM or DEVICE
if [ "false" == ${ALREADYINVOKED:-false} ]
then
export ALREADYINVOKED="true"
if [ ${PLATFORM_NAME} = "iphonesimulator" ]
then
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
else
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build
fi
# Step 2. Copy the framework structure (from iphoneos build) to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"
# Step 3. Copy Swift modules from iphonesimulator build (if it exists) to the copied framework directory
SIMULATOR_SWIFT_MODULES_DIR="${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/."
if [ -d "${SIMULATOR_SWIFT_MODULES_DIR}" ]; then
cp -R "${SIMULATOR_SWIFT_MODULES_DIR}" "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"
fi
# Step 4. Create universal binary file using lipo and place the combined executable in the copied framework directory
lipo -create -output "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/${PROJECT_NAME}" "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework/${PROJECT_NAME}"
# Step 5. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"
# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"
fi
Я тоже боролся с той же проблемой. У меня была серия кокоапод, которые использовались в качестве исходных, но их нужно было преобразовать в бинарные. Между множеством поисковика, проб и ошибок и взлома я придумал сценарий, с которым у меня был большой успех. Он основан на сценариях, которые вы видите здесь, но реорганизован в функции и некоторый вывод отладочной информации (который входит в журналы в /tmp), когда чего-то не хватает.
Этот сценарий можно найти в качестве github-гистограммы здесь: https://gist.github.com/intere/bc380fa45ccf23976d3fc297522d29a8
FWIW, я использовал Xcode 9 (9.2, затем 9.3, а теперь 9.4).