Xcode 6 iOS Создание Cocoa Touch Framework - проблемы с архитектурой

Я пытаюсь создать динамическую структуру для приложения iOS. Благодаря новой версии Xcode (6) мы можем выбрать Cocoa Touch Framework при создании нового проекта, и больше нет необходимости добавлять совокупную цель, запускать скрипт и так далее. У меня нет проблем, когда я строю фреймворк. Но когда я пытаюсь использовать его в приложении iOS, у меня возникают некоторые проблемы с архитектурой.

ld: warning: ignoring file /Library/Frameworks/MyFramework.framework/MyFramework, file was built for x86_64 which is not the architecture being linked (arm64): /Library/Frameworks/MyFramework.framework/MyFramework
Undefined symbols for architecture arm64:
  "_OBJC_CLASS_$_MyFrameworkWebService", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)

ld: warning: ignoring file /Library/Frameworks/MyFramework.framework/MyFramework, file was built for x86_64 which is not the architecture being linked (armv7): /Library/Frameworks/MyFramework.framework/MyFramework
Undefined symbols for architecture armv7:
  "_OBJC_CLASS_$_MyFrameworkWebService", referenced from:
      objc-class-ref in AppDelegate.o
ld: symbol(s) not found for architecture armv7
clang: error: linker command failed with exit code 1 (use -v to see invocation)

Ну, я попытался изменить настройки проекта и цели фреймворка (Архитектуры и построить только действительную архитектуру и действительные архитектуры). Я сделал то же самое для проекта приложения iOS, но ничего не работает. Думаю, я чего-то не понял.

Например, когда я создаю фреймворк только для проверки i386 (iOS Simulator) с помощью командной строки «xcrun lipo -info MyFramework», у меня возникает проблема, которая

ld: предупреждение: игнорируется файл /Library/Frameworks/MyFramework.framework/MyFramework, файл был создан для x86_64, который не является связанной архитектурой (i386)...

Если кто-то может помочь мне получить структуру, которая работает для всех архитектур iOS, включая симуляторы.


person François Delaplace    schedule 04.06.2014    source источник
comment
Если вы собираетесь опубликовать универсальный фреймворк для CocoaPods, я написал для этого подробное руководство: eladnava.com/   -  person Elad Nava    schedule 19.10.2016
comment
Я столкнулся с той же проблемой в одной из задач проекта, и я исправил ее после множества исследований и разработок и шагов, упомянутых в ссылке здесь.   -  person Sandip Patel - SM    schedule 07.03.2017


Ответы (10)


Основываясь на всех ответах, публикация на raywenderlich.com и gist, созданный Крис Конвей Я придумал это.

Выполнив следующие шаги, я смог создать платформу Cocoa Touch (включая файлы Swift и Objective-C), которая содержит все архитектуры как для симулятора, так и для устройства:

  1. Создайте новую (совокупную) цель в проекте вашего фреймворка.
  2. В разделе «Фазы сборки» выберите «Добавить сценарий запуска» и скопируйте содержимое этот файл
  3. Выберите Общую цель в раскрывающемся списке Схема.
  4. Создайте цель для агрегированной схемы

Надеюсь, поможет :)

ОБНОВЛЕНИЕ: исправлена ​​ошибка в сути, из-за которой пути на шаге 3 были неверными. Спасибо Токурику!!

ОБНОВЛЕНИЕ В Xcode 7 и 8 нажмите «Файл»> «Создать»> «Цель...» и выберите группу «Другое», чтобы выбрать «Совокупная цель».

