Разработка приложений для iOS

Как создать свой собственный фреймворк для вашего iOS-приложения

В этом руководстве мы создадим основу для вашего приложения. Это хороший способ разделить ваше приложение на независимые модули и позволить повторно использовать ваш код в разных приложениях.

В этом руководстве мы используем последнюю версию Xcode (11.3.1) и macOS Catalina (10.15.4) на момент написания.

Обычно рекомендуется разделить приложение на отдельные части. Это позволяет вам сделать ваши модули еще более независимыми, тестировать их по отдельности, повторно использовать код и даже создавать независимые фреймворки и доставлять их в ваше приложение с помощью Swift Package Manager (SPM), CocoaPods или Carthage, поддерживающих разные версии для разных приложений.

Звучит потрясающе, правда? Но даже если это не так, давайте создадим новую структуру, и мы увидим, насколько она хороша.

Вы можете использовать это руководство отдельно, но в нем используются фреймворки SwiftUI и Combine, представленные Apple в 2019 году, поэтому, если у вас нет предыдущего опыта работы с этими фреймворками, я рекомендую взглянуть на предыдущие части, где мы создавали приложение, которое собираемся использовать в этом руководстве. В конце концов, эти фреймворки выглядят многообещающе и потрясающе.

Чтобы проверить остальные части, воспользуйтесь следующими ссылками:

  1. Начало работы со SwiftUI и объединение использования MVVM и протоколов для iOS.
  2. Создание приложения для iOS с помощью SwiftUI и объединение с использованием MVVM и протоколов.
  3. Создание приложения для iOS с помощью SwiftUI, Combine, MVVM и протоколов [Часть 3].
  4. Как создать свою собственную платформу для вашего приложения iOS (это руководство).
  5. Использование основных данных в вашем приложении SwiftUI с Combine, MVVM и протоколами.

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

Что мы узнаем

В качестве исходного кода у нас есть приложение, написанное с использованием SwiftUI и Combine. Он использует протоколы и MVVM. Проблема в том, что у приложения нет постоянного хранилища для своих данных. Но, к счастью, мы создали там протокол для нашего DataManager, который хранит все данные в массиве, поэтому мы можем заменить его другим и реализовать постоянное хранилище, не затрагивающее другие части проекта. Мы собираемся сделать это в следующем уроке, а теперь давайте займемся подготовкой.

К концу этого урока мы узнаем:

  • Как создавать фреймворки внутри проекта;
  • Как добавить другие фреймворки в качестве зависимости в приложение или в другой фреймворк;
  • Как использовать один фреймворк для iOS, watchOS, macOS, tvOS.

Мы подготовим все, чтобы добавить в приложение хранилище Core Data и использовать его вместо массива, который точно не является постоянным.

Начиная

Откройте проект, разработанный в предыдущих частях (или скачайте приложение здесь и откройте его в Xcode). Ваше приложение представляет собой список дел, вы можете создавать и запускать его, добавлять туда новые задачи и отмечать их как выполненные. Кроме того, вы можете переключаться между отображением или скрытием выполненных задач.

Как создать фреймворк

Теперь мы собираемся создать новый фреймворк. Эта структура будет содержать только протокол, описывающий, как должны работать наши помощники по базам данных. Через некоторое время мы создадим другую структуру специально для Core Data и приведем ее в соответствие с протоколом. В будущем, если мы изменим базу данных, мы заменим Core Data на Realm, SQL или что-то еще, поменяв только помощника.

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

Создать рабочее пространство

Начнем с создания рабочего пространства, в которое мы поместим наш проект и все модули, которые собираемся создать. На самом деле, когда ваше приложение растет, лучше импортировать ваши фреймворки в проект с помощью CocoaPods, Carthage или Swift Package Manager, но мы не будем рассказывать, как это сделать в этом руководстве, поэтому мы пойдем более простым путем.

Выберите Файл - Новый - Рабочая область. Найдите корневую папку для своего проекта и выберите ее, назовите свое рабочее пространство своим проектом (DemoToDoList.xcworkspace) и нажмите Сохранить.

После этого закройте проект, если он открыт, затем найдите DemoToDoList.xcodeproj в Finder, перетащите его в рабочую область. Теперь попробуйте запустить свой проект. Все должно работать как раньше.

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

Пришло время создать новую основу. Выберите в меню Файл - Новый - Проект. Выберите Платформа в разделе Платформа и библиотека на вкладке iOS, затем нажмите Далее. Введите DBHelper в Название продукта, снимите флажок Включить модульные тесты, убедитесь, что выбран язык Swift, затем нажмите Далее. В следующем окне найдите корневую папку вашего проекта, выберите ее, нажмите Новая папка, введите Модули и нажмите Создать. Теперь у вас выбрана новая папка Модули.

Внизу окна найдите Добавить в и выберите там свое рабочее пространство (в моем случае это DemoToDoList). В Группе также выберите рабочую область. Убедитесь, что вы видите что-то вроде этого:

Нажмите Создать.

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

Должно получиться так, как на скриншоте.

Теперь у вас пустой (почти) проект. Здесь вы создадите новые файлы и сделаете общедоступными только те классы и функции, которые ваше приложение должно использовать. Эта схема позволяет избежать тесной связи между классами и позволяет хранить весь код, относящийся к одной конкретной функции, в отдельном месте.

Теперь давайте переключимся на схему DBHelper, щелкните имя текущей схемы (возможно, DemoToDoList) справа от кнопки Стоп и выберите новый.

