Приложение Т—Ж
В нем читать удобнее

«Блокируют — сделаем новое»: как я разработал «Трубку» — прило­же­ние для звонков через интернет

33
«Блокируют — сделаем новое»: как я разработал «Трубку» — прило­же­ние для звонков через интернет

Этот текст написан в Сообществе, бережно отредактирован и оформлен по стандартам редакции

Аватар автора

Александр Петров

не тратит деньги на связь

Страница автора

Когда заблокировали звонки через «Телеграм» и «Вотсап»*, я заметил, что люди неохотно переходят в «национальный мессенджер».

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

Я работаю в ИТ около 20 лет, начинал задолго до бума курсов и нейросетей — просто из интереса к разработке. Есть опыт как в найме, так и в собственных проектах, где занимался фронтендом, доработкой движков, а также контентом и продвижением. Последние шесть лет специализируюсь на фронтенде и создании мобильных приложений.

СООБЩЕСТВО
Хотите посоветовать какое⁠-⁠то приложение?

Или, наоборот, разругать его так, чтобы никто не устанавливал? Помогите читателям своим отзывом

Баннер

Разработка приложения

Я решил быстренько сделать звонилку для личных нужд и всех желающих. Название «Трубка» родилось почти мгновенно. В голове витала фраза Жоржа Милославского из комедии «Иван Васильевич меняет профессию»: «Положь трубку!» Да и вообще в русском языке это распространенное слово: «Возьми трубку», «Чего трубку не берешь?» Был еще вариант «Таксофон», но звучит тяжело, старомодно и к тому же немного созвучно с «Телеграмом».

Первый прототип. Повторюсь, у меня уже опыт мобильной разработки — как модулей, так и непосредственно на React Native  . Поэтому я планировал сделать первую версию приложения буквально за две недели.

С прототипом действительно уложился в эти сроки — в том числе благодаря помощи ChatGPT. Правда, большую часть того, что понаделал чат-бот, пришлось выкинуть — остался лишь небольшой объем его наработок.

К сожалению, сказалось полное отсутствие у меня опыта работы с WebRTC  . В первых прототипах были проблемы с установкой соединения. ChatGPT хоть и с энтузиазмом брался за их решение, часто уходил в оверинжиниринг  . После нескольких итераций, разговоров и чтения мануалов ко мне пришло понимание, что именно и как мы делаем. Дальше процесс пошел гораздо эффективнее.

В итоге полноценный релиз на iOS затянулся на месяц. Еще месяц потребовался, чтобы допилить приложение и опубликовать его в Google Play.

Вход в первую версию приложения
Вход в первую версию приложения

Архитектура. В первоначальном релизе были базовые функции: регистрация, добавление друг друга в контакты через внутреннюю систему номеров и сами звонки.

Если сильно упрощать, схема работы такая: есть мой сервер, где хранится информация об учетных записях пользователей и о том, кто кого добавил в контакты. Этот сервер используется только для сигналинга: он помогает устройствам «познакомиться», обменяться технической информацией для звонка и попытаться установить прямое соединение.

Дальше WebRTC строит зашифрованный канал уже между абонентами. Если сеть не позволяет соединиться напрямую, подключается TURN-сервер, который просто как посредник ретранслирует зашифрованный трафик.

Для разработки серверной части я активно применял LLM, в частности ChatGPT. Большая часть серверного кода была отдана ему на откуп — с этой задачей он справился вполне приемлемо.

Весь интерфейс UI и UX я делал уже без участия нейросетей: они пока плохо справляются с такими задачами. Видимо, потому что мыслят текстами и никогда не видели интерфейсы «живыми глазами».

Регистрация. Принципиальный момент: «Трубка» не привязана к реальному номеру телефона пользователя. Вместо этого каждому выдается внутренний номер — как в ICQ.

У такого решения была практическая причина. Если регистрировать пользователей по мобильному номеру, его нужно подтверждать через смс, а для небольшого проекта это быстро превращается в ощутимые расходы.