person cromandini    schedule 01.11.2014
comment
Отличный пост! Вопрос: Что, если я хочу построить фреймворк для Objective-C? Можете ли вы предоставить соответствующий сценарий? - person Fengson; 10.04.2015
comment
Да, меня тоже интересует скрипт агрегатора ObjectiveC - person androniennn; 10.04.2015
comment
Этот скрипт не работает с xcworkspace. И, к сожалению, нет способа получить имя схемы из Настройки сборки Xcode. Если кто-то нашел решение - пожалуйста, дайте мне знать! - person skywinder; 15.04.2015
comment
Привет! Только что обновил суть, чтобы он проверял наличие папки FrameworkName.swiftmodule, прежде чем пытаться ее скопировать. Это предотвращает ошибку, когда фреймворк не содержит кода Swift, и делает его пригодным для использования только для фреймворков Objective-C. - person cromandini; 22.04.2015
comment
отлично работает, но мне пришлось добавить различные параметры -arch, чтобы собрать все архитектуры, поскольку armv7s каким-то образом не был построен. - person Gianluca P.; 26.06.2015
comment
Это там. В Xcode 7 нажмите «Файл»> «Создать»> «Цель...» и выберите «Другая группа», вы ее увидите. - person cromandini; 28.09.2015
comment
@cromandini Я пробовал ваши инструкции, я всегда получаю подобную ошибку. Не удалось выполнить следующие команды сборки: Ld build/sampleSDK.build/Debug-iphonesimulator/sampleSDK.build/Objects-normal/i386/sampleSDK normal i386 Ld build/sampleSDK.build /Debug-iphonesimulator/sampleSDK.build/Objects-normal/x86_64/sampleSDK normal x86_64 (2 сбоя) фатальная ошибка: lipo: невозможно открыть входной файл: (Нет такого файла или каталога) Команда /bin/sh выдала ошибки, но сделала не возвращать ненулевой код выхода, чтобы указать на сбой - person Ravindhiran; 22.02.2017
comment
Привет, я успешно построил фреймворк с вашими инструкциями в Xcode 8.3. Будут ли проблемы, когда мы выпустим фреймворк в AppStore? - person Lion; 23.08.2017
comment
следил за шагами!! работает нормально с одной попытки.... Спасибо, ребята за помощь. - person Muhammad Rizwan; 05.05.2018

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

Рабочее пространство:

  • Создайте рабочее пространство.

Каркасный проект:

  • Создайте проект iOS Cocoa touch Framework внутри Workspace.
  • Добавьте простой класс Objective C MyClass (заголовок .h и файл реализации .m) и создайте метод - (void)greetings.
  • Перейти к проекту Этапы сборки > Заголовки > Переместить MyClass.h из Project в Public .
  • Измените схему на фреймворк и выберите симулятор iOS, а затем выполните сборку. (Выберите Устройство iOS, если приложение, интегрирующее эту платформу, работает на устройстве. В этом примере я буду продолжать использовать симулятор.)
  • У вас не должно возникнуть проблем со сборкой, сборка фреймворка находится в вашем каталоге Производные данные, который вы можете найти в Органайзере.

Проект приложения:

  • Создайте приложение Swift Single View внутри Workspace.
  • Перетащите над сборкой платформы симулятора iOS (находится в Debug-iphonesimulator или Release-iphonesimulator) в свой проект.
  • Создайте связующий заголовок, чтобы предоставить Swift методы класса Objective C.
  • Импортируйте MyClass.h в файл заголовка моста.
  • Обратите внимание: если определение MyClass не найдено, добавьте путь Заголовки фреймворка к настройкам сборки Пути поиска заголовков.
  • Создайте экземпляр MyClass в viewDidLoad ViewController.swift, затем вызовите greetings.
  • Добавить фреймворк в Target > Embedded Binaries
  • Измените схему на проект приложения и выберите Симулятор iOS, а затем выполните сборку.
  • Вы должны увидеть приветственные сообщения.

Обратите внимание, что в приведенном выше примере показано, как создать приложение, работающее в симуляторе. Если вам нужно создать универсальную статическую библиотеку, которая работает как на симуляторе, так и на устройствах, выполните следующие действия:

  • Сборка библиотеки для симулятора
  • Создать библиотеку для устройства
  • Объедините их с помощью липосакции.

В Интернете есть хорошие ссылки на это, здесь например.

Создайте универсальный двоичный файл для фреймворка: перейдите в каталог производных данных фреймворка, затем /Build/Products. Следующая команда поможет вам создать универсальный двоичный файл в каталоге Products:

lipo -create -output "framework-test-01-universal" "Debug-iphonesimulator/framework-test-01.framework/framework-test-01" "Debug-iphoneos/framework-test-01.framework/framework-test-01" 

Обратите внимание, что framework-test-01 — это имя моего проекта фреймворка.

