Подумайте, где вы на самом деле работаете.
Подвал с бетонным фундаментом и без окон. Новостройка с металлическим каркасом, обшивкой и без единого подключения к сетям. Загородный участок в двадцати минутах езды за последней вышкой связи. Техническое помещение посреди этажа в коммерческом здании. Подземный паркинг.
А теперь подумайте, где обычно показывают демоверсии программ: в офисе, по Wi-Fi.
Вот этот разрыв и делает программы для работы на объекте такими раздражающими — причём раздражение трудно выразить словами. Приложение не медленное и не плохо сделанное. Оно прекрасно работает на подъездной дорожке и перестаёт работать в подвале — ровно там, где было нужно. И отказ почти никогда не бывает честным: обычно это просто крутящийся значок загрузки, тихое «сохранение», которое ничего не сохранило, или форма, которая стирает набранное, стоит из неё выйти.
Виды сбоев — подробно
«Нет связи» — это не одна проблема. Их несколько, и каждая ломает программу по-своему.
Сигнала нет вообще. Самый чистый случай. Хорошо сделанное приложение понимает, что оно офлайн, и ведёт себя соответственно. Большинство программ справляются с этим сносно, потому что распознать такое просто.
Одна палочка, формально связь есть. Вот это по-настоящему разрушительно. Устройство сообщает, что подключение есть, приложение лезет на сервер — и запрос зависает. Вы сорок секунд смотрите на крутящийся значок, а потом получаете таймаут. Или, того хуже, запрос, который прошёл наполовину. Программа, которая проверяет только «есть ли сеть?», а не «дошло ли это на самом деле?», ломается здесь сильнее всего.
Связь то появляется, то пропадает. Вы четыре раза в день ходите с подъездной дорожки в подвал и обратно. Каждый такой переход — риск оборвать синхронизацию на середине.
Связь есть, но медленная. Перегруженные загородные вышки в четыре часа дня. Формально всё работает — с такой скоростью, что вы просто перестаёте этим пользоваться.
Приложение, которое честно умеет работать офлайн, должно справляться со всеми четырьмя случаями. Приложение, которое справляется только с первым, всё равно потеряет вашу работу.

Что на самом деле должно значить «работает офлайн»?
Эту фразу используют слишком вольно. Есть содержательная проверка, и в ней четыре пункта.
Чтение работает. Вы можете открыть объект, увидеть адрес, объём работ, номер телефона клиента и вчерашние фото вообще без связи. Это значит, что данные действительно хранятся на устройстве, а не кешируются от случая к случаю.
Запись работает и надёжно сохраняется. Вы можете добавить заметку, внести часы, зафиксировать расход, сделать фото. И если телефон выключится, приложение принудительно закроют или батарея сядет на морозе — эта работа всё равно будет на месте, когда телефон снова заработает. То, что лежит только в памяти, не сохранено.
Синхронизация автоматическая и незаметная. Как только связь вернулась, всё, что накопилось в очереди, уходит само. Вы вообще не должны помнить про кнопку синхронизации: тот единственный раз, когда вы о ней забудете, и окажется тем самым, когда это было по-настоящему нужно.
Конфликты обрабатываются честно. Два человека правили один и тот же объект, и оба были офлайн. Хорошая программа это замечает и сообщает вам. Плохая тихо оставляет одну версию, а вы через несколько недель обнаруживаете, что заметки нет.
Именно последний пункт легче всего пропустить, и именно он отделяет приложение, которое офлайн просто терпит, от приложения, для которого офлайн — основной режим. Чтобы поймать конфликт, приложению нужно вести версии каждой записи и сравнивать их при возврате в сеть. Это настоящая инженерная работа, которую потом нечем предъявить, — потому её так часто и не делают.
Почему фото заслуживают отдельного абзаца
Фотографии — самый тяжёлый офлайн-случай в программах для работы на объекте, и при этом именно их подрядчику чаще всего и нужно снять: повреждения, которые были до начала работ, что там за стеной, готовую работу, показания счётчика, привезённый материал.
Сложны они потому, что большие. Фотографии одного объекта в полном разрешении легко тянут на десятки мегабайт. При одной палочке связи такая загрузка не пройдёт — ни с первого раза, ни с десятого. Приложение, которое обращается с фото как с любой другой записью, либо подвесит всю работу в ожидании загрузки, либо просто потеряет снимок.
Вместо этого должно быть так: фото сразу записывается на устройство и прикрепляется к объекту, а загрузка — отдельная фоновая задача, которая повторяет попытки, переживая перезапуск приложения и растягиваясь при необходимости на несколько дней. Работать с фото в приложении можно с той секунды, как оно снято, — независимо от того, дошло оно до сервера или нет.
А вот чего стоит опасаться: приложение показывает фото на устройстве, но тихо так его и не загружает. Всё выглядит правильно ровно до того момента, когда вы откроете объект с ноутбука или потеряете телефон, — а фотографии, оказывается, были только на нём.

