Создание универсального фреймворка с использованием 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).

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