Я случайно сделал так, что новый пользователь не мог зарегистрироваться в приложении. Не из-за сбоя сервера, не из-за ошибки авторизации и даже не из-за бага в API. Я сам запер экран входа за платной подпиской.
Любая разработка мобильного приложения — это путь проб и ошибок. Недавно в моём приложении для учёта рабочих смен (ShiftSchedule) я столкнулся с классической проблемой, которая едва не стоила мне новых пользователей. Это история о техническом дедлоке, «проблеме курицы и яйца» в логике и о том, почему путь к регистрации всегда должен оставаться свободным.
Как я сломал onboarding для новичков
В последнем релизе я улучшил систему безопасности, в том числе и получение бесплатного пробного PRO-периода (триала). Логика задумывалась максимально честной и удобной:
Вы скачиваете приложение. Авторизуетесь (создаёте аккаунт). Приложение автоматически дарит вам бесплатный PRO-триал без привязки карт. Также в приложении есть подарочные промокоды, которые я периодически разыгрываю.
Но вскоре после релиза мне написал реальный пользователь: он выиграл подарочный промокод, попытался его ввести, приложение попросило авторизоваться, а на экране аккаунта высветилась глухая заглушка — «Требуется PRO-доступ».
Ни формы логина, ни кнопок. Тупик.
Проблема курицы и яйца
Начав расследование, я обнаружил, что сам создал дедлок. Проверка PRO-доступа выполнялась раньше, чем пользователь успевал войти в аккаунт.
Получился замкнутый круг:
Чтобы получить триал (PRO-доступ), пользователю нужно войти в аккаунт. Чтобы увидеть экран входа, пользователю нужен PRO-доступ.
Новые пользователи физически не могли пробить эту стену. Почему я не заметил этого раньше? Всё просто: на моих тестовых устройствах и у старой аудитории действовал переходный период лояльности (grace period). У старых пользователей проверка прав всегда проходила успешно, и для меня баг оставался абсолютно невидимым целый месяц.
Снимаю замки
Самым простым решением, казалось бы, было добавить костыли: пускать на экран регистрации тех, у кого «ещё не было триала», или сделать отдельную кнопку входа где-нибудь сбоку.
Но в итоге я понял, что сама идея была неправильной. Экран авторизации вообще не должен зависеть от подписки. Я решил не городить исключения, а убрать саму причину проблемы.
Я полностью удалил проверку PRO-доступа с экрана аккаунта.
Теперь любой человек может скачать приложение, свободно зайти в свой профиль, посмотреть статус подписки или ввести промокод. Платными (закрытыми) остались только конкретные функции — например, синхронизация данных с сервером или совместный график партнёров. А регистрация и получение триала работают как часы.
После исправления любой новый пользователь снова может свободно зайти в аккаунт и получить пробный PRO-период.
Итоги
Самое интересное, что проблема была не в подписке. И не в триале. Она была в архитектуре.
Я пытался защитить платную функцию, но случайно защитил путь к её получению. Пользователь никогда не должен доказывать приложению, что достоин увидеть экран входа.
После исправления правило стало очень простым:
Платными могут быть функции. Экран аккаунта, вход и регистрация — никогда.
А вы когда-нибудь сталкивались с подобными «дедлоками» в любимых приложениях? Делитесь в комментариях в наших пабликах VK, Telegram и MAX.