Обновить
256K+

Разработка мобильных приложений *

Android, iOS, Windows Phone и прочие

184,55
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Как я сделал групповые звонки в React Native мессенджере: WebRTC, CallKit и грабли production'а

Уровень сложностиСложный
Время на прочтение11 мин
Охват и читатели14K

Это третья статья из серии про инженерные решения в ONEMIX — моём мессенджере на React Native. В первой я разбирал трёхуровневый кэш сообщений, во второй — реализацию Double Ratchet E2E. Сегодня — про звонки.

Звонки в мессенджере — это та функция, которая работает либо отлично, либо никак. Пользователь привык что WhatsApp/Telegram звонят мгновенно, показывают входящие на заблокированном экране, переживают переключения Wi-Fi/LTE, и работают из фона. Если твоя реализация делает хоть что-то из этого хуже — пользователь это сразу заметит и переключится на "нормальный" мессенджер.

Я потратил несколько месяцев на то чтобы довести звонки в ONEMIX до production-уровня. В процессе пришлось изучить WebRTC изнутри, разобраться с iOS CallKit и VoIP push notifications, и собрать десяток граблей которые в туториалах не упоминают. В этой статье — как это устроено, какие решения оказались критичными, и что бы я сделал по-другому.

Сразу оговорка. Я не использую готовые SDK типа Agora, Twilio, 100ms. У них отличное качество и поддержка, но они не дают полного контроля над процессом — а для мессенджера контроль критичен. Когда звонок не проходит, пользователь винит приложение, а не "SDK от третьей стороны". Плюс готовые SDK стоят денег, которые на раннем этапе продукта лучше направить в другие места.

Читать далее

Регистрация программы в Роспатенте: защита или миф?

Время на прочтение6 мин
Охват и читатели10K

Один из самых распространённых вопросов от стартапов и разработчиков: «Нам нужно зарегистрировать программу в Роспатенте — это же обязательно для защиты?»

Нет. И это не единственное заблуждение вокруг регистрации программ для ЭВМ.

Разберём, что регистрация реально даёт, почему недобросовестный человек может зарегистрировать вашу программу на себя, и чем ситуация в России принципиально отличается от США.

Развеять миф

Я реализовал Double Ratchet в React Native мессенджере. Разбор протокола и кода

Уровень сложностиСложный
Время на прочтение16 мин
Охват и читатели9.3K

В прошлой статье про трёхуровневый кэш сообщений я уже упоминал, что делаю мессенджер ONEMIX на React Native. Базовое E2E у меня было простое: ECDH P-256 для обмена ключами при первом контакте, AES‑GCM для шифрования каждого сообщения общим секретом. Это работает, но имеет одну проблему: общий секрет один на всю переписку. Если у одной из сторон скомпрометируют приватный ключ — все сообщения за всё время превращаются в открытый текст.

Это называется отсутствием Perfect Forward Secrecy (PFS). И это значит, что человек, к которому в руки попадёт твой телефон через год, может прочитать переписку из прошлого года. WhatsApp, Signal, и серьёзные части Telegram давно используют другую схему — Double Ratchet — которая ключи переизбретает заново на каждом сообщении. Так делают потому, что любой ключ компрометируется в один момент времени, и компрометация не должна давать доступа ни к прошлому, ни к будущему.

Я реализовал Double Ratchet с нуля для ONEMIX. В этой статье разберу:

Читать далее

Как я сделал трёхуровневый кэш сообщений в мессенджере на React Native — и что узнал по дороге

Уровень сложностиСложный
Время на прочтение14 мин
Охват и читатели9.3K

Я делаю мессенджер ONEMIX на React Native. К моменту, когда я начал писать этот пост, в нём уже больше десятка экранов, групповые WebRTC-звонки через LiveKit, E2E на Double Ratchet + Sealed Sender, push-нотификации с cold-start навигацией и десктоп-версия на Electron. Но самым важным куском, который определяет ощущение от приложения, оказался не звук и не видео. А то, насколько быстро открывается чат.

