Как архивировать приложение, которое включает настраиваемую структуру?
У меня есть проект рамки xcode, который я создал, который я могу скомпилировать в файл myframework.framework
. После компиляции я перетаскиваю эту фреймворк в папку проекта Frameworks моего приложения, а затем, чтобы использовать классы из фреймворка, я добавляю правильный оператор import
в любой класс, который ему нужен; это позволяет моему приложению успешно компилироваться со ссылками на классы, определенные в рамках. Чтобы приложение успешно развертывалось на моем устройстве, я также добавляю свою собственную инфраструктуру в раздел "Встроенные двоичные файлы" для моей цели. Со всем этим на месте я могу создать приложение из xcode и запустить его на своем устройстве.
Моя проблема возникает, когда я пытаюсь архивировать приложение для магазина приложений. Когда я пытаюсь сделать это, я получаю тонну ошибок компилятора, где xcode говорит, что не может найти объявления для любого из классов, определенных в моей пользовательской структуре.
Как настроить архив в xcode так, чтобы он правильно ссылался и вставлял мою собственную фреймворк?
Ответы
Ответ 1
Вам не нужно вставлять его в раздел "встроенные двоичные файлы". Вам нужно только это в разделе связанных фреймворков и библиотек. Убедитесь, что ваша инфраструктура является универсальной (то есть она может компилироваться для всех архитектур) и убедитесь, что у вас установлены правильные флаги компилятора (-ObjC, если ваша инфраструктура имеет какие-либо категории и т.д.). Возможно, некоторые другие вещи необходимо установить так же, как "Другие флаги C", если ваша фреймворк содержит любой код c, и вы хотите включить бит-код в своем клиентском приложении, тогда вы должны поместить "-fembed-bitcode" в свой framework Other C Flags. Это были те вещи, которые мне нужно было сделать, чтобы получить приложение для моей инфраструктуры в магазине. Я думаю, что это просто неправильное представление о том, что вам нужно поместить это во встроенные двоичные файлы, чтобы его архивировать для хранилища.
Это сборка script, которую я использую для создания универсальной структуры. Он строится прямо на моем рабочем столе. Вы можете раскомментировать раздел 8, если ваша фреймворк находится в Swift. Вы хотите создать агрегированную цель и добавить это как запуск script в фазах сборки.
# Merge Script
# 1
# Set bash script to exit immediately if any commands fail.
set -e
# 2
# Setup some constants for use later on.
FRAMEWORK_NAME="MyFramework"
# 3
# If remnants from a previous build exist, delete them.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
# 4
# Build the framework for device and for simulator (using
# all needed architectures).
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch arm64 -arch armv7 -arch armv7s only_active_arch=no defines_module=yes -sdk "iphoneos"
xcodebuild -target "${FRAMEWORK_NAME}" -configuration Release -arch x86_64 -arch i386 only_active_arch=no defines_module=yes -sdk "iphonesimulator"
# 5
# Remove .framework file if exists on Desktop from previous run.
if [ -d "${HOME}/Desktop/${FRAMEWORK_NAME}.framework" ]; then
rm -rf "${HOME}/Desktop/${FRAMEWORK_NAME}.framework"
fi
# 6
# Copy the device version of framework to Desktop.
cp -r "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework" "${HOME}/Desktop/${FRAMEWORK_NAME}.framework"
# 7
# Replace the framework executable within the framework with
# a new version created by merging the device and simulator
# frameworks' executables with lipo.
lipo -create -output "${HOME}/Desktop/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphoneos/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}" "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/${FRAMEWORK_NAME}"
# 8
# Copy the Swift module mappings for the simulator into the
# framework. The device mappings already exist from step 6.
#cp -r "${SRCROOT}/build/Release-iphonesimulator/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule/" "${HOME}/Desktop/${FRAMEWORK_NAME}.framework/Modules/${FRAMEWORK_NAME}.swiftmodule"
# 9
# Delete the most recent build.
if [ -d "${SRCROOT}/build" ]; then
rm -rf "${SRCROOT}/build"
fi
Как только ваша фреймворк находится на рабочем столе, если вы войдете внутрь, появится текстовый документ с тем же именем, что и ваша фреймворк. Если вы перейдете к этому и выполните команду "lipo -info" на нем в терминале, вы должны получить следующий вывод:
Architectures in the fat file: MyFramework are: armv7 armv7s i386 x86_64 arm64
Ответ 2
Не уверен, что существующие ответы помогут вам. Я просто дам свое решение. Сначала я хочу объяснить несколько важных этапов сборки.
Целевые зависимости
Если вы хотите перестраивать свой собственный фреймворк (который вы связали с одним и тем же рабочим пространством) каждый раз, когда вы создаете хост-приложение. Вам нужно будет добавить цель фреймворка здесь.
Связать двоичные файлы с библиотеками
Если вы хотите использовать свою библиотеку в своем коде (скажем, вы хотите сделать import MyFramework
), то вам нужно связать ее на этом этапе.
Встраивать рамки
Это сложная часть. Внедрить означает объединить фреймворк с вашим приложением при распространении. Для системной платформы, такой как AVFoundation
, вам не нужно встраивать ее в ваше приложение, поскольку она уже существует внутри операционной системы iOS. Однако для пользовательских платформ или сторонних платформ вам нужно будет встроить их в комплект приложений, чтобы при развертывании приложения на устройстве приложение могло его действительно найти. Поэтому, если вы используете Cocoapods
или Carthage
, у них всех есть дополнительная фаза сборки для копирования платформ в комплект приложений. (Для Cocoapods
он называется Embed Pods Framework, а для Carthage
это действие, которое запускает скрипт copy-frameworks
). Так что для своей пользовательской среды вы либо будете использовать существующую сборку Embed Frameworks
фазы или создайте новую фазу сценария запуска, чтобы скопировать платформы в ваш пакет приложений.
- Обновление 2017-05-17 -
Что касается структуры встраивания, то недавно я обнаружил еще один важный факт:
Вы можете использовать file PATH/TO/Framework
, чтобы проверить, является ли фреймворк статическим или динамическим. Подробности смотрите в этом вопросе о стеке.
Динамические рамки
Только динамические рамки должны быть встроены в приложение. К ним относятся те, которые созданы Carthage
и Cocoapods
. Если вы откроете пакет приложений после того, как соберете свой проект, там будет папка Frameworks
, содержащая все ваши встроенные фреймворки, и вы найдете те, которые были созданы Carthage и Cocoapods, а также те, которые вы указали на этапе Embed Framework.
Статические рамки
Так что теперь вы можете задаться вопросом, где эти статические структуры? Как мы можем использовать его, если он отсутствует в комплекте приложений? Вы правы. Они находятся в комплекте, но не в папке Frameworks
. Они были объединены в исполняемый файл вашего приложения. Если вы проверите размер исполняемого файла, вы поймете, что каждый раз, когда вы добавляете статический фреймворк к своей цели, он будет увеличиваться.
Статические фреймворки не нужно встраивать (просто связать их), это как файл .swift
или .xib
, который будет скомпилирован в ваш исполняемый файл.
И затем, есть еще один шаг, прежде чем вы сможете использовать любой фреймворк. Framework Search Paths
внутри цели Настройки сборки. Опять же, если вы посмотрите на Carthage
или Cocoapods
, все они добавляют дополнительные пути в этот параметр. Это сообщает Xcode (или базовому компилятору), где найти эти связанные или встроенные фреймворки.
Поэтому каждый раз, когда вы захотите использовать фреймворк, убедитесь, что вы думаете о вышеупомянутых настройках, и все готово. Я использовал этот метод некоторое время и чувствую себя более уверенно, когда сталкиваюсь с какой-либо проблемой со связыванием.
Наконец, есть очень важная статья от Apple, которую вы должны прочитать https://developer.apple.com/library/content/technotes/tn2435/_index.html
Ответ 3
У меня была точно такая же проблема.
Если вы используете расширение приложения, подобное мне, и сообщение об ошибке архива связано только с расширением приложения.
Помните, что вы должны вручную добавить свою пользовательскую платформу в раздел "Связанные фреймворки и библиотеки" вашего расширения приложения.
![example pic]()
Ответ 4
Надеюсь, это поможет вам
- Выберите ваш проект в Targets.
2. Затем найдите Пропустить установку.
- Измените это на НЕТ.
- Затем заархивируйте ваш собственный фреймворк. (обязательно используйте Generic iOS Device) в качестве целевого устройства.
- Экспортируйте это куда
ты хочешь. Тогда используйте это с вашим проектом.