На прошлой неделе вместе с братом мы выпустили наше первое приложение для iOS, разработанное на Swift. В этой статье я хотел бы поделиться своими мыслями о процессе.

Это написано с точки зрения человека, который последние шесть лет потратил на создание различных (с точки зрения масштаба и предметной области) веб-приложений на Ruby и JavaScript, а теперь работает на Swift последние три месяца.

Objective-C мертв?

Swift разработан Apple, одной из крупнейших компаний в мире. Это подразумевает множество вещей; Во-первых, Apple не боится вносить серьезные изменения в свою платформу. Под серьезными изменениями я также имею в виду обновления кода. Вы должны знать об этом.

Например, на последнем WWDC объявили о переименовании большей части API. Сам Swift стал огромным отходом от предыдущего основного языка разработчиков iOS - Objective-C. Между прочим, WWDC для меня был как неделя отдыха, чтобы узнать обо всех интересных презентациях и объявлениях. Несмотря на это, Swift - один из лучших поддерживаемых проектов с открытым исходным кодом, которые я когда-либо видел. Просто проверьте репозиторий с его языковыми предложениями.

Означает ли это, что Objective-C мертв, и вам не нужно об этом знать? Вид. Я почти уверен, что большинство внешних библиотек и примеров кода, которые вы найдете в Интернете, написаны на Objective-C. Что интересно, когда я делаю больше в Swift, у меня меньше проблем с пониманием кода Objective-C. Я могу читать это почти естественно.

Еще один факт, который вам нужно знать, - это размер внутреннего API, он огромен, и вы можете испугаться, когда начнете его просматривать. Вы можете построить практически все, что угодно, и получить доступ ко всем специфическим для мобильных устройств функциям, таким как камера, микрофон, геолокация, акселерометр, сенсорный экран и т. Д., Намного проще, чем в Интернете.

Набор инструментов

XCode (Apple IDE) - это место, где происходит волшебство. Он включает в себя все инструменты, которые вам понадобятся при разработке приложений для iOS: редактор кода, построитель интерфейсов, менеджер баз данных, отладчик, инструментальные средства и многое другое.

К сожалению, он далек от совершенства. Особенно Interface Builder, который дает наиболее «то, что происходит». Когда я начал с ней играть, я был очень впечатлен - «ВАУ! Я могу создать весь интерфейс в графическом редакторе, таком как Sketch или Photoshop »- это неправда. Интерфейсный конструктор больше похож на слой абстракции для переопределения написанного кода, чем на инструмент для разработки пользовательского интерфейса.

Это не редкость, когда вы выбираете параметр в Интерфейсном Разработчике, но он вообще не влияет на ваше приложение. Там много вещей, о которых вы не можете догадаться, их просто нужно знать; например, предупреждения о неправильных ограничениях, которые вы можете исправить, буквально щелкнув описание предупреждения. Кроме того, при удалении выходов или действий всегда не забывайте удалять ссылки в раскадровке. Вы не получите никаких предупреждений во время компиляции, но ваше приложение выйдет из строя, если вы их не удалите.

Вам нужно найти золотую середину. По моему опыту, Interface Builder удобен для проектирования потока приложения, размещения встроенных элементов пользовательского интерфейса и создания переходов между контроллерами представления (не между кнопками и контроллерами представления!). Сохраняйте все настройки в коде и создавайте настраиваемые элементы пользовательского интерфейса, используя наследование существующих объектов пользовательского интерфейса.

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

Всегда тестируйте свой интерфейс на реальных устройствах. Ощущение нажатия в симуляторе и касания пальцем реального устройства совершенно другое.

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

Последний небольшой совет: не слишком полагайтесь на функцию отмены. XCode не переключается между файлами при нажатии cmd + z, поэтому вы не можете визуально отслеживать изменения. Не забывайте использовать Git и часто совершайте коммиты.

Различия в разработке между вебом и iOS

