Обзор основных рекомендаций по разработке приложений для iOS

This post is also available in: Английский

Принято считать, что важнейшим фактором успеха мобильных устройств компании Apple, было максимальное внимание к деталям. Мелкие, на первый взгляд незначительные детали в итоге и определяют привлекательность продукта для конечного пользователя. Но, чтобы разработать хорошее приложение, недостаточно внимания к деталям на уровне пользовательского интерфейса. Необходимо знать и соблюдать наилучшие практические рекомендации на всех этапах создания приложений от проектирования до поддержки. Эта статья представляет собой обзор таких рекомендаций, сформулированных как самой компанией Apple, так и независимыми iOS разработчиками.

Интерфейс

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

Главная рекомендация Apple, которую она пытается донести до каждого начинающего разработчка: «Фокусируйтесь на обеспечении наилучшего пользовательского опыта на всех этапах разработки приложения». Основной документ, который подробно описывает, как именно это сделать — iOS Human Interface Guidelines (Рекомендации по разработке пользовательского интерфейса для iOS). С ним обязательно необходимо ознакомиться еще до того, как у вас в голове сформируется полное видение идеи будущего приложения, так как несколько глав в нем посвящены в том числе и этапу проектирования. Перечислим основные идеи HIG:

  1. При проектировании интерфейса следуйте соглашениям, принятым на платформе iOS. Не пытайтесь бездумно копировать компоненты и парадигмы принятые на других платформах, в том числе на операционных системах для стационарных компьютеров.
  2. В самом начале, на этапе проработки идеи приложения очень важно четко определить какой функционал вы планируете предоставить пользователям и какова ваша целевая аудитория.
  3. Постарайтесь использовать в полной мере все доступные на платформе технические и программные средства, но только в том случае, если их использование обосновано для целей вашего приложения. Всегда следуйте рекомендациям Apple по использованию этих технологий.

Особенности платформы iOS, которые обуславливают подход к проектированию пользовательского интерфейса:

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

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

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

Архитектура

Базовые представления об архитектуре приложений и основных принципах, используемых при их написании, можно получить из документа iOS App Programming Guide (Руководство по программированию приложений для iOS). Он помогает правильно выбрать архитектурные решения для наиболее эффективной реализации первоначальной идеи в законченном приложении. Этот документ пытается донести до разработчиков следующие основные идеи:

  1. Перед тем как начать писать код, изучите основные технологии, которые помогут решить вашу задачу, познакомьтесь с теми паттернами проектирования, которые в них применяются. Всегда следуйте рекомендациям по использованию, приведенным в документации на ту или иную технологию.
  2. UIKit — это основной фреймворк, вокруг которого строится большинство приложений. Критически важно иметь представление о том, какие средства он предоставляет, как их правильно применять и кастомизировать в своих приложениях.
  3. Приложения необходимо оптимизировать по производительности. На мобильных платформах это прежде всего означает отзывчивость пользовательского интерфейса, разумное использование батареи и общих ресурсов системы, которые разделяются между всеми приложениями.

Наиболее важные и повсеместно используемые в программировании для iOS паттерны проектирования включают следующие:

При проектировании модели приложения очень полезными могут быть функции библиотеки Core Data, особенно, если вашему приложению необходимо хранить высокоструктурированные данные. Использование этой библиотеки не только способствует разбиению данных приложения на независимые нормализованные классы с четко определенными связями между ними, но и позволяет без дополнительных усилий со стороны программиста задействовать целый ряд сопутствующей функциональности: отображение структуры данных на SQL-таблицы и сохранение модели на диск в формате SQLite, оптимальное использование памяти, гибкий язык запросов для поиска нужных объектов, сохранение и откат истории изменений, интеграция с компонентом UITableView, интеграция с iCloud, версионирование модели данных.

Производительность

Зачастую заметные пользователю проблемы с производительностью бывают вызваны не нехваткой системных ресурсов, а тем, что приложение блокирует основную очередь задачей, которая слишком долго выполняется. В таких случаях рекомендуется использовать возможности iOS для параллельного выполнения кода. Здесь на выбор разработчику предоставлен целый ряд встроенных библиотек, выполняющих примерно одинаковую задачу: NSThread, POSIX threads, специальные методы NSObject, NSOperation, Grand Central Dispatch. Подробно обо всех этих технологиях и особенностях их использования рассказывается в документе Concurrency Programming Guide (Руководство по параллельному программированию).

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

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

Основные факторы, сказывающиеся на потреблении энергии в ходе работы приложения: нагрузка на процессор, использование модулей Wi-Fi, Bluetooth, 3G, определение местоположения, работа с диском и работа с акселерометром. Желательно минимизировать использование этих ресурсов. Когда вам все-таки приходится их использовать, старайтесь делать это, группируя множество мелких обращений к ресурсу в одно большое.

Приложение Instruments, входящее в комплект среды разработки Xcode, поможет исследовать существующее приложение на предмет наличия в нем проблем с производительностью, утечек памяти и выявить причины расходования заряда батареи.

Переносимость

Операционная система iOS работает на устройствах, характеристики которых различаются. Но пользователи ожидают, что одно и то же приложение будет одинаково хорошо работать на iPod Touch, iPhone 3GS и на последней версии iPad. Для того, чтобы этого добиться, необходимо приложить дополнительные усилия. В идеальном случае интерфейс для планшетов и для телефонов должен разрабатываться независимо. При этом правильное использование паттерна MVC позволит повторно использовать те же модели и контроллеры для разных интерфейсов. В условиях, когда на создание отдельного дизайна у разработчика не хватает времени, необходимо хотя бы предусмотреть гибкое расположение элементов на экране с помощью средств автоматической подстройки геометрии, доступных в классе UIView.