Если вы хоть раз делали список сообщений на React Native, вы знаете эту боль: открыл чат — пустой экран на 200–800 мс, потом подгрузка, потом скачок при докрутке наверх. В Telegram такого не бывает: открыл — мгновенно увидел последние сообщения, прокрутил наверх — никаких пустот, история идёт сплошной лентой.

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

Читать далее

L×Box: диагностика per-app трафика, посмотрим кто куда ходит

Уровень сложностиСложный
Время на прочтение9 мин
Охват и читатели12K

Недавно я дебажил проблему «Tinkoff Investments не открывается через VPN» — стандартная, split-routing проблема. Симптом: app запускается, картинки грузятся, но авторизационная сессия не поднимается, login висит. Через 30 минут возни со снапшотами /state, /connections, /logs и ручного matching'а conn_id'ов между ними картина прояснилась.

Часть доменов вида *.t-bank-app.ru корректно матчится в мой ru-domains rule_set и идёт напрямую. Но другая часть резолвится через CNAME на *.trbcdn.net (TLD .net!) — этот target в ru-domains уже не попадает, и sing-box честно отправляет трафик через bypass-VPN в Польшу. Получается split: часть запросов уходит с моего домашнего IP, часть — с польского. Bank-backend, который привязывает session к source-IP / fingerprint'у, видит непоследовательного клиента и просто отказывается поднимать auth state.

Симптом — «login завис», корень — domain-level split routing внутри одного приложения.

Стало ясно: такая диагностика не должна занимать 30 минут. Поэтому в L×Box (мой Android-клиент на sing-box, open source) появилась фича — Per-app traffic profiler.

Читать далее

Топ офлайн‑приложений для работы без интернета: от задач до карт

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели11K

Облачные сервисы хороши, пока у вас есть стабильный интернет. Но стоит уйти в авиарежим, сесть в поезд с «едва живым» хотькаким-G или оказаться в метро без сети — и привычный таск‑менеджер, календарь, карты и почта внезапно перестают быть рабочим инструментом, превращаясь в пассивный просмотр старых данных.

Поэтому я собрала топ офлайн‑приложений для работы без интернета — от планировщика задач и заметочника до офисного пакета, карт, почтового клиента и защищённого мессенджера.

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

Читать далее

Сделал пет‑проект, а дальше что? Как я получил первые 2500 пользователей за 0 рублей

Время на прочтение14 мин
Охват и читатели13K

Полгода назад я зарелизил свое мобильное приложение. И с этого же дня начал привлекать пользователей. Сначала я показывал кривую MVP, потом постепенно улучшал продукт. На сегодняшний день получил больше 2500 установок без вложений, только через бесплатный контент‑маркетинг.

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

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

Читать далее

«У нас было 230 тысяч строк легаси-кода». Как мы изменяли приложение «Настройки»

Время на прочтение16 мин
Охват и читатели13K

Привет, Хабр! Меня зовут Александр. В YADRO я разрабатываю приложения внутри оболочки kvadraOS: да, у нас есть своя оболочка на основе AOSP — в команде One UI, Color OS и MiUi прибыло. 

Сегодня расскажу о тайнах и тонкостях приложения «Системные настройки» — это наша реликвия, очень старое приложение с нагромождением костылей стилей и подходов. Когда наша команда взялась его перерабатывать, у нас было 230 000 строк legacy-кода на Java и около 300 активностей и фрагментов. Как вы понимаете, задача была не из легких.

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

Читать далее

200 OK иногда = кома: почему API «работает», а приложение — нет (и как нам помог ИИ)

Уровень сложностиСредний
Время на прочтение14 мин
Охват и читатели8.5K

Статус 200 OK коварен своей тривиальностью.

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

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

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

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