person vladof81    schedule 18.06.2014
comment
Можно ли создать фреймворк, используя быстрые файлы вместо класса Objective C, как указано на втором этапе проекта Framework выше? - person Chris Conway; 31.07.2014
comment
@Chris Conway, это кажется невозможным, как обсуждалось здесь, но я видел статьи об импорте быстрых модулей, например здесь. Надеюсь, поможет. - person vladof81; 01.08.2014
comment
Спасибо, @vladof, я видел оба обсуждения, о которых вы упоминали выше, но надеялся, что с каждым бета-инкрементом дела пойдут лучше. Можно было бы подумать, что Apple поддержит создание фреймворков с использованием Swift, поскольку это один из вариантов, доступных в пользовательском интерфейсе создания проекта. - person Chris Conway; 01.08.2014
comment
@Chris Conway, я согласен, крайне важно поддерживать быструю структуру. (Это может быть приостановлено с учетом распространения бета-версии программного обеспечения.) - person vladof81; 05.08.2014
comment
Спасибо за ваши комментарии! Я пошел и попытался создать универсальный фреймворк с помощью предложенного вами инструмента lipo, но когда я добавляю сгенерированный исполняемый файл в проект, он не может найти заголовки. Добавление одной платформы работает нормально, но я не могу переключаться между устройством и симулятором без ошибок компиляции. Удалось ли вам успешно использовать универсальный исполняемый файл в приложении? - person Chris Conway; 07.08.2014
comment
@Chris Conway, я помню, мне немного повезло запустить приложение (встроенная платформа создана для iphoneos) на устройствах с бета-версией 1, и то же приложение отлично работает на симуляторе. Мне даже не нужно было липировать бинарники. С тех пор я не пробовал другие бета-версии. Я бы предположил, что Product Archive в фреймворке делает дистрибутивную упаковку, которая, однако, работает только для небыстрого фреймворка. - person vladof81; 08.08.2014
comment
Спасибо @vladof, я смог заставить его работать с последней бета-версией (5), используя инструмент lipo и некоторые файлы. Дайте мне знать, если у вас когда-нибудь возникнут проблемы, и я могу отправить вам суть того, что я сделал. - person Chris Conway; 10.08.2014
comment
@Chris Conway, это круто, я хочу разобраться в этом. Вы не возражаете? Спасибо. - person vladof81; 10.08.2014
comment
Итак, что мне нужно было сделать, так это добавить цель Aggregate в мой проект, добавить сценарий запуска к этапам сборки, и я использовал этот смысл в качестве сценария: gist.github.com/cconway25/7ff167c6f98da33c5352 - person Chris Conway; 11.08.2014
comment
В качестве продолжения инструмент lipo генерирует исполняемый файл, но этого файла недостаточно, чтобы использовать его в качестве основы. Поэтому я использовал структуру папки и файла фреймворка обычной сборки фреймворка и заменил исполняемый файл в папке фреймворка на тот, который генерирует инструмент lipo. Это позволяет мне перетащить фреймворк в другой проект и построить его как на симуляторе, так и на устройстве. - person Chris Conway; 11.08.2014
comment
@ChrisConway - Просто чтобы убедиться, что я тебя понимаю. Мы использовали Universal Frameworks уже более года, и последняя версия сломала наши SDK. Последнее слово заключается в том, что вам больше не нужно добавлять цель Aggregate и запускать фазу сборки скрипта. Итак, вы говорите, что вам нужно было добавить это в свою универсальную структуру? Так действительно ли единственная разница, сценарий? Или вы можете рассказать мне о других отличиях, чтобы я мог быстро изменить свои существующие универсальные фреймворки для работы с последней версией iOS и Xcode. Миллион спасибо за ответ. - person Patricia; 15.10.2014
comment
@ChrisConway - я только что задал вопрос по этой теме здесь: stackoverflow.com/q/26389002/1735836 - person Patricia; 15.10.2014
comment
@ vladof81 - я пытался последовать вашему примеру, чтобы просто создать проект Workspace and Framework, но когда я пытаюсь очистить или построить, я получаю эту ошибку: google.com/ Я не могу найти никакой информации по этому поводу. Как вы заставили свою построить? - person Patricia; 17.10.2014
comment
@ Люси, у вас могут быть специальные символы в названии продукта $(TARGET_NAME) в настройках сборки, старайтесь не использовать их. - person vladof81; 17.10.2014
comment
Ты прав! Раньше мой проект содержал -iOS в названии; последняя версия, похоже, не любит тире. - person Patricia; 18.10.2014
comment
@ vladof81 - Вы исследовали / использовали агрегированную цель со сценарием запуска сборки, о котором Крис упоминает выше? - person Patricia; 18.10.2014
comment
@vladof81 - Вам помогло? Я последовал инструкциям Криса и добавил цель Aggregate с помощью сценария запуска сборки, но я все еще не вижу продукта (Debug/Release)-iphoneuniveral. Должен ли я иметь этот продукт? Вы когда-нибудь заставляли это работать? Я смущен. - person Patricia; 27.10.2014
comment
@vladof81 - А-ха! Я забыл выбрать схему Aggregate для сборки и запуска! Но у меня все еще есть проблемы со сценарием сборки: фатальная ошибка: lipo: не удается открыть входной файл: /Users/pdl/Library/Developer/Xcode/DerivedData/License-blnxjfvoxnqfelfmzojgdwhvazk/Build/Products/Debug-iphonesimulator/License .framework/License (Нет такого файла или каталога) - person Patricia; 27.10.2014
comment
@vladof81 - Привет, снова я! Я создал новый вопрос, на который вы, возможно, сможете ответить. Я и коллега, кажется, не можем понять одну и ту же страницу. Можете ли вы помочь решить нашу путаницу? Здесь: stackoverflow.com/q/27136107/1735836 - person Patricia; 26.11.2014
comment
@chris-conway Кажется, этот скрипт не работает с xcworkspace. И, к сожалению, нет способа получить имя схемы из Настройки сборки Xcode. Если кто-то нашел решение - пожалуйста - дайте мне знать! - person skywinder; 15.04.2015
comment
@ vladof81, почему используется только Debug-? Подходит ли фреймворк, созданный с помощью этой команды, для использования со сборками AppStore/AdHoc? - person Yevhen Dubinin; 02.06.2016