Во-первых, мы установим минимальную версию iOS на 13 (мы используем SwiftUI и Combine, нет необходимости поддерживать более ранние версии, но мы могли бы это сделать, если бы решили использовать этот фреймворк в других проектах.

Выберите свою платформу в Навигаторе проекта, выберите DBHelper в Цели, в Информация о развертывании установите Цель до 13.0. После этого выберите DBHelper в разделе Проект и также установите для параметра Целевое значение развертывания iOS значение 13.0.

Теперь разверните DBHelper в Навигаторе проекта, затем разверните папку DBHelper. Вы должны увидеть файлы DBHelper.h и Info.plist. Создайте новую группу, щелкнув правой кнопкой мыши папку DBHelper, назовите ее Источники. Мы будем хранить все файлы в этой папке.

DBHelperProtocol

Создайте новый файл Swift (Cmd + N), назовите его DBHelper. Теперь давайте создадим протокол для наших будущих помощников по базам данных. Должно получиться так:

  • Мы делаем наш протокол public, потому что он должен быть видим вне фреймворка;
  • Мы создаем associatedType ObjectType и PredicateType, потому что эти типы различаются в зависимости от конкретной базы данных (для Core Data это NSManagedObject и NSPredicate. Нам нужно указать эти общие типы, чтобы мы могли использовать их DBHelperProtocol универсально;
  • Методы create, update и delete просты, мы просто передаем объект и create, update или delete в нашу базу данных;
  • Метод fetch получает в качестве параметров predicate и limit. Этого должно быть достаточно, но мы можем изменить его в будущем, если нам понадобится более сложный метод выборки. Он возвращает Result, действительно удобное перечисление, которое представляет успех или неудачу и включает соответствующее значение в каждом случае;
  • Мы хотим, чтобы наши помощники по базе данных поддерживали метод fetchFirst, даже если он, скорее всего, просто будет использовать fetch и возвращать первое значение. В любом случае, этот метод удобно иметь, поэтому мы его создаем;
  • Наконец, мы используем возможности расширений, создав метод fetch со значениями по умолчанию nil для predicate и limit. В некоторых случаях нам нужно получить все объекты, которые у нас есть, и эти значения по умолчанию пригодятся.

Вы можете попробовать собрать фреймворк (Cmd + B), чтобы убедиться, что все правильно.

Вот и все для этого фреймворка. Не так много кода, да? Но суть в том, чтобы иметь DBHelperProtocol, чтобы все наши помощники по базам данных соответствовали им, и все приложение не узнало бы ни о каких изменениях, если мы изменим хранилище базы данных.

поддержка watchOS

Одна из самых интересных частей разработки iOS в настоящее время - это возможность реализовать приложение для Apple Watch. Я не могу прожить ни дня без своих часов, и мне кажется, что иметь приложение Apple Watch - это хорошо, чтобы ваши пользователи могли быстро получить доступ к своим задачам в приложении. Кроме того, с SwiftUI гораздо проще создать приложение watchOS, если у вас есть исходный код для приложения iOS. Мы рассмотрим это в следующих частях, а пока давайте добавим поддержку watchOS в наш фреймворк.

Выберите структуру DBHelper в Навигаторе проекта. Нажмите Файл - Создать - Цель, выберите вкладку watchOS, найдите раздел Framework & Library и выберите там Framework. , затем нажмите Далее. Назовите его DBHelper watchOS, убедитесь, что DBHelper выбран как Проект, затем нажмите Готово.

Теперь выберите DBHelper.h в папке DBHelper, выберите Инспектор файлов на правой панели и выберите DBHelper watchOS в поле Целевое членство. Затем проделайте то же самое с DBHelper.swift. Убедитесь, что вы установили public для целевого членства DBHelper.h.

Затем удалите папку DBHelper watchOS, переместив все файлы в корзину.

Почти сделано! Выберите структуру DBHelper в Навигаторе проекта, затем выберите схему DBHelper watchOS, перейдите в Настройки сборки, найдите там Упаковка - файл Info.plist и измените его на DBHelper/Info.plist. Также измените Название продукта на $(PROJECT_NAME).

Теперь, если вы выберете схему watchOS, она должна построить без ошибок. Отличная работа! Мы можем использовать этот модуль, если решим разработать приложение watchOS (и я уверен, что мы это сделаем).

Таким же образом можно добавить поддержку macOS и tvOS. Вы можете сделать это как упражнение, поскольку это не совсем очевидно.

Последнее, что нужно добавить в проект - это фреймворк. Выберите проект в Навигаторе проекта (DemoToDoList или название вашего приложения), выберите там цель, найдите Платформы, библиотеки и встроенный контент и добавьте фреймворк с помощью кнопки плюса (убедитесь, что вы добавили фреймворк iOS, а не watchOS).

Теперь вы можете выбрать схему проекта и попробовать создать приложение. Все должно работать нормально. Но что мы сделали и как мы собираемся использовать этот фреймворк?

Что дальше

Отличная работа с добавлением собственного фреймворка в приложение. Мы нечасто использовали код нашего приложения, но мы будем использовать его в следующей части руководства. Трудная и скучная часть почти завершена. В следующий раз мы создадим другую структуру специально для Core Data. И перенесите наше приложение в эту базу данных. Сейчас пишется следующая часть, так что следите за обновлениями.

Полный код приложения доступен здесь.

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

  1. Начало работы со SwiftUI и объединение использования MVVM и протоколов для iOS.
  2. Создание приложения для iOS с помощью SwiftUI и объединение с использованием MVVM и протоколов.
  3. Создание приложения для iOS с помощью SwiftUI, Combine, MVVM и протоколов [Часть 3].
  4. Как создать свою собственную платформу для вашего приложения iOS (это руководство).
  5. Использование основных данных в вашем приложении SwiftUI с Combine, MVVM и протоколами.