Содержание
Практическая карта трёх корзин: какой контекст можно оставить на устройстве, какую запись должен подтвердить сервер и какие секреты нельзя класть в обычную память приложения.
На телефоне оставляйте только обратимый и не секретный контекст, который помогает продолжить действие. Запись, право на действие и актуальный статус должны жить на сервере. А пароль, ключ, платёжные и восстановительные данные не должны попадать в обычную память приложения вовсе.
Разделять это нужно не после первого инцидента, а в тот момент, когда команда рисует маршрут. Иначе приложение честно помнит фильтр, но так же уверенно помнит давно отменённую запись или оставляет рядом с выбором то, что вообще не должно было лежать на устройстве.
Память о выборе не равна правде о сервисе
Человек выбрал марку автомобиля, размер, дату, адрес или вариант услуги. Приложение запомнило этот шаг и при следующем открытии показало его снова. Для посетителя это удобно: не надо повторять путь с нуля. Но в этот же момент возникает опасная подмена. Экран начинает выглядеть так, будто всё выбранное по-прежнему доступно, закреплено и разрешено.
На самом деле один и тот же экран может хранить три совершенно разные вещи. Фильтр «показать шины для этой машины» только помогает смотреть каталог. Запись на 17:00 уже касается работы команды. А право отменить заказ или войти в личный раздел вообще нельзя выводить из того, что на телефоне осталась старая карточка.
Я бы начинал не с вопроса «где технически хранить», а с более простого: что случится, если телефон потеряли, открыли с другого устройства или условие изменилось за ночь? Если ответ звучит «ничего страшного, человек просто увидит прежний контекст», это кандидат для локальной памяти. Если сервис обязан узнать, продолжить или запретить действие, одному телефону доверять уже нельзя.
Что здесь важно: память ускоряет следующий шаг, но не подтверждает реальность, право или обязательство.
На телефоне оставляйте контекст, который не жалко перепроверить
В первой корзине лежит то, что помогает человеку продолжить свой путь, но не даёт ему особого права и не создаёт обязательство у команды. Последний открытый раздел, порядок сортировки, выбранные фильтры, черновой набор вариантов, спокойная настройка интерфейса или подсказка, которую уже закрыли, обычно относятся сюда.
Полезный тест звучит почти грубо: «Если это исчезнет, мы сможем показать человеку нормальный экран и попросить выбрать заново только этот пункт?» Если да, локальная память уместна. Она убирает лишние нажатия, но не заставляет сервис верить в старую копию данных.
У такой корзины есть ещё два правила. Контекст не должен быть секретом, и он не должен звучать как подтверждение. Пусть приложение помнит подбор автомобиля, но заново проверяет наличие конкретной позиции. Пусть оставляет черновик сообщения, но не считает его отправленной заявкой. Это скромное различие избавляет от очень бодрых экранов со статусом «всё готово», когда готов только прошлый выбор.
Практический вывод: локально храните удобный след действия, который можно потерять, перепроверить и не принять за обещание.
На сервере живёт то, что сервис обязан продолжить
Во вторую корзину попадает не «всё важное», а то, что должно пережить телефон, повторный вход и разговор с сотрудником. Созданная запись, заказ, бронь, статус оплаты, список собственных объектов, история подтверждённого обращения, право на конкретное действие и связь с человеком должны существовать там, где сервис может их проверить, изменить и объяснить.
Здесь важна не любовь к серверу как к волшебному шкафу. Важна ответственность. Если администратор видит запись, если человек ждёт ответ по ней, если другой телефон должен показать тот же результат, перед нами уже не просто удобный интерфейсный след. Нужна серверная запись с понятным владельцем, состоянием и правилами изменения.
Внутри Mini App человек может открыть приложение из разных мест и вернуться не тем же маршрутом. Поэтому серверная проверка должна заново устанавливать, кто пришёл и имеет ли он право видеть или менять эту запись. Данные, которые пришли в экран при запуске, сами по себе не становятся достаточным основанием для такого решения. Их сначала проверяют на стороне сервиса.
Граница ответственности: если событие меняет работу команды или право человека, его источник истины должен быть доступен и проверяем вне одного телефона.
В обычной памяти телефона не место секретам и чужому праву
Третья корзина нужна, чтобы команда не прятала риск за словом «сохранить». Пароли, ключи доступа, коды восстановления, платёжные реквизиты, фразы для восстановления кошелька и долгоживущие данные, которые позволяют выдать себя за человека, не должны попадать в обычное локальное хранилище. Нельзя считать безопасным и непроверенное имя пользователя, которое просто приехало в экран при открытии.
У платформы может быть отдельное защищённое хранилище устройства. Это полезная техническая возможность для ограниченного токена или состояния входа. Но оно не отменяет главный вопрос: кто и как может отозвать доступ, проверить срок действия и остановить подозрительное действие? Эти решения всё равно остаются за сервером. Защищённая ячейка не превращает телефон в источник истины.
Не стоит превращать этот абзац в список страшилок. Для обычного каталога без входа достаточно просто не складывать лишнее. Чем меньше приложение помнит о человеке без практической причины, тем проще объяснить путь данных и тем меньше сюрпризов при смене телефона, ошибке или передаче работы новому разработчику.
Необходимая оговорка: защищённое хранилище помогает хранить ограниченный технический след, но не заменяет проверку, срок действия и отзыв доступа на сервере.
Разложите один маршрут по трём корзинам до разработки
Возьмите не абстрактное «личный кабинет», а один короткий путь: человек подбирает комплект, выбирает дату сервиса и просит сохранить результат. Выпишите пять полей, которые реально появляются в этом маршруте. Например: фильтр по автомобилю, текущий автомобиль, черновик контакта, запись на сервис и секрет доступа.
Напротив каждого поля ответьте на четыре вопроса. Можно ли безболезненно потерять его вместе с телефоном? Должен ли его увидеть сотрудник или другой телефон? Даёт ли оно право совершить действие? Может ли оно измениться без участия человека? Первое поле обычно уходит в локальную корзину. Второе и третье требуют серверной записи. Четвёртое часто означает: локальная копия допустима только как контекст, а перед действием нужен новый серверный ответ.
Пятая группа не требует долгого обсуждения: если поле открывает доступ, восстанавливает личность или позволяет списать деньги, ему не место в обычной памяти телефона. Если без такого поля путь не работает, это повод отдельно спроектировать вход и серверную проверку, а не спрятать сложность в невидимую ячейку.
Эта проверка не заменит аудит безопасности и не нарисует базу данных за пятнадцать минут. Зато она быстро ловит две дорогие ошибки: когда приложение пытается подтвердить старую локальную копию и когда настоящая запись нигде не существует, кроме одного устройства.
Промежуточный итог: у каждого поля должен быть не только экран, но и срок жизни, владелец и понятный ответ на потерю устройства.
Сначала срок жизни состояния, потом место хранения
Mini App не становится лучше от того, что умеет помнить больше. Хороший результат появляется, когда человек быстро узнаёт свой контекст, а сервис не делает вид, что прошлый экран равен актуальному обязательству. Телефон продолжает путь. Сервер хранит и подтверждает то, за что сервис отвечает. Секреты не прячут в обычную память ради удобства.
Исключение простое: если Mini App вообще не создаёт запись, не даёт доступа и не меняет условий, отдельная серверная модель может оказаться избыточной. Но как только выбор превращается в заказ, бронь, личное право или действие команды, вопрос уже не про красивое сохранение. Он про источник истины.
Главный вывод: сохраняйте на телефоне только то, что помогает продолжить без обещания. Всё, что создаёт право, обязательство или риск, должно иметь проверяемый серверный хозяин.
Частые вопросы о памяти Mini App
Нужно ли отправлять на сервер каждый фильтр?
Нет. Если фильтр нужен только для удобства текущего выбора и его потеря не меняет право, цену, наличие или работу команды, он может остаться локальным. Сервер нужен, когда этот выбор должен стать общим и подтверждённым состоянием.
Можно ли показать человеку старую цену или свободное время?
Можно показать их как прошлый контекст, но не как действующее условие. Перед записью, оплатой или подтверждением сервис должен проверить актуальное значение и честно показать, если оно изменилось.
Зачем сервер, если приложение открывают только внутри Telegram?
Потому что один экран не является источником прав и обязательств. Запись, доступ и действия команды должны переживать устройство, повторный вход и проверку того, кому они принадлежат.
Защищённое хранилище телефона решает всё?
Нет. Оно может быть уместно для ограниченного технического состояния, но не отменяет серверный срок действия, проверку, отзыв доступа и правила конкретного продукта.
Когда достаточно вообще ничего не сохранять?
Когда маршрут состоит из одного сообщения или ссылки и человеку не нужно возвращаться к сравнению, записи или личному состоянию. В таком случае память добавит больше вопросов, чем пользы.
Источники и полезные продолжения
Внешние материалы помогают проверить возможности платформы и границы исследований. Внутренние разборы продолжают тему с другой стороны, без повторения этой карты.
- Возможности Mini AppsКак устроены данные запуска, локальное, защищённое и облачное хранение внутри платформы.Открыть источник ↗
- Исследование прозрачности потоков данныхРабота с открытой методикой о том, как наблюдаемые обращения приложений соотносятся с их описаниями обработки данных.Открыть исследование ↗
- Исследование хранения материалов аутентификацииРазбор рисков обычного хранения чувствительных данных на устройстве и мер, которые авторы предлагают разработчикам.Открыть исследование ↗
- После паузы: вернуть выбор, а не ложный статусСледующий вопрос после хранения: что именно показать человеку, когда он вернулся позже.Открыть разбор ↗
- Перед подтверждением: отделить выбранное от проверяемогоКак не назвать заказом то, что сервис ещё только получил на проверку.Открыть разбор ↗
- Кейс Mini App с каталогом и личным разделомПрактический пример, где текущий выбор и постоянное состояние сознательно разведены.Открыть кейс ↗