То, как я это сделал, похоже на vladof, но, надеюсь, немного проще. Я сделал фреймворк подпроектом проекта приложения.

Рамочный проект

  • Создайте новую iOS Cocoa Touch Framework. Назовите это MyLib. Это создаст один MyLib.h
  • Добавьте простой класс Cocoa Touch Obj-C, MyClass (.h & .m) и в реализации .m создайте метод, который возвращает строку, - (NSString *) приветствия;
  • В MyLib.h добавьте это внизу, #import "MyClass.h"
  • В разделе Build Phases/Headers переместите MyClass.h из раздела Project в раздел Public.
  • Выполнить сборку (cmd-B)
  • Закрыть проект

Проект приложения

  • Создайте новый проект приложения Single View, либо Swift, либо Obj-C. Назовите это MyApp.
  • Из Finder перетащите файл проекта MyLib в левый раздел органайзера окна MyApp и убедитесь, что строка вставки находится чуть ниже MyApp. Это делает MyLib подпроектом MyApp. (Его можно использовать таким же образом в других проектах)
  • Щелкните MyApp в органайзере, затем выберите цель MyApp и выберите этапы сборки.
  • В целевых зависимостях щелкните знак + и добавьте MyLib.
  • В Link with Libraries нажмите знак + и добавьте MyLib.framework.

Для приложения Obj-C

  • В ViewController.m добавьте #import
  • В viewDidLoad добавьте следующие строки:
  • MyLib *x = [[MyLib alloc] init];
  • NSLog(@"%@", x.greetings);
  • Запустите проект, и вы должны увидеть сообщение в окне отладки. -

Для приложения Swift

  • В ViewController.swift добавьте импорт MyLib
  • в viewDidLoad добавьте следующие строки:
  • переменная x: MyLib = MyLib()
  • println("(x.приветствия())") -

Делая это таким образом, приложение зависит от фреймворка, поэтому, если вы вносите изменения в классы фреймворка, вам не нужно менять цели для отдельной сборки фреймворка, он просто сначала скомпилирует фреймворк, а затем приложение.

person pizzafilms    schedule 24.06.2014
comment
Это кажется подходящим для небольшого числа проектов, в которые вы хотите включить фреймворк. Однако у вас нет возможности поддерживать разные версии скомпилированного фреймворка, что будет проблемой в более крупных проектах. - person Quxflux; 29.06.2014
comment
Хорошо работает для меня! Единственное, что мне нужно было изменить, это установить для Defines Module значение YES в настройках сборки родительской цели (в данном случае это будет цель MyApp) - person bdev; 16.07.2014

