Обновить

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

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

Сломал руку, купил Pixel 10, возненавидел Gboard и написал свой офлайн-голосовой ввод для Android на GigaAM v3

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

Написал полностью офлайновый голосовой ввод на русском для Android. Никаких серверов, подписок и привязок к аккаунтам. За распознавание отвечает открытая нейросеть GigaAM v3 от Сбера: модель зашита прямо в APK, работает без интернета и отлично расставляет знаки препинания.

Главная фишка — не нужно отказываться от любимой клавиатуры со свайпом. Это не замена Gboard, а просто плавающая кнопка, которая появляется поверх любого поля ввода. Работает элементарно: тапнул — говоришь. Как только делаешь естественную паузу в речи, готовый текст тут же влетает в активное окно. Напрямую, минуя буфер обмена.

Стек: GigaAM v3 + sherpa-onnx (NNAPI / CPU) + крошечный детектор речи Silero VAD. Требования: Android 13+, ARM64. Исходники открыты (MIT).

Читать далее

LxBox: переносим опыт singbox-launcher в Android

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

Привет. Полгода назад я выложил singbox-launcher — десктопный GUI для управления ядром sing-box. По фидбеку стало понятно: идея зашла, людям удобно собирать и отлаживать конфиги на ноутбуке, а потом переносить их на роутеры и другие сетевые устройства. Подробнее о десктопной версии я писал на Хабре.

Пару слов для тех, кто не в контексте. Есть небольшой класс кроссплатформенных сетевых ядер, которые умеют гибкую маршрутизацию трафика и поддерживают современный набор протоколов: WireGuard, VLESS, SOCKS5, Shadowsocks, Hysteria2, TUIC и так далее. Sing-box в этом списке — не самый раскрученный, но для меня он оказался наиболее интересным: быстрая эволюция, внимание к деталям, чистый код, живое общение мейнтейнеров с пользователями, классно организованный по логике конфиг.

Довольно быстро стали приходить запросы на Android-порт. Первое время казалось, что это будет прямое переиспользование десктопного кода. На практике сценарии потребления на мобильных оказались сильно другими: другой UX, другой lifecycle, Doze и background-лимиты, OEM-специфика, ограниченный экран, другие ожидания от автозапуска и обновлений. В итоге пришлось переписать практически всё с нуля.

Результат этой работы — LxBox, и сегодня я хочу рассказать, чем он отличается от существующих Android-клиентов и как устроен изнутри.

Читать далее

Мессенджер на Paginator. Боевые задачи

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

В прошлой статье я сравнивал Paginator с Paging 3 на кошачьем уровне: «вот простой фид, смотрите — три строки вместо тридцати». Это полезно для первого знакомства, но не отвечает на главный вопрос: а как оно себя поведёт, когда продукт начнёт требовать то, ради чего люди обычно и пишут свой велосипед поверх Paging 3?

В этой статье я беру мессенджер — потому что мессенджер это честный полигон. Там есть:

Читать далее

Публикация приложений в российском App Store бессмысленна? Как ограничения Apple ID влияют на разработчиков

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

Не прошло и четыре года, российские аккаунты Apple Developer для разработчиков потеряли свою актуальность. С 1 апреля по поручению Минцифры российские операторы связи отключили возможность пополнения баланса Apple ID с помощью мобильного счета — ограничения внедрили МТС и Билайн, которые оставались своеобразным спасательным кругом как для компаний, так и для физиков — свои сервисы в App Store я до сих пор оплачивал только с помощью специально заведённой для этого симки Билайн (МТС я на дух переношу, и ни за что не стал бы пользоваться им даже если бы не было другого выхода вообще).

Apple официально подтвердила, что обработка платежей в App Store и других сервисах компании в России остановлена. Оставшиеся доступные варианты оплаты — подарочные или иностранные карты — требуют смены региона (как итог, не все нужные приложения становятся доступны для скачивания). Поэтому, можно сказать, что российские аккаунты Apple умерли — для использования доступны теперь только бесплатные приложения и сервисы.