В какой-то момент я почти сделал бота в «Вотсапе»*, чтобы подтверждение номеров проходило через их инфраструктуру. Но как раз тогда начали появляться новости о возможной блокировке мессенджера. Стало понятно, что завязывать регистрацию на внешний сервис — рискованная идея, поэтому я оставил систему внутренних номеров.

1/2
Интерфейс приложения — с внутренними номерами, которые выдаются пользователям
Интерфейс приложения — с внутренними номерами, которые выдаются пользователям

С маркетинговой точки зрения привязка к телефону была бы удобнее: можно было бы проверять телефонную книгу пользователя и отправлять пуш-уведомления вроде «ваш контакт установил „Трубку“». Но такие механики сейчас сложно реализовать в рамках небольшого частного приложения.

Прочее. Кроме WebRTC в приложении используется фреймворк Apple CallKit на iOS — он отвечает за взаимодействие с системой: показывает экран звонка, помогает корректно работать с аудиосессией, микрофоном и другими системными вещами.

При первой публикации я с удивлением узнал, что в Китае на законодательном уровне запрещена публикация приложений с использованием API CallKit. То есть там просто нельзя выпустить частную звонилку, Apple строго за этим следит. Для меня не было проблемой исключить Китай из списка стран распространения приложения, но тенденция выглядит немного тревожно.

Релиз приложения

Сначала «Трубка» вышла на iOS — приложением пользовались только я и небольшой круг близких людей. Такое внутреннее тестирование помогло отловить обидные баги.

Доступ для коллег. В это же время Google рассматривал мою заявку на создание аккаунта разработчика. В Google Play тогда действовало новое правило: чтобы выпустить приложение, нужно было сначала собрать тестовую группу пользователей и провести среди них закрытое тестирование в течение двух недель.

Я кинул клич среди коллег, мол, сделал приложение-звонилку — если у вас Android, помогите набрать нужное количество установок. Оно набралось буквально за час. После этого к моему рабочему месту даже проложилась маленькая тропа.

Коллеги подходили с фразами вроде: «Пс-с-с… установишь „Трубочку“?» или «А дай красивый номерок».

Получились какие-то бутлегерские онлайн-звонки — по-другому и не скажешь.

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

Счет с десятков пользователей постепенно перевалил за сотни.

Рост проекта. Все это время я продолжал улучшать приложение: закрывал баги, добавлял новые функции.

Например, в первой версии нельзя было переименовать контакт, а история звонков хранилась у меня на сервере. Казалось бы, простая задача — переименование контакта, а выполнение растянулось почти на месяц. Пришлось переделывать часть UX и серверной логики.

Сейчас контакту можно назначить любое имя и даже поставить фотографию, а история звонков хранится только в локальной базе данных на устройстве пользователя.

В декабре «Трубка» попала в публикацию одного телеграм-канала — там был список приложений, которыми можно пользоваться в России для звонков при отсутствии «Вотсапа»* и «Телеграма». Упоминание дало мгновенный буст установок: кривая пользователей резко пошла вверх, быстро перевалила за тысячу и продолжила расти.

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

1/2
Так выглядит последняя версия «Трубки» — с историей и возможностью включить видео
Так выглядит последняя версия «Трубки» — с историей и возможностью включить видео

Начали приходить отзывы в Google Play — как благодарности, так и сообщения о багах. Количество устройств росло, а вместе с ними появлялись и специфические проблемы: у кого-то не включается громкая связь, у кого-то не работает микрофон.

Моего набора тестовых устройств явно не хватало, чтобы воспроизводить все эти ошибки. Поэтому пришлось даже купить пару дешевых б/у Android-телефонов, чтобы поймать конкретный баг с захватом звука.

Итоги

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

В какой-то момент мне пришло осознание, что это уже не игрушка для своих, а полноценный публичный продукт. Аналитика показывала в пиковые моменты до 70 человек онлайн за 30 минут. Среднее время, которое пользователи проводили в приложении, — около 18 минут. На прошлых проектах я видел и больший онлайн, но такой вовлеченности — ни разу. То есть люди действительно разговаривали друг с другом прямо сейчас и рассчитывали на приложение.

