Я случайно сделал так, что новый пользователь не мог зарегистрироваться в приложении. Не из-за сбоя сервера, не из-за ошибки авторизации и даже не из-за бага в API. Я сам запер экран входа за платной подпиской.

Любая разработка мобильного приложения — это путь проб и ошибок. Недавно в моём приложении для учёта рабочих смен (ShiftSchedule) я столкнулся с классической проблемой, которая едва не стоила мне новых пользователей. Это история о техническом дедлоке, «проблеме курицы и яйца» в логике и о том, почему путь к регистрации всегда должен оставаться свободным.


Как я сломал onboarding для новичков

В последнем релизе я улучшил систему безопасности, в том числе и получение бесплатного пробного PRO-периода (триала). Логика задумывалась максимально честной и удобной:

Вы скачиваете приложение. Авторизуетесь (создаёте аккаунт). Приложение автоматически дарит вам бесплатный PRO-триал без привязки карт. Также в приложении есть подарочные промокоды, которые я периодически разыгрываю.

Но вскоре после релиза мне написал реальный пользователь: он выиграл подарочный промокод, попытался его ввести, приложение попросило авторизоваться, а на экране аккаунта высветилась глухая заглушка — «Требуется PRO-доступ».

Ни формы логина, ни кнопок. Тупик.


Проблема курицы и яйца

Начав расследование, я обнаружил, что сам создал дедлок. Проверка PRO-доступа выполнялась раньше, чем пользователь успевал войти в аккаунт.

Получился замкнутый круг:

Чтобы получить триал (PRO-доступ), пользователю нужно войти в аккаунт. Чтобы увидеть экран входа, пользователю нужен PRO-доступ.

Новые пользователи физически не могли пробить эту стену. Почему я не заметил этого раньше? Всё просто: на моих тестовых устройствах и у старой аудитории действовал переходный период лояльности (grace period). У старых пользователей проверка прав всегда проходила успешно, и для меня баг оставался абсолютно невидимым целый месяц.


Снимаю замки

Самым простым решением, казалось бы, было добавить костыли: пускать на экран регистрации тех, у кого «ещё не было триала», или сделать отдельную кнопку входа где-нибудь сбоку.

Но в итоге я понял, что сама идея была неправильной. Экран авторизации вообще не должен зависеть от подписки. Я решил не городить исключения, а убрать саму причину проблемы.

Я полностью удалил проверку PRO-доступа с экрана аккаунта.

Теперь любой человек может скачать приложение, свободно зайти в свой профиль, посмотреть статус подписки или ввести промокод. Платными (закрытыми) остались только конкретные функции — например, синхронизация данных с сервером или совместный график партнёров. А регистрация и получение триала работают как часы.

Довольный пользователь смартфона после исправления регистрации

После исправления любой новый пользователь снова может свободно зайти в аккаунт и получить пробный PRO-период.


Итоги

Самое интересное, что проблема была не в подписке. И не в триале. Она была в архитектуре.

Я пытался защитить платную функцию, но случайно защитил путь к её получению. Пользователь никогда не должен доказывать приложению, что достоин увидеть экран входа.

После исправления правило стало очень простым:

Платными могут быть функции. Экран аккаунта, вход и регистрация — никогда.

А вы когда-нибудь сталкивались с подобными «дедлоками» в любимых приложениях? Делитесь в комментариях в наших пабликах VK, Telegram и MAX.

Попробуйте ShiftSchedule

Бесплатно. Без рекламы. Для тех, кто работает по сменам.

Скачать в RuStore