PricePoint
Price Point — это приложение для отслеживания цен крупных российских ритейлеров
— это, наверное, самый привычный и популярный суши-бар в Питере. Поэтому, когда весь мир перешел в режим онлайн, а количество заказов на доставку возросло в миллион раз, Евразия, как и многие другие рестораны, столкнулась с проблемой оптимизации работы курьерской службы.
Наше приложение должно было автоматизировать контроль работы курьеров. Показывать количество заказов, которое они доставили за день, а также отображать их местоположение на карте. Первая функция довольно проста в реализации, а вот со второй — все немного интереснее.
Итак, основной задачей стала разработка алгоритма по отправке геопозиции. Первое, с чего надо было начать — выбрать инструмент, который бы предоставлял приложению доступ к геолокации.
Старое приложение заказчика работало на Google location services. Это удобный инструмент, который многим может подойти. Во-первых, он умеет агрегировать геолокацию сразу из нескольких источников — из GPS, Wi-Fi и мобильной сети, во вторых — он оптимизирует работу с полученной информацией.
Но для нас Google тут оказался не очень релевантен. Главным минусом стало то, что он использует мобильные сети, которые выдают большую погрешность. Когда устройство оказывается там, где не ловят GPS и Wi-Fi, а мобильная сеть остается единственным источником, это оказывается проблемой.
Поэтому одним из требований к приложению стала реализация нативной геолокации. Так мы применили встроенный в Android SDK, а в качестве источника использовали только GPS.
Как всегда, есть НО. Итак, теперь SDK обрабатывает геолокацию от GPS и предоставляет приложению к ней доступ. Каждый определенный отрезок времени приложение отправляет на сервер информацию о местонахождении курьера, которая высвечивается на карте “точками”, образуя путь курьера.
Алгоритм работал! — оставалось исправить некоторые моменты.
Когда курьер останавливается на месте, приложение продолжает посылать геолокацию. По итогу, на сервере копятся “одинаковые точки”, как их привыкли называть на проекте, и лишний километраж.
Как решение — мы задали требование сохранять последнюю приходящую точку: теперь данные каждой новой координаты сравниваются с предыдущими и, если они совпадают, новый сигнал игнорируется.
Другой момент, который также требовалось предусмотреть — пропажа сигнала. Чтобы связь с курьером не прерывалась, мы выставили в приложении период, за который должна была бы отправляться одна точка.
В случае, когда курьер не стоит на месте, а отправка геолокации все равно не происходит, алгоритм начинает запрашивать точку в несколько раз чаще, чтобы уменьшить временной лаг при получении данных.
Приложение должно было работать в фоновом режиме, поэтому нам также предстояло разобраться со всеми сложностями, которые могли бы из-за этого возникнуть у его пользователей, и в первую очередь — с ограничениями, которые Android выдвигает к энергозатратным приложениям.
Когда у устройства садится аккумулятор или когда на нем заканчивается память, Android стремится прекратить работу запущенных в нем фоновых приложений. Как решение мы использовали фоновый воркер, который каждые 15 минут запускает основной сервис, при этом не перезапуская само курьерское приложение.
Помимо основных настроек от Android, есть настройки оболочек, которыми обладают телефоны. К примеру, MIUI и EMUI, оболочки от Xiaomi и Huawei, обладают довольно агрессивной политикой энергосбережения. Замечая фоновые сервисы, они замедляют их работу, вместе с чем, в случае нашего приложения, также замедляется отправка точек и увеличивается погрешность. Чтобы избежать этого, нам потребовалось реализовать удержание активного режима в приложении. Когда с этой проблемой мы разобрались, нам предстояло “победить” уже человеческие настройки.
На самом деле, все равно самая распространенная проблема, с которой сталкиваются пользователи при работе с фоновыми приложениями — не политика Android, а простая забывчивость :)
Фоновый режим может работать, только когда пользователь указал в настройках все разрешения. Поэтому мы реализовали в приложении функцию, которая самостоятельно предлагает пользователям разрешить работу приложения в фоне без ограничений.
Работать с таким известным и любимым в Питере суши-баром было особенно приятно.
Sixhands GPT Alpha