Пришлось менять и процесс разработки. Уже нельзя было просто зайти на продакшен-сервер, что-то поменять и перезапустить сервисы. Появилось отдельное тестовое окружение — обновления сначала проверяются там и только потом выкатываются для всех в периоды минимальной нагрузки.

Планы. Когда замедлили «Телеграм», друзья начали все чаще спрашивать: «Ну что, сделаешь чаты?» Даже незнакомые люди в отзывах Google Play просят добавить функции мессенджера.

Оглядываясь на путь от идеи «сейчас за две недельки сбацаю звонилку» до проекта с тысячами установок, я понимаю: сделать чаты, конечно, можно. Но получится ли сделать их так, чтобы людям было удобно пользоваться?

Если браться за задачу, хочется сделать ставку на приватность: не хранить переписку на сервере, шифровать сообщения и доставлять их напрямую на устройства пользователей. Присматриваюсь к тому, как это реализовано в Signal.

Это уже задача совсем не на две недели — и инфраструктурно, и с точки зрения UX. Реакции, форвардинг сообщений, групповые чаты — люди привыкли к очень высокому уровню удобства. Поэтому пока я сосредоточен исключительно на функции звонков. Хочется довести до зрелого состояния надежную и приватную связь между людьми — задачу, из-за которой «Трубка» вообще появилась на свет.

В ближайших планах — полноценные групповые звонки. Дальше буду смотреть по обстоятельствам, насколько проект окажется востребованным, потому что моя мотивация тоже не бесконечная.

