Обновить
256K+

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

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

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

Мобильная разработка за неделю #630 (11 — 17 мая)

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

Возвращаемся после небольшого майского перерыва с новым дайджестом - советы и хитрости Xcode 16 и как добиться 0 рекомпозиций в сложном кастомном UI, три раунда войны с Android-клавиатурой в WebView и обновление без разрешения пользователя, 10 оптимизаций Swift, которые улучшат производительность, тестирование Compose по-новому, декларативная навигация для Flutter, под капотом перезапуска приложения Бургер Кинг и многое другое. Заходите!

Читать далее

Новости

Push-уведомления в мессенджере: production-грабли которых нет в туториалах

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

Это девятая статья про инженерные решения в ONEMIX. Тема узкая, push-уведомления. Но я её давно хотел разобрать, потому что туториалов в интернете много, а production-граблей в них почти нет.

Если коротко, туториал по push выглядит так. Регистрируешь токен через Notifications.getExpoPushTokenAsync(). Отправляешь на бэкенд. Когда приходит пуш — addNotificationResponseReceivedListener ловит тап, навигируешь в нужный экран. Всё.

В реальном мессенджере таких туториалов недостаточно. Появляется десяток узких проблем. Пуш приходит когда юзер уже в этом чате. Пуш приходит когда приложение убито системой. Navigation после открытия из пуша добавляет дублирующийся экран в стек. На iOS звонки идут через отдельный канал VoIP который требует совершенно другой инфраструктуры. Эти грабли я и разберу.

Читать далее

Кешбэк-апокалипсис: у меня семь карт, смартфон с ИИ и я всё равно плачу не той картой

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

Как банки превратили «выгоду» в головоломку: семь карт, куча кешбэков — и один способ из этого выбраться.

Читать далее

Как избежать утечек памяти во Flutter

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

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

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

Читать далее

Mission Impossible: как добиться 0 рекомпозиций в сложном кастомном UI

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

Сотня рекомпозиций в секунду при скролле — это приговор. Приговор батарее устройства, плавности анимаций и вашей репутации как инженера. Мы привыкли мыслить высокоуровневыми абстракциями: закинуть LazyColumn, добавить пару Modifier.padding и отправить в продакшен. Но что делать, когда стандартные компоненты начинают "захлебываться", а Layout Inspector горит красным от избыточных отрисовок?

Читать далее

Создавая SetupWizard для кастомной AOSP: на что обратить внимание

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

Что скрыто за реализацией Setup Wizard на любом Android-устройстве? Как получается, что системное приложение появляется один раз при первом запуске, а потом исчезает? Можно ли сразу накатить свой Setup Wizard на устройство и точно ли нужно писать свою реализацию этапа настройки блокировки экрана? 

Меня зовут Олеся Шилова. Я инженер-программист в отделе разработки приложений в YADRO. Вместе с коллегами разрабатываю системные приложения операционной системы kvadraOS. Недавно я работала над «Мастером настройки» и сегодня хочу рассказать, как это приложение работает в AOSP и с какими подводными камнями можно столкнуться при его создании. Заодно покажу примеры конфигурации. 

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

Читать далее

Live Activities: как мы сделали обновление без разрешения пользователя

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

Привет! Меня зовут Сергей, я тимлид iOS-команды в Банки.ру. В разработке уже 11 лет — успел поработать и на аутсорсе, и в продуктовых финтех-компаниях.

Если вы iOS-разработчик и планируете внедрять Live Activities в своё приложение — эта статья для вас. Особенно если обновления LA у вас триггерятся на бэкенде, а не в коде приложения. Мы наступили на несколько граблей, нашли неочевидное решение и хотим сохранить вам пару недель отладки.

Читать далее

Почему мало просто перейти на SwiftUI и Compose: заглядываем под капот перезапуска приложения Бургер Кинг

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

Когда старый монолит начинает мешать процессам в разработке, первое, что обычно приходит в голову командам — это переезд на новый стек. Логика понятна: сделаем новый UI, почистим код, а дальше и разработка пойдет бодрее. Чаще всего такое решение — очень дорогая иллюзия. Потому что в бигтехе проблема обычно не в UI, а в связности компонентов, зависимости фронта от бэка, сложных релизах и фичах, которые требуют синхронной работы команды.

Мы — разработчики Surf, Android и iOS команды: Светлана Сорокина, Антон Бояркин и Алексей Рябков. Когда начали работать с Бургер Кинг над трансформацией приложения, столкнулись с похожей историей. Поэтому мы решили переписать архитектуру так, чтобы разные подрядчики могли нормально работать вместе, а продукт — развиваться быстрее.

Читать далее

Outbox‑паттерн для мобильного мессенджера: как Telegram не теряет сообщения и почему ваш код их теряет

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

Это седьмая статья про инженерные решения в ONEMIX. Тема узкая, но болезненная для каждого кто делал мобильное приложение с отправкой сообщений или файлов.

Сценарий с которого всё началось у меня. Пользователь в чате выбирает большое видео, нажимает отправить. Видео начинает грузиться. Пользователь нетерпеливый, прокручивает вверх посмотреть переписку, потом переходит в другой чат, потом возвращается. Что должен он увидеть?

В Telegram он увидит свой видео‑бабл с прогрессбаром, как и оставил. В большинстве самописных мессенджеров он увидит пустой чат без своего сообщения, потому что upload жил в state экрана, а экран размонтировался. XHR продолжал работать в фоне, файл загрузился на сервер, но результат пришёл в null, потому что setter уже не существует. Сообщение фактически отправлено, но пользователь об этом не знает.