Я немного изменил чей-то скрипт, чтобы он поддерживал все архитектуры симулятора:

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

# make sure the output directory exists
mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"

# 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}" ONLY_ACTIVE_ARCH=NO -configuration ${CONFIGURATION} -sdk iphonesimulator VALID_ARCHS="x86_64 i386" BUILD_DIR="${BUILD_DIR}" BUILD_ROOT="${BUILD_ROOT}" clean build

# Step 2. Copy the framework structure to the universal folder
cp -R "${BUILD_DIR}/${CONFIGURATION}-iphoneos/${PROJECT_NAME}.framework" "${UNIVERSAL_OUTPUTFOLDER}/"

# Step 3. 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 4. Convenience step to copy the framework to the project's directory
cp -R "${UNIVERSAL_OUTPUTFOLDER}/${PROJECT_NAME}.framework" "${PROJECT_DIR}"

# Step 5. Delete temporary build directory in the project's directory
rm -rf "${PROJECT_DIR}/build"

# Step 6. Convenience step to open the project's directory in Finder
open "${PROJECT_DIR}"
person Nadzeya    schedule 10.07.2015

Старое видео, которое я сделал, так как приведенная выше ссылка больше недоступна.

Как создать Cocoa Touch Framework с помощью Xcode 6

person naz    schedule 02.12.2014
comment
Эта ссылка больше недоступна. - person brduca; 06.02.2018
comment
@Brduca Попробуйте видео на YouTube - person naz; 07.02.2018

Несколько дополнительных моментов вокруг подхода, разделяемого vladof, которые более применимы к платформам на основе Swift.

  1. Сценарий в связанной ссылке нуждается в модификации для копирования всех файлов как с iphonesimulator, так и с iphoneos, поскольку у Swift есть отдельные скомпилированные файлы для arm и i386.
  2. Убедитесь, что у вас есть ARCHS="x86_64" ONLY_ACTIVE_ARCH=NO в сборке для iphonesimulator, чтобы избежать проблем с компоновщиком для симулятора.
  3. Убедитесь, что ваш интерфейс/класс расширяет NSObject, иначе вы столкнетесь с проблемами при попытке использовать код в swift (он будет жаловаться на невозможность создать объект с помощью ().
person jhash    schedule 06.07.2014

Наконец-то я заставил его работать на меня! И извините за большую желтую рамку, я понятия не имею, как ее лучше отформатировать.

Решение пришло от Клаудио Романди, но в связанном сценарии есть небольшая проблема. Я не могу прокомментировать его пост, потому что мне нужно 50 репутации, поэтому у меня не остается другого выбора, кроме как скопировать его пост, чтобы получить полное решение.

  1. Создайте новую (совокупную) цель в вашем проекте Framework.
  2. Выберите «Агрегат» в рабочей области и добавьте «Новую фазу запуска сценария».
  3. Поместите в него следующий код:

    #!/bin/sh
    
    UNIVERSAL_OUTPUTFOLDER=${BUILD_DIR}/${CONFIGURATION}-universal
    
    # make sure the output directory exists mkdir -p "${UNIVERSAL_OUTPUTFOLDER}"
    
    # 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'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}"
    
  4. Выберите агрегат в раскрывающемся списке выбора схемы.

  5. Готово!

Проблема заключалась в том, что каталог симулятора указывал на несуществующий каталог, изменение «Framework» на «$ {PROJECT_NAME}» в 2 местах помогло :)

person Tokuriku    schedule 17.01.2015
comment
строка 9: -sdk: команда не найдена ------ строка 16: -output: команда не найдена - person androniennn; 10.04.2015
comment
есть ли способ запустить такой скрипт для xcworkspace? - person skywinder; 15.04.2015

Хотел добавить кое-что к ответу на липо-скрипт, предоставленному skywinder здесь. Я следовал инструкциям, но все еще не мог заставить свою структуру работать на симуляторе, только на устройстве. Чтобы это исправить:

- Я зашел в версию фреймворка для отладки-iphonesimulator и в Modules/[FrameworkName].swiftmodule скопировал все файлы i386 и X86.

