Евгений Росляков обновил iOS-приложение городского проката электросамокатов: перевёл старый проект на Objective-C на современный Xcode, переделал карту на MapKit, а экраны под нынешние iPhone пересобрал на Apple UIKit. Мобильной и веб-разработкой он занимается с 2016 года, он самозанятый, перед работой заключает договор, а для юрлиц оформляет закрывающие документы. Живёт в Москве, с заказчиками из других городов работает удалённо.
Заказчик — небольшой оператор проката в областном центре. Самокаты стоят по городу, пользователь находит ближайший на карте, открывает замок, едет и оставляет самокат в разрешённой зоне. Приложение для iPhone написали в 2017 году, и с тех пор оно почти не менялось.
К моменту обращения оно перестало собираться. Новый Xcode отказывался собирать проект: часть подключённых библиотек исчезла из репозиториев, часть пользовалась устаревшими вызовами. Исправление в App Store выпустить было невозможно, а ждать оператор больше не мог.
Были и жалобы пользователей. Карта тормозила, когда на ней много самокатов: метки наползали друг на друга, а при перемещении карту дёргало. На новых iPhone экраны выглядели криво: кнопки уезжали под вырез, на узких моделях обрезался текст.
Через приложение оператор получает основную часть поездок, поэтому переписывать его с нуля и надолго останавливать выпуск обновлений не хотелось. Нужно было вернуть возможность собирать и выпускать приложение, починить карту и привести экраны в порядок, не задев рабочую логику поездки.
Начал со сборки, это было самое важное. Перенёс проект в актуальный Xcode и разобрался с зависимостями. Что-то обновил, что-то заменил встроенными средствами системы, что-то перенёс в код проекта, потому что библиотеку давно не поддерживали. Через несколько дней приложение снова собиралось и запускалось на симуляторе и на живых устройствах.
Затем прочитал старый код на Objective-C. Часть классов написана аккуратно, часть превратилась в длинные файлы, где экран, сеть и данные перемешаны. Логику поездки (открытие замка, таймер, завершение, оплату) я не менял, а перед работой покрыл её проверками, чтобы ничего не сломать случайно.
Сеть и данные остались на классах Cocoa. Точнее, на Foundation, общей части Cocoa и Cocoa Touch: запросы к серверу, разбор ответов, хранение настроек и сеанса. Я убрал дубли и добавил обработку ошибок связи. Раньше при обрыве интернета приложение зависало на крутящемся индикаторе.
Новые экраны собрал на Apple UIKit с автолейаутом. Размеры больше не зашиты числами: элементы привязаны к безопасной области и подстраиваются под ширину экрана. Экран поездки, карточку самоката и профиль проверил на старых и новых моделях iPhone.
Карту перевёл на MapKit. На дальнем масштабе самокаты собираются в кластеры с числом внутри, при приближении раскрываются в отдельные метки. Зоны парковки закрашены, запретные зоны заштрихованы, так что пользователь видит, можно ли закончить поездку здесь, ещё до нажатия на кнопку.
Часть нового кода написал на Swift, рядом со старым Objective-C. Оба языка в одном проекте уживаются без проблем, а новые экраны на Swift проще поддерживать. Всё подряд переводить на Swift я не стал: рабочий старый код переписывать ради красоты незачем.
Перед выпуском прогнал приложение на разных устройствах и версиях системы и отправил сборку на проверку в App Store.
Приложение снова можно собирать и выпускать. Оператор больше не зависит от старой среды разработки: выход новой версии системы или нового iPhone уже не ставит всё под вопрос.
Карта перестала дёргаться. Самокатов на экране много, но пользователь видит аккуратные кластеры и сразу находит ближайший. Зоны парковки читаются без объяснений, и в поддержку приходит меньше вопросов вроде «почему не завершается поездка».
Экраны выглядят одинаково на старых и новых моделях: кнопки не прячутся под вырез, текст не обрезается.
Изменения коснулись и разработчика. Код разобран, сеть и экраны разделены, рядом лежат заметки о том, что где находится. Следующему человеку, который возьмёт проект, не придётся гадать.
Что осталось недоделанным. Часть кода на Objective-C никуда не делась и будет заменяться постепенно. Больше всего вопросов к модулю оплаты: он работает, но писался давно, и я предлагаю переносить его отдельным этапом, когда у оператора появится время. Тёмная тема и виджет с ближайшим самокатом обсуждались, но в эту работу не вошли.
Приложение для iPhone перестало собираться или на новых телефонах выглядит старым? Напишите мне на freelance.ru, о каком проекте речь. Посмотрю, что с ним, и скажу, с чего начать.