Особенно больно от того, как это повлияло на авторов мобильных приложений и игр — разработчиков с российским аккаунтом Apple Developer. Если в 2022 году Apple отключила монетизацию контента в РФ (в 2023 году правила смягчились. Компания разрешила получать оплату на аккаунты, зарегистрированные в России, но только при условии, что платежи будут совершать исключительно российские пользователи — т.е. работать на зарубежную аудиторию с локальным аккаунтом всё равно оставалось невозможно), то теперь проблем подкинула родина. И теперь, когда даже российские пользователи не могут пополнить баланс Apple ID и оплатить сервис, приложение или игру, работа через российский Apple Developer вообще теряет всякий смысл — только если вы не продвигаете внутри какой-нибудь бесплатный сервис. 

Читать далее

Распознавание лиц с потока камеры в .NET MAUI

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

Сегодняшние приложения для мобильных и настольных устройств умеют распознавать на изображениях почти что угодно, - от QR-кодов до количества калорий в еде на на фото. На платформах, которые поддерживает .NET MAUI, для этого можно использовать разные варианты, как локальные ML-движки вроде TensorFlow Lite, нативные SDK для конкретной платформы, типа ARKit на iOS, так и разные Vision API. Далее все зависит уже от реализации в приложении.

И вот, когда речь идет пойдет о распознавании изображений от камеры, наш вариант - пакет DrawnUi.Maui.Camera. В предыдущей статье я показывал, как использовать SkiaCamera для анализа аудио с AI в реальном времени, а сегодня займемся видео: разберем на примере распознавания лиц.

Читать далее

AI в iOS-разработке: что у меня реально закрепилось в 2026, а что я выкинул

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


За последний год я перепробовал всё: Cursor, Claude Code, Codex, локальные Qwen-модели для ревью, пять версий своего CLAUDE.md, Xcode MCP от Apple, mobile-mcp, Conductor для параллельных агентов. Что-то осталось в проде, что-то выкинул через неделю. А какие-то вещи, которые казались обязательными год назад, сегодня выглядят как антипаттерны.

Это статья не про «AI изменит всё» и не про то, как за вечер собрать Todo-приложение через Claude Code. Это про то, как iOS-разработчику, который уже живёт с AI-инструментами, выжать из них максимум - и не наступить на грабли, на которые наступили до тебя остальные.

Читать далее

Ленты коротких видео: как оптимизировать, чтобы вас смотрели больше

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

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

Привет, меня зовут Рамиль Габдрахманов, я руковожу разработкой видеоплееров в Yandex Infrastructure. Нашу видеоплатформу используют многие сервисы Яндекса: Кинопоиск, Яндекс Маркет, Яндекс Музыка и другие — а компании вне Яндекса могут использовать её через Yandex Cloud Video. В день наш плеер воспроизводит 103 847 867 931 секунду видео.

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

Читать далее

Как мы считаем досрочное погашение кредита: что реально работает в коде

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

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

Я ошибался.

Небольшой контекст: до этого я довольно долго не делал ничего для Android — работал в других областях, экосистема успела заметно измениться. Вернуться оказалось неожиданно приятно: Compose после нескольких лет XML-вёрстки ощущается как глоток свежего воздуха, KSP вместо KAPT работает заметно быстрее, а Room с Flow и корутинами — это уже совсем другой уровень удобства по сравнению с тем, что я помнил. Так что статья отчасти и про это: как выглядит возвращение в Android-разработку после перерыва.

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

Читать далее

Paging 3 хорош. Пока вам не понадобится что-то ещё

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

Если коротко: пагинация — это когда вы не грузите 100 000 товаров из каталога одним запросом, а показываете их страницами по 20–50 штук и подгружаете следующую порцию, когда пользователь домотал до конца.

Звучит как задача на полдня. На практике — по-разному.

Я пишу мобильные приложения уже давно, и каждый раз, когда в новом проекте появлялась пагинация, рядом с ней через месяц-другой появлялся один и тот же набор багов и ad-hoc-решений. Флаги isLoadingNextPage, isLoadingPrevious, isRefreshing, isEmpty, hasError, hasNextPage. Попытки «просто заменить элемент без перезагрузки страницы». Восстановление позиции после убийства процесса. Прыжок на конкретную страницу по deeplink.