Как только вы создадите новый проект, вы быстро заметите, что ничто не заставляет вас использовать какое-либо конкретное соглашение. В отличие от приложений Ruby (не обязательно Rails), где каждый проект имеет аналогичную структуру каталогов, в iOS нет строгих правил организации кода. Каждый разработчик может структурировать свое приложение по своему усмотрению. Если честно, мне это не нравится. Подход Ruby намного более интуитивно понятен и полезен, потому что вы можете предположить, где найти конкретный код.

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

Все причудливые функции пользовательского интерфейса, такие как анимация, переходы или жесты, намного проще реализовать с помощью iOS API, чем для меня с помощью JavaScript / CSS.

Другие важные темы - это ограниченные ресурсы и оптимизация. Вы не можете масштабировать свое приложение, добавляя дешевое оборудование в инфраструктуру. Есть дополнительное ограничение батареи устройства. Использование нескольких потоков ЦП для оптимизации программы - обычная практика, и разница в производительности между моделями телефонов очень значительна.

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

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

С другой стороны, мне также не хватает некоторых встроенных функций из стандартной библиотеки Ruby. По крайней мере, у вас по-прежнему есть доступ к map (), filter () и reduce (), но было бы полезно больше разнообразных методов. Более того, вы должны быть осторожны, потому что несоответствия в дизайне системных API - это нормально. Я даже сталкивался с функциями с разными именами, которые выполняли одну и ту же задачу, просто реализация одной из них была старше.

Выпуск приложения

Я должен отметить один факт: подготовка контента заняла у нас больше времени, чем программирование приложения! Обратите внимание на подобные вещи, потому что создание приложения - это не только написание кода.

App Store - единственный официальный способ распространения ваших приложений для iOS, и вы платите 30% от каждой транзакции Apple. Не похоже, чтобы у вас была большая скидка, пока вы не увидите отчет о продажах. Это важно, и когда вы добавите подоходный налог, вы увидите, что вы получаете только половину цены с каждой проданной единицы вашего приложения. Исключив все остальные расходы и средние цены в App Store (большинство приложений бесплатны или дешевле, чем чашка кофе), вы заметите, что вам нужен отличный продукт и хороший маркетинг, чтобы получать от него прибыль.

Apple не предоставляет слишком много инструментов для продвижения вашего приложения. Вы можете предоставить 30-секундное видео, до 5 снимков экрана, заголовок, описание и ключевые слова для поиска, всего не более 100 символов. Остальное зависит от ваших усилий. Мне не нравится, что статистика по ключевым словам недоступна и приходится использовать внешние инструменты.

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

Учебные материалы

В заключение я хотел бы перечислить некоторые книги и ресурсы, на которых я учился:

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

Лекция Stanford CS 193P об iTunes U - на мой взгляд, лучший курс для начала, поскольку он охватывает понемногу. Не для новичков, потому что для этого требуется опыт объектно-ориентированного программирования. Это бесплатно и актуально (Xcode 7, Swift 2 и iOS9). Каждая глава заканчивается проектом, в котором нужно повторить и проверить то, что вы узнали.

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

Pro ​​Swift - охватывает только сложные темы в Swift. К каждой главе прилагается видео, где автор объясняет тему с примерами кода. Обязательно прочтите / посмотрите ресурс, если вы хотите лучше понять Swift. Очень рекомендую.

100 дней Swift - 40 реальных проектов, построенных на Swift в виде видео. Автор показывает много племенных знаний и полезных советов. Похоже, он ориентирован на новичков, но я бы не рекомендовал его для них из-за отсутствия пояснений по темам. Стоит посмотреть, если вы уже немного поиграли со Swift и iOS.

Библиотека разработчика iOS - основной ресурс, которым я пользуюсь сейчас. Трудно начать, если не знаешь, что ищешь. Вы можете увидеть, как сотрудники Apple пишут и структурируют код. Имейте в виду, что примеры могут быть написаны на Objective-C или устарели. Единственный ресурс для поиска информации о новых API.