Как создать структуру разработки в iOS, включая Swift?

Моя цель в этом заключалась в создании инфраструктуры iOS, которая включает в себя как Swift, так и Objective-C, которые я мог бы использовать в своих проектах разработки. Характер этой структуры заключается в том, что сама инфраструктура развивается. Поэтому было важно, чтобы каждый раз, когда я строил проект с использованием этой структуры (я буду называть проекты с использованием структуры "используя" проекты из-за отсутствия лучшего термина), я хотел убедиться, что сама структура была перестроена. Я хотел, чтобы это было основой, потому что у меня есть несколько приложений, через которые я хочу использовать один и тот же код. Я боролся с этим за хороший кусок сегодня и потратил много времени на то, что должно было быть, по крайней мере, в моих мыслях. Итак, я поделюсь своим процессом.

Ответ 1

Первое, что нужно наблюдать (это, конечно же, не мое первое наблюдение!) заключается в том, что вы не можете сделать это, используя статическую библиотеку под iOS. Xcode не позволит использовать Swift в статической структуре. Попробуйте. Xcode отклонит ваши пожелания!

В этом процессе я закончил. Две основные проблемы, с которыми мне пришлось столкнуться, заключались в следующем: (i) сделать Xcode ссылку на структуру в проекте использования без ошибок и (ii) получить доступ к заголовкам структуры в проекте использования. В освещенном взгляде Apple эти два вопроса являются отдельными. Обратите внимание на сарказм.;.)

1) Создайте Cocoa Touch Framework с помощью Xcode. Я считаю, что это работает с Xcode6 и Xcode7. Использование:

Файл > Создать > Проект > iOS > Рамки и библиотеки > Cocoa Нажмите Framework

Я использую Xcode7. (Не делайте Cocoa Touch Static Library - как я уже говорил выше, Xcode не позволит вам включать Swift в статические библиотеки).

2) С помощью классов Swift убедитесь, что члены и функции являются общедоступными. Я не экспериментировал с этим, но кажется, что публичный атрибут необходим для того, чтобы члены и функции были видимыми для пользователей фреймворка.

3) Добавьте все классы Swift (и Objective-C), которые вы хотите использовать в своей структуре.

4) Закройте этот проект. (Тот же проект не может быть открыт дважды в Xcode, и вам нужно включить структуру в свой следующий проект).

5) Откройте свой проект в Xcode. Для меня это был существующий универсальный проект приложения. Возможно, вы создаете новый проект. В любом случае перетащите файл .xcodeproj вашего проекта framework в Finder в ваш проект.

6) Внутри используемого проекта откройте проект фреймворка. И перетащите файл фреймворка в Embed Frameworks на этапах сборки (раздел Embed Frameworks не присутствовал на этапах сборки, когда я впервые начал свои эксперименты, и еще не знаю, какое волшебство вызвало его появление!).

введите описание изображения здесь

Эти шаги до сих пор должны позволять вам создавать и связывать, фактически не интегрируя использование вашего библиотечного кода. (Я использовал https://github.com/RadiusNetworks/swift-framework-example для некоторых моих тестов).

7) Теперь для coup de grace: Под Build Settings найдите Framework Search Paths. И добавьте:

${TARGET_BUILD_DIR}/YourFrameworkName.framework

(Кажется, вам не обязательно иметь это обозначение как рекурсивное).

8) В ваших файлах Swift с использованием фреймворка вам нужно добавить импорт вверху каждого файла:

import YourFrameworkName

Теперь вы можете создавать и связывать свою новую библиотеку!

9) Еще один вопрос: убедитесь, что ваш Deployment Target для вашей рамки соответствует вашему целевому проекту. Например, если ваш проект будет создан для iOS7, убедитесь, что ваша структура построена для iOS7 или ранее.

10) Second gotcha (10/23/15): Я только что узнал, что для моей фреймворка необходимо иметь "App-Swift.h" (имя, которое я использую для этого) в качестве заголовка Objective-C сгенерированного интерфейса имя в настройках сборки. Когда я взял это (Objective-C Generated Interface Header) (пытаясь исправить еще одну проблему), я получаю серверные интересные проблемы, возникающие в App-Swift.h. Эти проблемы выглядят примерно так: "Невозможно найти объявление интерфейса для NSObject" ?

11) Третий вопрос (10/29/15): Когда я попытался загрузить свое первое приложение в iTunes Connect, которое использует эту платформу, я получил ошибку при загрузке. Ошибка:

ОШИБКА ITMS-90206: "Недействительный пакет. 'Your.app/Frameworks/YourFramework.framework' содержит запрещенный файл 'Каркасы'".

Различные SO и другие сообщения попали в эту ошибку, и трюк для меня был для целевой среды Framework в настройках сборки, чтобы установить "Встроенный контент содержит Swift Code" в NO. (У моего приложения Build Settings этот флаг уже установлен на NO).

Пример проекта, в котором выполняется большинство этих шагов, находится на https://github.com/crspybits/CocoaTouchFramework.git

Ответ 2

Swift для потребителей → Динамические рамки Swift

Версия Xcode 10.2.1

Создать фреймворк Swift

Создайте каркасный проект или создайте целевой каркас

File -> New -> Project... -> Cocoa Touch Framework
//or
Project editor -> Add a Target -> Cocoa Touch Framework

Будут созданы два файла:

  1. Info.plist - Build Settings -> Info.plist File
  2. <product_name>.h - Build Phases -> Headers. Это заголовочный файл зонтика [About]

Добавить файлы .swift

Select '.swift' file -> Select File Inspectors Tab -> Target Membership -> Select the target
//or
Project editor -> select a target -> Build Phases -> Compile Sources -> add files

Сборка библиотеки - ⌘ Command + B или Product -> Build

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

Найти сгенерированный вывод[Build location]

Products group -> <product_name>.framework -> Show in Finder

Структура включает в себя

  • Info.plist
  • Папка Modules с:
    • module.modulemap[About] [Custom modulemap] Этот файл был создан автоматически, поскольку Build Settings -> Defines Module -> YES
    • Папка <product_name>.swiftmodule с
      • .swiftdoc - документы
      • .swiftmodule - общедоступный интерфейс/определения
  • Папка Headers с:
    • файлы из раздела Headers. Есть открытые интерфейсы/определения
    • <product_name>-Swift.h - сгенерированный Xcode файл заголовка[About]

Использование фреймворка Swift

Drag and drop двоичный файл в проект Xcode[About]

Embed binaries[Library not loaded] [Link vs Embed]

Project editor -> select a target -> General -> Embedded Binaries -> path to '<product_name>.framework' file

Я автоматически добавлю фреймворк в:

  1. Project editor -> select a target -> General -> Linked Frameworks and Libraries
  2. Project editor -> select a target -> Build Phases -> Embed Frameworks
  3. Project editor -> select a target -> Build Phases -> Link Binary With Libraries

Добавить Framework Search paths[Module not found] [Recursive path]

Project editor -> select a target -> Build Settings -> Search Paths -> Framework Search paths -> add path to the parent of '<product_name>.framework' file

Импортировать модуль в код клиента Swift[module_name]

@import module_name

Больше примеров здесь