На Android есть Jetpack Paging 3, и его берут по умолчанию. Но как только вы выходите за рамки «загрузи следующие 20 элементов на скролле вниз» — начинается интересное. А если ваш проект — Kotlin Multiplatform, то Paging 3 вообще не ваш вариант: это Android-библиотека, она не едет на iOS.

Я расскажу про опенсорсную библиотеку Paginator, которую делаю последние несколько лет. Она работает одинаково на Android, JVM и iOS из одного commonMain, закрывает сложные сценарии из коробки — и даже на самой обычной ленте настраивается короче, чем Paging 3. Это не поход против Paging 3 и не попытка что-то кому-то доказать. Это просто описание того, что есть другой инструмент, и он делает то же самое компактнее.

Читать далее

Волшебный Koog. Пишем Kotlin-агент широкого профиля KMP

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

Всем привет! С вами Анна Жаркова, руководитель мобильной практики ГК Юзтех. Что ж, за последние полгода мир разработки и мир ИИ скакнули и ушли далеко вперед. Теперь знания работы с агентами, умение написать не только правильный промт, но и собственные скиллы (навыки) для этих агентов, готовить свои mcp для погружения в контекст задачи, проекта, становятся не только полезными, но и обязательными для разработчиков и IT-специалистов. Уже многие используют как специальные IDE с ИИ-агентами (Claude, Cursor, Windsurf и т.п), так и встраиваемые в привычные VsCode и AndroidStudio в виде плагинов. Можно не ограничиваться готовым настраиваемым функционалом, а пойти дальше и написать свой собственный агент. И сегодня мы поговорим про такое решение, использование специального фреймворка от JetBrains Koog для разработки свои агентов. С его помощью мы создадим агент для генерации простых KMP приложений и кросс-платформенных задач и подключим к плагину Continue dev.

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

Читать далее

Android и AccessibilityService: защита чувствительных экранов от чтения интерфейса

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

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

Читать далее

Рецензия на книгу «Основы разработки приложений для iOS»

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

Книга iOS 18 App Development Essentials (русское издание — «Основы разработки приложений для iOS») относится к тому типу учебников, которые остаются полезными даже при смене версий платформы. Основание так утверждать состоит в том, что автор выстраивает материал вокруг полного цикла разработки приложения, т.е. от установки набора средств разработки (SDK, Software Development Kit) и настройки среды до публикации в магазине приложений App Store. Такой подход делает книгу не просто справочником по версии iOS 18, а последовательным курсом по созданию приложений для операционной системы iOS в целом.

Читать далее

Почему в C++/Qt нельзя просто взять и забыть про сырые указатели

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

Современный C++ (11/14/17/20…) настойчиво учит нас: «Забудьте про new и delete, используйте умные указатели». Это отличный совет для чистого C++, но как только вы открываете документацию Qt, на вас снова прыгают T*.

Почему даже в 2026 году невозможно написать серьезное приложение на Qt, используя исключительно умные указатели? Давайте разберемся, где «умный» код ломает логику фреймворка.

Читать далее

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

Асинхронный загрузчик видео на aiogram 3 и yt-dlp: как не положить Event Loop и прикрутить честный прогресс-бар

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

Казалось бы, тема заезженная до состояния покрышки камаза: «сделай бота, который качает ролики». На Хабре уже лежит десяток туториалов, на GitHub — сотни форков. Но если вы хоть раз открывали такой бот в проде — вы знаете, что 90% из них падают на втором пользователе, а оставшиеся 10% честно умирают на видео длиннее 15 минут.

Я полез в органическую выдачу Google, чтобы понять, почему люди вообще ищут Telegram-ботов, а не пользуются веб-сервисами. И выдача, честно говоря, удручает.

Читать далее

The Xcode build system has crashed, или Почему рекурсия — это плохо. Используем swift‑build со своими патчами

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

Представьте ситуацию: вы работаете в огромном проекте, где количество модулей давно перевалило за тысячу. Вы решаете обновиться до свежего Xcode 26.2, ожидая прироста производительности, но вместо заветного «Build Succeeded» получаете молчаливое падение: SWBBuildService quit unexpectedly.

