Недостатками являются: пониженная безопасность, ограниченная база компонентов, пока малая поддержка сообщества с точки зрения руководств и библиотек, а также более низкие производительность и энергоэффективность. [23] [24]
Web App
Начиная с 2017 года, все большую популярность приобретают так называемые веб-приложения, -- веб-сайты, отвечающие формальным критериям приложения и имеющие некоторый ранее уникальный для non-web приложений функционал, такой как push-уведомления (только десктоп и Android) и офлайн работу; но исполняемые не нативно на устройстве, а в веб-браузере.
Очевидным плюсом такого подхода можно назвать, как и в случае с React Native, возможность кроссплатформенного функционирования приложения с еще большей степенью совместимости с различными платформами.
Недостатки: требование развертки сервера и в целом возрастающая стоимость разработки, связанная с необходимостью искать или разрабатывать с нуля замену многим компонентам (таким, как система уведомлений, офлайн-работа, работа в фоне), которые предусмотрены при разработке нативного мобильного приложения. Отсутствие поддержки push-уведомлений для платформы iOS -- ключевое ограничение ввиду специфики разрабатываемого продукта. Помимо этого, важнейшим фактором является значительно сниженная производительность и качество анимаций и других аспектов, влияющих на пользовательский опыт. [25]
Итог
В связи со всеми обозначенными плюсами и минусами каждого из подходов, было принято решение сфокусироваться на разработке нативного приложения, поскольку это позволит получить максимально качественный пользовательский опыт при низких затратах, жертвуя поддержкой иных платформ.
Язык программирования, API и фреймворки
Выбранная платформа подразумевает возможность работы с двумя основными языками: Objective-C и Swift.
Objective-C -- компилируемый объектно-ориентированный язык программирования, используемый корпорацией Apple, построенный на основе языка Си и парадигм Smalltalk. Ранее использовался как приоритетный язык разработки приложения под все платформы Apple, пока не был сменён в этом статусе языком Swift.
Swift -- компилируемый мультипарадигмовый язык программирования, представленный Apple в 2014, предназначенный для написания приложений для платформ iOS, macOS, tvOS, watchOS. На данный момент актуальной версией является Swift 5.1. Отличается более простой и лаконичной структурой файлов, улучшенным менеджментом памяти, но, по опыту автора данного исследования, меньшей скоростью компиляции. [26]
Если ранее, на момент выхода языка Swift, вопрос выбора языка приложения для iOS стоял остро, поскольку экосистема Swift была крайне молодой и не позволяла реализовать многие функции, то сейчас ситуация обратная: подавляющее большинство актуальных современных библиотек и фреймворков разработано исключительно на языке Swift, в то время как приоритетной задачей Objective-C является поддержка старых библиотек и приложений, которые еще не осуществили переход на новую технологию. [27]
Выбирая основной фреймворк для интерфейса, на текущий момент перед разработчиками стоит выбор между UIKit и SwiftUI.
SwiftUI -- декларативный интерфейсный фреймворк, представленный в июне 2019 года и официально поддерживаемый операционной системой iOS c версии 13, вышедшей осенью 2019 года. Среди ключевых особенностей фреймворка стоит отметить значительно меньшее количества строчек кода для отрисовки одного и того же интерфейса (по сравнению с UIKit), фокус на реактивном программировании, что значит, что интерфейсные элементы автоматически реагируют на изменения данных без необходимости ручной разработки алгоритмов для этого со стороны разработчика. Помимо этого, присутствует Live Preview, позволяющее предпросмотреть итоговый вариант интерфейса до исполнения кода на устройстве или симуляторе, а также кроссплатформенность (внутри операционных систем Apple). У фреймворка имеются также и недостатки. В данный момент количество базовых компонентов колоссально мало по сравнению с UIKit, а среда разработки Xcode плохо работает с синтаксисом данного фреймворка, часто некорректно указывая на допущенные ошибки. Однако, SwiftUI подразумевает возможность сосуществования с компонентами UIKit. Имплементация взаимодействия UIKit и SwiftUI крайне простая, и позволяет использовать UIKit там, где SwiftUI нецелесообразен [28] [29] [30].
Подводя итоги, преимуществами SwiftUI перед UIKit являются:
Декларативный принцип работы: поскольку фреймворк относится к декларативной парадигме программирования, SwiftUI-код легко читаем, более лаконичен чем императивный, а также повторяет иерархию и общую структуру интерфейса, которую он генерирует.
Меньший объем строк программного кода, необходимый для создания того же интерфейса, нежели у UIKit.
Встроенная поддержка Dark Mode и Dynamic Type -- системных функций, присутствие которых ожидается пользователями, а отсутствие необходимости вручную имплементировать их приводит к сокращению времени разработки.
Интеграция с фреймворком Combine для реактивного программирования, что позволяет разработчикам не тратить время на имплементацию решений для этого.
Live Preview -- возможность предпросмотра интерфейса до компиляции кода на реальном устройстве или симуляторе.
Отсутствие проблем с Auto Layout, задача которого позволить создавать адаптивные интерфейсы, адекватно отображаемые на устройствах с различными размерами экранов. Работу с Auto Layout можно охарактеризовать неудобной для разработчиков, ввиду часто возникающих проблем с Constraints и прочих общих ошибок с Layout. Вместо этого, SwiftUI полагается на HStack, VStack и прочие инструменты верстки, всегда генерирующие валидный интерфейс.
Отказ от Storyboard, -- инструмента для быстрого графического создания интерфейсов. Среди недостатков данного решения можно отметить низкую производительность, необходимость вручную поддерживать созданные сущности в программном коде, отсутствие контроля версий и прочее.
Возможность интеграции UIKit с SwiftUI при помощи протокола UIViewRepresentable, что позволяет закрыть некоторые проблемы, решением которых SwiftUI являться на текущий момент не может, более взрослым фреймворком UIKit.
В связи со всем вышеперечисленным было принято решение в качестве основного фреймворка использовать именно SwiftUI, при необходимости используя компоненты и методы UIKit.
2.2 Инструменты прототипирования
Разработке предшествует создание и разработка макета приложения и прототипа, задача которых в некотором приближении описать:
Внешний вид и эстетику приложения
Описание функциональных особенностей приложения
Описание пользовательского пути
Спецификация элементов верстки, анимаций
Создание данных описательных для конечного продукта аспектов необходимо для структурирования дальнейшей работы, определения промежуточных целей, а также оценки итогового результата.
В данном разделе будет определен инструментарий для создания макетов и прототипов.
Будут рассмотрены 3 самых популярных графических редактора: Adobe XD, Sketch и Figma.
Были определены следующие параметры, важные для выбираемого инструмента: программный фреймворк пользовательский
Производительность -- мера быстроты работы приложения, измерения производились на Apple MacBook 2017.
Прототипирование -- возможность проектирования логики взаимодействия различных компонентов создаваемого приложения друг с другом. Описывает удобство связывания экранов между собой, анимации и т.д.
Компоненты -- возможность создания и поддержки компонентов, задача которых упростить работу с повторяемыми в интерфейсе продукта элементами.
Поддержка расширений -- возможность расширения существующего функционала сторонними дополнениями.
Удобство использования -- субъективная мера удобства взаимодействия с той или иной программой.
Коллаборация -- возможность работы над одним документом нескольким людям.
Стоимость -- мера доступности того или иного решения.
Таблица 1. Сравнение инструментов дизайна и прототипирования [31]
|
Название программы |
Adobe XD |
Figma |
Sketch |
Adobe Photoshop |
|
|
Производительность |
4 |
2 |
3 |
1 |
|
|
Прототипирование |
Да, большое количество триггеров для переходов, Auto Animate для быстрой и удобной анимации |
Да, Smart Animate |
Базовое прототипирование и общие переходы |
Нет |
|
|
Компоненты |
Да, поддержка состояний и внутренних анимаций, адаптивной верстки |
Да |
Да |
Да, через CC Libraries |
|
|
Поддержка расширений |
Да, плагины |
Да, плагины и API |
Да, плагины и API |
Да, плагины и расширения |
|
|
Удобство использования |
4 |
2 |
3 |
1 |
|
|
Коллаборация |
Да, в реальном времени |
Да, в реальном времени |
Да, не в реальном времени |
Нет |
|
|
Цена |
Бесплатный тариф, оффлайн-функционал по подписке Creative Cloud |
Бесплатный тариф, Shared Libraries по подписке от $9.99/месяц |
Полностью платный инструмент, $99/год |
Полностью платный инструмент, доступен по подписке Creative Cloud |
|
|
Совместимость с другими инструментами |
Да, Photoshop, Illustrator, Sketch |
Да, Sketch |
Нет |
Да, Adobe XD, Illustrator |
По обозначенным выше параметрам, наиболее подходящим для выполнения функций создания макета и прототипа программным средством, является Adobe XD, вследствие чего этот инструмент будет выбран в качестве основного в данном исследовании.
2.3 Итог
Определённый в главе 1 продукт -- нативное приложение для платформы iOS, которое будет разработан в среде разработки Xcode с использованием фреймворков SwiftUI, Combine, CoreData, UIKit и других. В качестве языка программирования будет использован Swift.
Прототип и макет этого приложения будут разработаны при помощи инструмента для графического дизайна и прототипирования Adobe XD.
ГЛАВА 3. ПРАКТИЧЕСКАЯ РЕАЛИЗАЦИЯ ПРЕДЛОЖЕННОГО ПОДХОДА
3.1 Создание прототипа приложения
Первым этапом разработки стало создание макета и прототипа приложения. Были учтены Human Interface Guidelines для мобильных приложений, предоставленные компанией Apple, а для непосредственной отрисовки макетов и создания прототипа была использована программа Adobe XD [Рисунок 5].
Рисунок 5. Макеты приложения в Adobe XD
С точки зрения интерфейса и пользовательского опыта, прототип подразумевает гибкую верстку, одновременно вмещающую большое количество сущностей, большой размер доступных областей взаимодействия, а также выравнивание основных элементов управления в нижней области экрана. Все это должно положительно сказаться на удобстве использования.
Исследование подразумевало юзабилити-тестирование при помощи глубоких интервью, однако в связи с режимом самоизоляции это требование стало выполнить невозможно. Оценить удобство использования можно будет после получения первой аналитики из сервиса App Store Connect, а также пользовательских отзывов. [9]
3.2 Разработка продукта
Продукт был разработан, используя Xcode в качестве среды разработки, SwiftUI в качестве основного интерфейсного фреймворка, а также несколько библиотек с открытым исходным кодом для взаимодействия с компонентами UIKit: ASCollectionView и Introspect [32] [33] [34]. Для работы с данными был использован фреймворк CoreData. Помимо этого, была использована библиотека SwiftyStoreKit [35] для упрощения имплементации встроенных покупок (подписки). Полный цикл разработки занял 3 месяца.
Рисунок 6. Проект приложения в Xcode
Проект содержит 33 файла 8 классов 46 структур, огромное количество переменных, методов и более 4000 тысяч строк уникального программного кода [Рисунок 6].
Рисунок 7. Коммиты в Git
За все время работы было осуществлено более 150 коммитов [Рисунок 7] в системе контроля версий.
3.3 Создание вспомогательных материалов
Помимо прототипа и непосредственного исполняемого кода приложения, для релиза на платформе Apple App Store необходимо создание вспомогательных ресурсов.
Эти ресурсы:
Набор изображений различного разрешения для отображения в качестве иконки в разных частях системного интерфейса, а также на странице приложения в магазине.
Метаданные, такие как Promotional Text, описание, теги, категории, а также спецификации подписки
Дополнительные текстовые и графические ресурсы для внутренних покупок.
Рисунок 8. Иконки приложения и внутренних подписок
Созданные графические ресурсы продемонстрированы на рисунке 8, а также их и другие материалы можно найти в приложении 2.