Я Алексей Матвеев, директор по мобильным технологиям в «Первой Форме», и в нашей компании, к сожалению, такое тоже происходит. Чтобы ловить такие расхождения до релиза, нам же был нужен прогноз совместимости до того, как изменения на бэкенде затронут пользователей. Мы создали прозрачный конвейер самодиагностики, который подсвечивает нестыковки в данных еще на этапе тестирования бэкенда, гарантируя корректную работу тех версий приложения, которые уже живут на устройствах пользователей. В статье расскажу подробно, как устроено это решение.

Читать далее

Один ИИнженер — десять рук: как мы исследовали LLM в AppSec

Время на прочтение7 мин
Охват и читатели9.7K

Всем привет, на связи Solar appScreener!
В этой статье расскажем о нашем опыте использования ИИ в нашем собственном продукте.

ИИ‑агенты уже стали неотъемлемой частью процесса разработки, это больше не мимолетный хайп, а новая реальность. По данным исследования Sonar (State of Code Developer Survey 2026, https://www.sonarsource.com/state‑of‑code‑developer‑survey‑report.pdf), 72% разработчиков, попробовавших использовать ИИ, стали использовать его ежедневно. А 42% всего написанного кода уже сгенерирован ИИ, или существенно им доработан. Какие‑то запредельные числа. Стоит признать, что мы живем в новой реальности, в которой вайбкодинг — это новый стиль программирования.

Читать далее

Как одна OC может запускать приложения из разных миров

Уровень сложностиПростой
Время на прочтение12 мин
Охват и читатели17K

Когда мы разрабатываем настольную операционную систему, очень легко попасть в архитектурную ловушку: начать строить систему вокруг одного типа приложений. Исторически так и происходило: Windows запускала Windows‑приложения, macOS запускала macOS‑приложения и Linux — Linux‑приложения. Но пользователь живет не в этом мире. Ему неважно, на каком языке написана программа, под какую платформу она создавалась и какая у нее экосистема. Он хочет, чтобы нужные приложения запускались у него быстро и максимально удобно.

Привет, Хабр! Меня зовут Илья Клементьев, я старший инженер‑программист в отделe разработки сервисов настольной ОС в YADRO. Современные ОС постепенно двигаются в сторону универсальных хостов — то есть систем, которые способны запускать приложения из разных программных экосистем. В статье я расскажу, как можно запускать Android‑ и Windows‑приложения внутри Linux, какие технологии для этого используются и как устроена многоуровневая архитектура системы с виртуальной машиной и контейнерами.

Читать далее

Simplphoto для iPhone объединяет ручную камеру, stop motion и коллажи

Уровень сложностиПростой
Время на прочтение3 мин
Охват и читатели8.5K

Разработка iOS-приложения для ручной съёмки на iPhone: ISO, выдержка, фокус, RAW, stop motion и попытка ограничить вычислительную обработку снимков. Описываю принцип работы приложения.

Читать далее

За два месяца вместо года: как мы переписали 97 тысяч строк кода с Objective-C на Swift

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели30K

Миграция большого iOS-проекта с Objective-C на Swift кажется понятной задачей ровно до тех пор, пока не начинаешь считать объём. В нашем случае это были 10 тысяч файлов, сотни тысяч строк кода и постоянная необходимость не останавливать развитие продукта. Ручной подход работал слишком медленно, поэтому мы начали автоматизировать миграцию с помощью LLM — и в итоге превратили её из бесконечного техдолга в воспроизводимый процесс.

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

Меня зовут Андрей Сикерин, я руковожу одной из групп iOS-разработки Яндекс Браузера. Вместе со мной статью писала Елизавета Мазулова, разработчица из нашей же команды. Она создала систему промптов для миграции, ревью, рефакторинга и автоматизации тестирования. Вместе мы расскажем, как устроен весь процесс изнутри: от выбора порядка миграции модулей до контроля качества через тесты.

Все промпты, конфигурационные шаблоны и вспомогательные скрипты выложили в открытый доступ — забирайте и адаптируйте под свой проект. Мы уже проверили, что подход работает не только у нас: взяли открытый репозиторий приложения Wikipedia для iOS и без существенных изменений промптов мигрировали один из его пакетов и поделились результатом с сообществом в виде открытого PR.

Читать далее

Ближайшие события

Прокачиваем локальный поиск на Dart и Flutter

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели7.6K

Hola, Amigos! На связи Павел Гершевич, Mobile Team Lead агентства продуктовой разработки Amiga и соавтор книги «Основы Flutter». Иногда нужно реализовать поиск по данным без участия бэкенда. Самый простой вариант — обычное вхождение строки — не прощает опечаток. Одна лишняя буква, и поиск выдает пустоту.

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

Читать далее

Не угодили «Лаборатории Касперского»: как интеграция с Telegram превратила ZentrySpace во вредоносное ПО

Уровень сложностиСредний
Время на прочтение8 мин
Охват и читатели9.1K

Не успели мы анонсировать долгожданную интеграцию ZentrySpace с Telegram, как случилось то, к чему нас жизнь точно не готовила — зловещее уведомление у скачивающих от «Лаборатории Касперского» о наличии трояна в приложении. По мотивам недавних реальных атак в Telegram, в борьбе с которыми Касперский преуспел, наши потенциальные пользователи, конечно же, насторожились. После получения серии отзывов о том, что ZentrySpace вредоносный и подозрительный, мы начали разбираться в том, что же могло пойти не так.

Читать далее

Smart Timber: измеряем лес смартфоном. Часть 1: Роль продуктового подхода в успехе проекта

Уровень сложностиПростой
Время на прочтение7 мин
Охват и читатели8.8K

Сегодня в блоге ЛАНИТ мы бы хотели поделиться, как продукт для лесной отрасли на основе алгоритмов компьютерного зрения прошел путь от пилотной версии до гибкой бизнес-системы и выжил в условиях, когда у сотрудников клиента нет связи, а поставщики не всегда добросовестно измеряют объемы древесины.

Читать далее

Когда пет-проект выходит из-под контроля: пишем свой tun2socks и закрываем дыры в Android VPN

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели28K

Всё началось чисто по приколу. Недавно в сети поднялась шумиха вокруг уязвимости VLESS-клиентов: оказалось, что даже при использовании сплит-туннелирования (когда VPN включен только для избранных приложений), любое «шпионское» приложение на телефоне может узнать IP-адрес вашего VPN-сервера.

Уязвимость была тривиальной — ядро клиента открывает локальный SOCKS-прокси, который никак не защищен. Любая софтина на устройстве может постучаться в этот локальный порт и отправить пакет наружу. Ради академического интереса я написал Android-приложение TeapodStream, под капотом которого связал xray-core и tun2socks. Локальный прокси я посадил на случайный порт и закрыл динамическим паролем (подробнее об этом писал в прошлой статье).

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

Но... я сам не заметил, как меня затянуло.

Читать далее

Вредные советы для Flutter-разработчика

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели7.1K

Назидательная статья, написанная в стихах и вдохновленная детскими книгами. Посвящается всем ошибкам, которые я совершал на работе — большим и маленьким.

Читать далее

Как не тратить ресурсы впустую: четыре шага перед разработкой любой фичи

Уровень сложностиПростой
Время на прочтение6 мин
Охват и читатели8.5K

Как сделать так, чтобы продукт или фича работала для пользователя? Ответ в этой статье.

Привет, на связи Саша Солдатов, CEO REB8T! Сегодня расскажу про четыре инструмента, которые наша команда использует в работе на каждом проекте: JTBD, ICE-приоритизацию, User Flow и UX-гипотезы.

Огромное спасибо нашему Lead UX/UI Вере Ксенофонтовой, которая собрала этот материал и разложила всё по полочкам для вас и нашей команды!

А теперь, начнём!

Читать далее

Сейчас сделаю приложение и заработаю на нем. АХАХАХАХАХ, удачи

Время на прочтение5 мин
Охват и читатели95K

За полгода я сделал мобильное приложение, получил 2000 установок и… 8 платных подписок по $6. Причем одна из подписок — моя.

Читать далее