Всем привет, меня зовут Алексей Севко, я ведущий разработчик программного обеспечения из команды Delivery & Performance Яндекс Go. В этой статье я расскажу почти детективную историю о том, как:

— Искать иголку в стоге сена: когда падает закрытый бинарник Xcode.

— Стать контрибьютором swift-build: почему иногда проще переписать системный поиск макросов в swift-build, чем ждать фикса от Apple.

— Использовать свою версию билд-системы: как мы внедрили инфраструктуру прозрачной подмены компонентов Xcode через XCBBUILDSERVICE_PATH, чтобы не ждать релиза Xcode со Swift 6.3 и работать стабильно уже сегодня.

Если ваш проект тоже перерос стандартные инструменты Apple или вам просто интересно, как превратить рекурсию в итерацию и не сойти с ума от 45-минутных дебаг-сессий, — добро пожаловать под кат!

Читать далее

Echo Layer: как я пытался встроить приватность в обычную клавиатуру

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

Привет Хабр! Меня зовут Артур Валиев, и я разработчик небольшого мобильного приложения с названием «Echo Layer».

Меня давно не отпускала одна мысль: почти все разговоры о приватной переписке в какой‑то момент упираются не в шифрование, не в криптографию, не в архитектуру, а в банальную человеческую инерцию. Можно сколько угодно строить красивую систему, можно делать open source, end‑to‑end encryption, писать про zero knowledge и отсутствие серверных логов, но потом ты возвращаешься в реальную жизнь и видишь, что люди всё равно сидят там, где им удобно. В Telegram, в WhatsApp, в VK, сейчас уже и MAX, в корпоративных чатах, в почте, в комментариях, где угодно. И если для приватности нужно сначала всех пересадить в новое приложение, то задача почти обречена.

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

Так Echo Layer и появился. Не как «новый безопасный чат», а как попытка превратить сам ввод текста в место, где может жить приватность.

Читать далее

Мобильная разработка за неделю #628 (13 — 19 апреля)

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

В этом выпуске сравнение быстродействия SwiftUI и UIKit, план изучения Android-разработки и Kotlin DSL для Android-шейдеров, прагматичный взгляд на архитектуру Flutter и пара детективов с поиском багов, как не надо делать скриншоты в App Store, диспетчеризация дома, поддержка Swift в разных IDE, тестирование взаимодействия нескольких устройств и многое другое. Заходите!

Читать далее

Приватная Cвязь на Go и Flutter

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

Пока все обсуждают очередные сливы баз и особенности модерации в популярных «безопасных» мессенджерах, решил попробовать пойти другим путем. В этой статье рассказываю, как я скрестил Flutter и Go через CGO, прикрутил libp2p для создания P2P-сети и реализовал честное E2EE шифрование (Double Ratchet для личек и MLS для групп). Никакой централизации, никаких единых точек отказа. Делюсь результатами эксперимента.

Читать далее

Как я за 9 месяцев сделал свой видеосервис: сначала потому что надо было, а потом потому что понравилось

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

У меня был один телефон, на котором я создавал проект, редактируя файлы в nano.

9 месяцев свободного времени (которого у работающего электрика не так уж много) ушло на то, чтобы из полного нуля сделать работающий P2P-видеосервис.

Читать далее

Фильтр Калмана, geohash fog of war и три реджекта Apple: как я собрал GPS-трекер на SwiftUI

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

В 2024 году Google тихо убил Timeline в Google Maps. Историю местоположений перевели в «локальный режим», который на практике работает через раз - данные теряются, синхронизации нет, а у многих просто исчезли годы накопленной истории.

Для меня это было важно: я много езжу на машине и хотел знать простую вещь - сколько конкретная поездка стоит в бензине. Ничего подходящего не нашёл и решил написать сам. Я бэкенд-разработчик, до этого проекта не написал ни строчки на Swift - дальше про то, как за месяц вечерами собрал GPS-трекер с фильтром Калмана, fog of war на geohash и Live Activity.

Читать далее