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

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

1 ответ

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

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

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

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

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

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

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

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

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

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

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

7) Теперь для государственного переворота: под Build Settings, ищи Framework Search Paths, И добавить в:

${TARGET_BUILD_DIR}/YourFrameworkName.framework

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

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

import YourFrameworkName

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

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

10) Вторая ошибка (23.10.15): я только что узнал, что моей инфраструктуре необходимо иметь "App-Swift.h" (имя, которое я использую для этого) в качестве имени заголовка сгенерированного интерфейса Objective-C в Build Настройки. Когда я удалил это (сгенерированный заголовок интерфейса Objective-C) (пытаясь исправить другую проблему), в App-Swift.h я обнаружил несколько интересных проблем. Эти проблемы выглядят примерно так: "Не удается найти объявление интерфейса для NSObject"?

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

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

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

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

Потребитель 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. Это заголовочный файл зонтика [О программе]

Добавить файлы .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

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

Найти сгенерированные выходные данные [Место сборки]

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

Фреймворк включает

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

Потребитель Swift с фреймворком Swift

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

Embed dynamic binary(или не вставлять || связывать статический двоичный файл) [Ссылка против вставки ] [Библиотека не загружена]

//Xcode 11
Project editor -> select a target -> General -> Frameworks, Libraries, and Embedded Content -> path to `<product_name>.framework` -> Embed

//pre Xcode 11
Project editor -> select a target -> General -> Embedded Binaries -> path to `<product_name>.framework`

добавлять Framework Search paths [Модуль не найден] [Рекурсивный путь]

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

Импортировать модуль в клиентский код Swift [имя_модуля]

@import module_name

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

Другие вопросы по тегам