- Затем я зашел в только что созданную толстую версию фреймворка и перешел в ту же папку. Я вставил файлы i386 и X86 (чтобы использовать файлы ARM, которые уже были там), а затем добавил в свой проект свой толстый фреймворк.

Вуаля, она работает на симуляторе и на реальном устройстве! Это Xcode 10/Swift 4.2, кстати.

person yousefnjr    schedule 25.10.2018

Этот вопрос был опубликован некоторое время назад (Xcode 6), но недавно я столкнулся с той же проблемой с Xcode 10.

Итак, проблема в том, что встроенный фреймворк не поддерживает достаточное количество архитектур.

Если кто-то не знает, что означают архитектуры, разные устройства iPhone имеют разные архитектуры, вот полный список:

  • arm6: iPhone 1, 2, 3G
  • arm7: используется в самых старых устройствах с поддержкой iOS 7 [32 бит]. айфон 4, 4с
  • arm7s: используется в iPhone 5 и 5C [32 бит]. айфон 5, 5с
  • arm64: для 64-битного процессора ARM в iPhone 5S [64-битный]. айфон 5s и выше.
  • arm64e: используется на чипсете A12. iPhone XS/XS Макс/XR
  • i386: для 32-битного симулятора
  • x86_64: используется в 64-битном симуляторе.

Итак, если вы используете фреймворк на симуляторе, фреймворк должен поддерживать либо i386, либо x86_64; если вы запускаете свое приложение на iPhone 6, платформа должна поддерживать архитектуру arm64.

Поэтому в большинстве случаев фреймворк должен поддерживать все вышеупомянутые архитектуры.

Теперь вернемся к тому, как решить проблему. Нам нужно построить фреймворк как для устройств, так и для симуляторов.

Как создавать для устройств:

  1. В «Общие» укажите «Цель развертывания».
  2. В «Настройках сборки» установите «Только для сборки активных архитектур» на «Нет».
  3. В «Настройки сборки» убедитесь, что в разделе «Действительные архитектуры» перечислены все необходимые вам архитектуры. Обычно мы просто используем параметры по умолчанию (arm64, arm64e, armv7, armv7s).
  4. Перейдите в «Редактировать схему» -> «Выполнить» -> «Конфигурация сборки», измените «Конфигурация сборки» на «Выпуск».
  5. Выберите активную схему «Универсальное устройство iOS». Нажмите Cmd+B, чтобы построить проект.
  6. Щелкните правой кнопкой мыши [MyFrameworkProject].framework в папке «Продукты» в вашем проекте Xcode и нажмите «Показать в Finder». [MyFrameworkProject].framework поддерживает все архитектуры, указанные на шаге 2.
  7. Перетащите [MyFrameworkProject].framework в проект, который должен использовать этот фреймворк. Кроме того, перетащите [MyFrameworkProject].framework также во «Встроенные двоичные файлы».

Как строить для симуляторов:

  1. Шаги с 1 по 4 аналогичны предыдущему.
  2. Выберите любой симулятор в качестве активной схемы. Нажмите Cmd+B, чтобы построить проект.
  3. Шаги с 6 по 7 аналогичны предыдущему.

Как строить для устройств и симуляторов:

После того, как у вас есть фреймворк для устройств, вам нужно будет объединить фреймворк для симуляторов и фреймворк для устройств вместе с командой «lipo». Переименуйте фреймворк для симуляторов в [MyFrameworkProject]_sim.framework и скопируйте оба фреймворка в одну папку. Запустите команду ниже в Терминале (убедитесь, что вы находитесь в папке):

lipo -create -output [MyFrameworkProject].framework/[MyFrameworkProject] [MyFrameworkProject].framework/MyFrameworkProject [MyFrameworkProject]_sim.framework/MyFrameworkProject

Теперь [MyFrameworkProject].framework — это конечный продукт, поддерживающий как симуляторы, так и устройства.

person nyus2006    schedule 08.01.2019

Извините, что так долго открывал эту тему... Некоторые из вас правильно ответили на мой вопрос. Когда я писал этот вопрос, я не понял, что в полной (также называемой толстой) структуре (готовой к использованию) было два фрагмента. Один для устройств iOS и один для симулятора. Когда я обнаружил это, я создал скрипт с помощью команды lipo для слияния двух срезов и автоматически получил полную структуру.

person François Delaplace    schedule 05.03.2018