Быстродействующий жировой каркас w/Objective-C Cocoapod

Я создал фреймворк в Swift. Структура использует Cocoapods, один из pods написан в Objective C.

Я также использую пользовательский script, чтобы сделать фреймворк толстой картой, поэтому он поддерживает 32/64 бит системы. (Это работает в отдельной цели проекта, и мне интересно, что с этим связано?)

UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal

if [ "true" == ${ALREADYINVOKED:-false} ]
then
echo "RECURSION: Detected, stopping"
else
export ALREADYINVOKED="true"

// Step 1. Build Device and Simulator versions
xcodebuild -target "${PROJECT_NAME}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphoneos  BUILD_DIR="${BUILD_DIR}"   BUILD_ROOT="${BUILD_ROOT}" clean build
xcodebuild -target "${PROJECT_NAME}" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" 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}/"

// Step 3. Copy Swift modules (from iphonesimulator build) to the copied framework directory
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphonesimulator/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule/." "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework/Modules/${PROJECT_NAME}.swiftmodule"

// 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 directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"

// Step 6. Convenience step to open the project directory in Finder
open "${PROJECT_DIR}"

fi

Когда я создаю эту жирную структуру и помещаю ее в проект, я бы хотел использовать его на компиляторе, всегда терпит неудачу. b/c проект не может видеть объектный модуль C cocoa pod.

clang: error: linker command failed with exit code 1 (use -v to see invocation)
ld: framework not found Pusher for architecture x86_64

Он не найден для любой архитектуры, когда я изменяю платформу сборки.

Любое решение, в котором я могу создать фреймворк, который я могу использовать в отдельном проекте Xcode (для всех iOS или OS X), будет потрясающим.

Ответ 1

Вы не можете запустить xcodebuild с помощью -target при использовании CocoaPods. Когда вы используете -target, Xcode будет рассматривать только активный проект и не будет затягивать зависимостей Pod, подобно тому, как вы только что открыли файл проекта в Xcode и попытались построить.

Вы должны запустить xcodebuild -workspace "${PROJECT_NAME}.xcworkspace" -scheme "${PROJECT_NAME}" ..., считая, что CocoaPods сгенерировали рабочую область, а Xcode сгенерировал схему с использованием целевого имени. Вам также необходимо убедиться, что ваша схема помечена как разделяемая, если она запущена на другом устройстве.

После того, как ваша инфраструктура будет построена, вам нужно будет включить ее и фреймворки в в приложениях, которые будут ее использовать. Для вашей структуры это означает включение в нее общих > встроенных бинарных и общих > связанных структур и библиотек. Для фреймворков, от которых вы зависите (например, AlamoFire), вы можете проинструктировать пользователей о включении его в свой подфайл, вы можете его упаковать и отправить вместе с каркасом, или вы можете сделать то же самое, и позволить пользователю делать то, что работает для них.

Ответ 2

По-видимому, вам не хватает 64-битной архитектуры для симулятора.

Когда вы создаете цель из Xcode, в зависимости от выбранного вами симулятора - созданная библиотека будет содержать i386 или x86_64 соответственно для выбранной 32-битной или 64-битной версии симулятора.

Я предполагаю, что сборка cli производит только версию i386.

Вы можете попытаться установить архитектуры в script:

xcodebuild -target "${PROJECT_NAME}" ARCHS="i386 x86_64" -configuration ${CONFIGURATION} -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

В качестве альтернативы Вы можете попытаться построить вручную с помощью 64-битного симулятора (iPhone 5S +), затем извлечь недостающую архитектуру и затем поместить ее в финальную библиотеку с помощью команды lipo.