РедакцияПо каким недоступным в РФ ​приложениям вы скучаете?
  • Александр Петровineza, пишет не ИИ. А почему вы должны были о нем слышать, если я прямо пишу, что это небольшое частное приложение13
  • Evil_designerА что с персональными данными, содержанием звонков? Как обрабатываете/храните/защищаете?11
  • Александр ПетровEvil_designer, под капотом используется webrtc уже писал. Это значит что система пытается соединить вас НАПРЯМУЮ, приложение и мои сервера лишь помогают установить такой прямой туннель между вами и собеседником. Webrtc под капотом по умолчанию зашифрован. А для регистрации в самом приложении использую гугл или эпл сервис, оттуда получаю только ваш емаил (его можно и не передавать при желании) и псевдоним, других перс-данных не собираю16
  • Можно просто ДмитрийАлександр, ну, сейчас его кругом подозревают :)1
  • Можно просто ДмитрийМолодец, прикольное приложение! Мне вроде без надобности, но сам факт, что человек может вот так взять и запилить такое работающее приложение, на мой взгляд, очень круто!18
  • Андрей ЛАлександр, и очень хорошо, развивайте свой сервис и дальше, то низа что и никогда не выдавайте персональных данных, мало ли..3
  • ВиталийВсё-таки оставаться ниже радаров или публикация на ТЖ не считается? Если что, полностью поддерживаю идею приложения. Удобно3
  • Александр ПетровВиталий, Спасибо. Формально публикация на ТЖ, а по факту в чулане раздела "сообщества", так что будем считать, что ниже3
  • Андрей Лineza, не доверяй никому и просто проверяй..7 раз1
  • inezaАндрей, вот и не доверяю.0
  • Меня чёрное стройнитщас умельцы начнут приложухи пиоить, блокать не успевать1
  • Мihailas JacevičiusПрограммка не даёт мне залогиниться через Гугл, выдает ошибку.0
  • Александр ПетровМihailas, Google-вход в приложении работает у подавляющего большинства пользователей (вы первый кто жалуется), поэтому с высокой вероятностью ошибка связана с настройками именно вашего аккаунта или устройства. попробуйте: Обновить Google Play Services и Google Play Store, перезагрузить телефон. В настройках Google Аккаунта: Безопасность → Подключения/доступ сторонних приложений — убедиться, что доступ не заблокирован, и при необходимости дать разрешение заново. Если это рабочий/учебный аккаунт (Google Workspace) — возможны ограничения администратора на вход в сторонние приложения. Если включена Advanced Protection, она тоже может мешать некоторым сценариям авторизации. Очистить кэш/данные Google Play Services (Android) и попробовать снова.2
  • Ольга ГорностайТолько что говорила по Трубке с мамой из Беларуси. Связь отличная! Если и с безопасностью все ок, то вообще супер.5
  • angry.cupКруто! Подскажите, как можно установить на Huawei?0
  • АлександрПочему это здесь а не на Хабре. Там комментаторы более подкованны в таких вопросах и они точно нашли бы к чему придраться0
  • nektoСпасибо огромное за приложуху, Алексей! Сам юзаю и друзьям рассказал1
  • Викускин любимыйСистема регистрации пользователей по внутреннему id не позволяет идентифицировать абонента. Это с одной стороны хорошо, так как соблюдается конфиденциальность. С другой стороны - плохо, так как в приложении могут зарегаться любые люди, в том числе мошенники, террористы, преступники. Вы как-то пытаетесь контролировать, кто регистрируется в вашем приложении и кто пользуется им? Если да, то как это происходит? Если нет - то вы просто создали очередной удобный инструмент для всяких там лиц, использующих вашу связь в серых и черных схемах0
  • Продолжаю наблюдениеЧестно - я держу большие надежды в отношении таких изобретателей. Спасибо вам, и тем, кто идет с вами в одном направлении!6
  • Крекер ГорТоже поставлю, лишь бы меня не загоняли насильно куда мне не хочется.2
  • Евгений Вакуленкоangry.cup, заходите в play market, пишите в поиске трубка0
  • angry.cupЕвгений, на Huawei нет play market, есть gbox, но там часть функций в приложениях не работает, если через него качать (например, уведомления не приходят). В AppGallery трубки нет.0
  • Евгений Вакуленкоangry.cup, ого, не знал, apk файл тогда попросить у автора)0
  • Мама ПапаКруто! А можете добавить технических подробностей? На чем писали, на чём интерфейс?0
  • АлексАлександр, здравствуйте! Попробовали функционал, интересно очень, связь вроде бы хорошая как аудио, так и видео. Однако обращаю внимание на несколько моментов, которые при росте аудитории могут стать критическими. Приложение по своей функциональности подпадает под определение ОРИ согласно ст. 10.1 ФЗ № 149-ФЗ. Закон распространяется не только на текстовые сообщения, но и на голосовую информацию. Отсутствие чатов не освобождает от обязанностей ОРИ, поскольку приложение организует передачу голосового трафика. Как пример, Хамовнический суд Москвы в январе 2026 года признал запрещенным приложение для изменения голоса при звонках, указав, что его функциональность создает условия для экстремистской деятельности и мошенничества. Анонимность (внутренние номера), отсутствие привязки к реальному телефону и шифрование канала (WebRTC) могут быть квалифицированы по аналогии как функциональность, создающая условия для противоправной деятельности, независимо от наличия текстовых чатов. Даже если приложение не хранит текстовые сообщения, серверы сигналинга и TURN-серверы являются критической инфраструктурой. РКН может внести IP-адреса этих серверов в Единый реестр запрещенной информации (ст.15.1 ФЗ № 149-ФЗ), что полностью парализует работу приложения, так как соединение между абонентами станет невозможным. Будьте аккуратны и пытайтесь митигировать риски заранее.1
  • Yuri GВы большой молодец! Посоветуйте приложение для звонков за границу на мобильные и стационарные0
  • Александр ПетровМама, UI приложения react-native, сервер nodejs, и немного допиливания нативных плагинов для работы со звуком и телеком1
  • Александр ПетровАлекс, Спасибо1
  • Александр Петровangry.cup, Пока никак, к сожалению. Но планирую выпуск0
  • angry.cupАлександр, спасибо за ответ! Буду ждать.0
  • diman13-19Попробовал, работает! Спасибо за ваши труды! Но, как только ваше приложение наберёт популярность, попадет под блокировку 😬0