Не стоит забывать и об остальных различиях между устройствами, кроме размера экрана. Макрос UI_USER_INTERFACE_IDIOM() дает возможность определить тип устройства, на котором выполняется приложение, и в зависимости от этого выполнить тот или иной код. Всегда перед отправкой в App Store тестируйте приложение на разных реальных устройствах.

Проблема поддержки предыдущих версий операционной системы не стоит в iOS так остро, как для других мобильных платформ. Большинство пользователей устанавливают последнюю версию операционной системы в течение нескольких месяцев после ее выхода. Однако часть пользователей продолжает использовать старую версию по разным причинам. Конечно, ответ на вопрос о том, когда можно прекратить поддержку старой версии в своем приложении, в каждом случае решается индивидуально, но и здесь есть несколько общих правил. Иногда сама Apple подает разработчикам четкие сигналы о том, что пора прекратить поддержку старых версий, удаляя ее из новой версии Xcode. Следите за тем, какие версии используют ваши пользователи в App Store. Иногда разработчики популярных приложений публикуют свою статистику распределения аудитории по версиям iOS. Пользователи, склонные платить за приложения и пользоваться встроенными покупками, обычно используют самую последнюю версию iOS.

Используйте проверки доступности символов из новой версии iOS на этапе выполнения приложения. Это позволит задействовать новые функции при их наличии в приложении, которое изначально было рассчитано на более старую версию iOS. SDK дает возможность проверить доступность заданного класса, метода или функции. Подробности можно найти в SDK Compatibility Guide (Руководство по обеспечению совместимости SDK).

Процесс разработки

Документ Developing for the App Store (Разработка для App Store) описывает административные процедуры, которые необходимо пройти для того, чтобы разместить свое приложение в App Store, а также дает рекомендации по организации процесса разработки приложения.

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

На этапе тестирования может возникнуть необходимость рассылать сборки приложения тестировщикам для ручной проверки или заказчикам для уточнения требований. Портал TestFlight помогает автоматизировать процесс рассылки сборок, сбора отзывов и крэш-логов. Чтобы автоматизировать в том числе и сам процесс сборки, полезно применять инструменты Continuos Integration (CI), такие как Jenkins.

Работа над приложением не прекращается после того, как оно опубликовано в App Store. Очень важно исправлять ошибки и реагировать на комментарии пользователей. Информацию о падениях приложения можно получить на портале iTunes Connect, куда отправляются крэш-логи пользователей. Но эта функция iTunes Connect не всегда работает хорошо: до разработчиков доходит только малая часть отправленных логов и со значительной задержкой. Существуют и сторонние средства, позволяющие решать аналогичную задачу, например, Airbrake, Errbit.

Работа в команде

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

По вопросам правильного написания кода существует столько мнений, сколько и программистов. Компания Apple свела все наилучшие рекомендации по этим вопросам в документе Coding Guidelines for Cocoa (Руководство по написанию кода для Cocoa). Все их запомнить с первого раза довольно сложно, поэтому полезно обращаться к этому документу, как к справочнику, непосредственно во время написания кода. Перечислим лишь некоторые из правил:

Поддержка систем контроля версий Git и Subversion встроена непосредственно в Xcode. Среда предлагает создать репозиторий одновременно с созданием проекта, разработчику остается лишь не забывать пользоваться теми возможностями, которые ему предоставляются. На сегодняшний день наиболее популярной системой можно считать Git. Существует множество рекомендаций по ее наиболее правильному и эффективному использованию. Часть из них перечислена в официальной документации Git, которую нужно прочитать просто для того, чтобы осознать все возможности системы и понять, как ими пользоваться. Хотя Xcode и предоставляет доступ к некоторым функциям системы Git, мы все же рекомендуем в первую очередь ознакомиться с ее интерфейсом командной строки. Наиболее заметная функция, которая отсутствует в Xcode, — это функция трехстороннего разрешения конфликтов при слиянии изменений, полученных от других разработчиков. Для этой цели наиболее подходящий инструмент на платформе Mac OS X по нашему мнению — P4Merge. Процесс его интеграции с Git не столь очевиден, как хотелось бы, но в интернете существуют пошаговые инструкции о том, как это сделать.

Статья Commit Often, Perfect Later, Publish Once: Git Best Practices дает краткую выжимку всех основных рекомендаций по работе с Git. Из-за того, что Git — это очень мощная система с множеством различных функций, даже такое краткое перечисление на самом деле довольно длинное. Приведем список того, что нам кажется наиболее важным для начинающих разработчиков:

Используйте систему управления задачами для планирования разработки, для обработки запросов пользователей и контроля за выполнением задач. Существует множество систем управления задачами, подробное сравнение их функциональности можно найти в Википедии.

* * *

Приведенные здесь рекомендации — лишь малая часть всех существующих правил и установившихся практик по разработке приложений для iOS. Но пусть это вас не пугает. Многие из них применимы и в программировании для других платформ. Старайтесь шаг за шагом постепенно внедрять их в ваш процесс разработки, чтобы каждое ваше следующее приложение было лучше предыдущего. Желаем успехов!

Обновлено Mon Jan 2 23:16:57 2017 +0300