Это боль которая лечится не «правильным useState», а отдельным архитектурным слоем. Этот слой называется outbox. В этой статье разберу свою реализацию из ONEMIX, это 820 строк TypeScript которые делают то что в Telegram кажется естественным.

Читать далее

Сколько я заработал в RuStore за 6 месяцев

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

Типичный прохладный вечер в начале сентября. Я сижу за рабочим столом в гостиной, жена укладывает ребёнка. Со стороны кажется, что я занимаюсь чем-то важным, ведь мой взгляд сосредоточен на экране макбука. Но на самом деле я думаю о том, как бы организовать себе хоть какой-то альтернативный доход на случай сокращения.

В какой-то момент я натыкаюсь на статью Миши Жирнова, где он хвастается тем, что вышел на доход в 176 тысяч рублей в RuStore. Я тут же вдохновляюсь опытом Миши и твёрдо решаю, что тоже хочу 176 тысяч. Так начинается эта история.

Читать далее

Как я сделал на Flutter игру для разработчиков. Часть 2

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

Всем привет! Меня зовут Амир Утеуов, я ML-инженер из Авито.

В первой части статьи я поделился тем, что пришлось сделать и учесть для создания собственной игры для разработчиков — DevRush. Суть игры заключается в том, что нужно на время находить иконки языков программирования. Я прошёл путь от создания геймплея и векторной анимации до сборки под Android и iOS. Главная неожиданность ждала в App Store — модераторы отклонили игру из-за иконки Android, посчитав это рекламой конкурента. Но по итогу Авито взял мою игру на стенд Code Fest 2025.

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

Читать далее

Опенсорсим yx_navigation — декларативную навигацию для Flutter

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

Навигация во Flutter — это постоянные компромиссы. Сначала кажется всё просто: push и pop. А потом проект растёт, появляются табы, вложенные модули, диплинки — и выясняется, что каждый следующий экран открывается по‑разному, а pop() в одном месте ведёт себя не так, как в другом. 

Navigator 1.0 прост и понятен, но при масштабировании рассыпается. Navigator 2.0 даёт полный контроль, но требует столько бойлерплейта, что проще изобрести свой фреймворк. Сообщество это поняло — и появились пакеты поверх Navigator 2.0. go_router упрощает жизнь, но недавно перешёл в режим поддержки: только баг‑фиксы, никаких новых фич. auto_route даёт type‑safety, но тянет за собой кодогенерацию.

Мы прошли через все эти варианты в процессе разработки Яндекс Про — приложения для водителей и курьеров, где навигация включает сотни фич, несколько команд, вложенные модули, табы, диплинки и legacy‑код на Navigator 1.0. А ещё — сложную логику переходов, где точный контроль над состоянием навигации не просто желателен, а критичен: экран закрывается там, где не должен, стек оказывается в неожиданном состоянии, и разобраться в причинах через стандартный API почти невозможно.

Так появился yx_navigation — новый пакет в нашей экосистеме архитектурных решений для Flutter, после yx_scope (DI) и yx_state (управление состоянием). Дальше расскажу, с какими трудностями мы столкнулись, какие требования сформулировали, как устроен yx_navigation сегодня и как именно он решает проблемы крупных приложений.

Читать далее

Я хотел adjustResize. Получил adjustNothing. Три раунда войны с Android-клавиатурой в WebView

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

Я юрист. Я не должен был знать слово adjustResize. Сейчас оно мне снится. Это история про три недели борьбы с Android-клавиатурой в WebView, про MutationObserver, который я призвал и пожалел, и про то, как настоящее решение оказалось не там, где я искал. Если у вас в приложении WebView и формы с инпутами — возможно, я сэкономлю вам неделю.

Три недели войны с клавиатурой

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

Как мы убрали хаос на входе и вернули фокус в бизнес‑анализ с помощью ИИ‑ассистента

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

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

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

Когда аналитика превращается в расшифровку задач 

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

Формально задача есть. По факту нет ни границ, ни сценария, ни критериев успеха, ни понимания того, что именно требуется реализовать.

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

Читать далее

Как я сделал на Flutter игру для разработчиков. Часть 1

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

Всем привет! Меня зовут Амир Утеуов — я ML-инженер из Авито.

В этой статье поделюсь своей историей создания мобильной игры DevRush, пет-проекта, который перерос в игру на стенде IT-конференции CodeFest 2025.

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

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


Читать далее

Smart Timber: измеряем лес смартфоном. Часть 2: Технические решения для полевых условий

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

В первой части мы рассказали о пилоте и первых версиях системы Smart Timber для измерения и учета объемов древесины, внедрении продукта у клиента и переходе от технического наполнения к продуктовой составляющей решения. 

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

Читать далее

Widlet — pet-проект про Server-Driven UI на Dart

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

Привет, Хабр. Меня зовут Карим, я Flutter разработчик уже 7 лет и последний месяц я делаю фреймворк для server-driven UI на Dart.

Зачем еще один SDUI

У всех реализаций, которые попадались мне на глаза, есть общая черта - собственный DSL. JSON-схемы, кастомные конфиги. Для каждого решения приходится учить новый язык.

При этом Flutter-разработчики уже знают хороший язык описания UI. Он называется Flutter.

Читать далее

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

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

Это третья статья из серии про инженерные решения в 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 мин
Охват и читатели9.6K

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

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

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

Развеять миф

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

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

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

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

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

Читать далее
1
23 ...