Во что обходится отсутствие офлайна
Видимая цена невелика и постоянна: несколько потерянных минут на каждый такой случай да прогулка на подъездную дорожку за палочкой связи.
Настоящая цена — в привычках. Обжёгшись пару раз, люди перестают доверять приложению на объекте. И возвращаются к часам на клочке бумаги, которые вносят вечером в пятницу, к чекам, сфотографированным в галерею, которую никто никогда не разбирает, к настоящему графику в голове. Программа при этом остаётся установленной и по-прежнему оплаченной, а бизнес снова работает на памяти.
Как только это произошло, сыплется всё, что дальше по цепочке. Учёт затрат по объекту перестаёт работать, потому что расходы ни к каким объектам не привязываются. Счета уходят с задержкой, потому что никто не уверен, закончена работа или нет. Вся система чего-то стоит лишь потому, что данные попадают в неё в момент работы, — а офлайн-сбой ломает ровно этот момент.
Как проверить это до того, как вы примете решение?
По списку функций это не понять — «работает офлайн» пишут все. Проверьте сами, минут за десять:
- Включите на телефоне авиарежим.
- Откройте объект, который давно не открывали. Загружается ли он полностью, включая фото?
- Добавьте заметку, внесите часы, зафиксируйте расход, сделайте три фото.
- Принудительно закройте приложение. Откройте снова. Всё ли на месте?
- Восстановите связь. Синхронизируется ли всё само, без единого вашего нажатия?
- А теперь настоящая проверка: включите Wi-Fi, но подключитесь к сети без доступа в интернет, чтобы телефон сообщал о наличии связи, которой на самом деле нет. Повторите шаг 3. Многие приложения, успешно прошедшие авиарежим, проваливаются именно здесь.
Если приложение пережило все шесть пунктов, его делали люди, которые сами бывали в подвале.
Zeus построен именно так, и это осознанное решение. Приложение держит на устройстве полную локальную базу данных, поэтому объекты, клиенты и расценки читаются вообще без связи, а всё, что вы вводите, сначала пишется на телефон и уходит на сервер, когда связь вернётся. Фото сохраняются на устройстве сразу и — на тарифах с резервным копированием фото — уходят в фоне, с повторными попытками и с возможностью отправлять только по Wi-Fi, чтобы день съёмки не съел мобильный трафик. Расходящиеся правки с двух устройств не перезаписываются молча: их находят и помечают на индикаторе синхронизации, чтобы вы решили, какая версия верна.
Часто задаваемые вопросы
Не занимает ли хранение всего на телефоне слишком много места?
Текстовые записи занимают совсем немного: тысячи объектов, клиентов и позиций сметы — это всего несколько мегабайт. По-настоящему «весят» только фото, поэтому их обычно держат отдельно: оригиналы в полном разрешении после загрузки лежат в облаке.
Безопасны ли данные на телефоне, если он потерян или украден?
Зависит от приложения, и спрашивать об этом стоит прямо. Смотреть надо на две вещи: шифруется ли локальная база данных и есть ли блокировка у самого приложения, а не только надежда на блокировку экрана телефона. Zeus шифрует свою локальную базу и предлагает блокировку приложения, которую можно включить по желанию: она работает по биометрии или PIN-коду вашего устройства.
Что будет, если двое из бригады отредактируют один и тот же объект офлайн?
В нормально сделанной системе конфликт находят при синхронизации второго устройства и показывают человеку, чтобы тот решил. Остерегайтесь любого приложения, которое обещает, что такого не случается никогда: обычно за этим стоит принцип «побеждает последняя запись», то есть чья-то работа пропадает, и никого об этом не предупреждают.
Нужно ли синхронизироваться вручную перед выездом на объект?
Не должно быть такой необходимости, а если она есть — это тревожный знак. Синхронизация должна идти в фоне постоянно, как только появляется связь.





