Как архивировать приложение, которое включает настраиваемую структуру?

У меня есть проект рамки 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

Надеюсь, это поможет вам

  1. Выберите ваш проект в Targets. 2. Затем найдите Пропустить установку.
  2. Измените это на НЕТ.
  3. Затем заархивируйте ваш собственный фреймворк. (обязательно используйте Generic iOS Device) в качестве целевого устройства.
  4. Экспортируйте это куда ты хочешь. Тогда используйте это с вашим проектом.