Обновить

Мобильная разработка

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

Foundation Models в iOS 26: разбор фреймворка для on-device LLM

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

Foundation Models в iOS 26: разбор фреймворка для on-device LLM

На WWDC 2025 Apple показала одну из самых недооценённых вещей презентации — Foundation Models Framework. Теперь iOS-разработчики получили доступ к системной языковой модели Apple буквально в несколько строк Swift-кода.

Без OpenAI API. Без интернета. Без отправки данных в облако.

Читать далее

Новости

Первый день рождения CoMaps

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

12 мая проект CoMaps отметил свой первый день рождения - прошёл один год с момента официального анонса. В этой статье - длинный рассказ о том, как развивалось сообщество проекта, как изменилось приложение CoMaps, каково состояние интеграции с экосистемой OpenStreetMap, и несколько слов о будущем проекта.

Читать далее

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

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

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

Рецензия на книгу «Разработка программного обеспечения. Практическое руководство для новичков в ИТ-команде»

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

Книга Андрея Литвинчука «Разработка программного обеспечения. Практическое руководство для новичков в ИТ-команде» (БХВ-Петербург, 2026) — структурированный и полезный разговор о том, с чем реально сталкивается новый сотрудник, выходя на первую работу в российскую ИТ-компанию. Автор показывает как устроен рынок, кто есть кто в команде, как вести себя на стендапе, как работать с требованиями, как использовать ИИ-инструменты и строить карьеру. Студентам, стажерам и начинающим ИТ-специалистам эта книга стопроцентно поможет не потеряться в первые месяцы работы на реальном проекте.

Читать далее

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

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

Навигация во 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 мин
Охват и читатели7.7K

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

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

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

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

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

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

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

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


Читать далее

По другую сторону найма: что я понял, когда сам начал смотреть отклики

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

Я недавно оказался по другую сторону HeadHunter.

Раньше я сам искал работу, отправлял отклики, писал сопроводительные письма и пытался понять, что вообще видит работодатель. А сейчас я открыл вакансию iOS-разработчика в своей компании и могу рассказать, как отклики кандидатов выглядят с другой стороны.

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

Читать далее

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

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

Привет, Хабр. Меня зовут Карим, я 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 стоят денег, которые на раннем этапе продукта лучше направить в другие места.

Читать далее

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

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

Почему нормальное OBD2-приложение должно быть open-source

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

Привет хабр! Есть проекты, которые начинаются не с бизнес‑плана, не с инвесторов и не с попытки «зайти в рынок». Они начинаются чуть проще — ты смотришь на существующие решения, пользуешься ими, раздражаешься и думаешь: «А почему это до сих пор выглядит именно так?»

Примерно так у меня появился ReDrive.

ReDrive — это open‑source мобильное OBD2-приложение, которое превращает смартфон в цифровую приборную панель и диагностический инструмент для автомобиля. Идея простая: подключаешь ELM327-совместимый адаптер к OBD2-порту машины, открываешь приложение и видишь данные с ECU в понятном виде: скорость, обороты, температуру, напряжение, состояние подключения, ошибки и другую телеметрию.

Читать далее

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

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

Недавно я дебажил проблему «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.

Читать далее

Бониана: приложение к браслету

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

На сайте Engee в разделе «Библиотека конечных автоматов» в наглядной форме представлены КА [1]. Полюбопытствуйте. Вполне достаточно для первого знакомства. Там есть раздел «Материалы Engee по Конечным автоматам», в который помещены проекты, демонстрирующие качества КА на практике. Сейчас это три проекта — «Регулирование температуры воздуха», «Электростеклоподъемник для автомобиля» и «Управление перекрестком». Подобно проекту браслета из первой части статьи [2] на их примере покажем возможности автоматного программирования (АП) в среде ВКПа в сравнении с автоматами Engee или, что будет точнее, в сравнении с моделью Харелла, реализованной здесь.

Выберем для этого проект с светофорами. На сайте имеется следующее его описание:

«Цель этого примера — разработать модель управления перекрестком, состоящим из двух автомобильных и одного пешеходного потоков, которые управляются двумя трёхсекционными и одним двухсекционным светофорами соответственно. Алгоритм переключения секций будет определяться согласно временной диаграмме. Управляющий алгоритм будет реализован при помощи нескольких блоков Chart, а снятие входных и формирование выходных сигналов — блоками C-Function

На рис. 1 показана структурная схема проекта в Engee. На ней несколько блоков, где основные — блок Commn_Counter, который моделирует временные такты диаграммы, блок Traffic_Lights, реализующий управление, заметим, сразу двумя светофорами и блок Crosswalk для светофора потока пешеходов. Временная диаграмма работы светофоров показана на рис. 2.

Читать далее

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

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

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

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

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

Читать далее

Как собрать пайплайн с LLM агентом использующим эмуляторы Android девайсов

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

LLM пока не может хорошо обращаться с Е2Е автотестами потому что для этого нужно провести целый комплекс мероприятий. Сложность возникает уже на этапе запуска такого автотеста. В отличии от юнит автотестов, Е2Е автотесты почти всегда PageObject и целый проект со своей архитектурой на базе Selenium Appium Espresso и тд.

Читать далее

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

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

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

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

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

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

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

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

Читать далее

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

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

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

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