Обновить

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

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

Мы научили агента писать тесты так, как их пишет наша команда

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

Привет! Я Артем Житко, iOS разработчик в Т-Банке. Каждому iOS-разработчику знакома ситуация: задача уже готова, кажется, что самое сложное уже позади. Но затем наступает этап написания unit-тестов. Мы пробовали поручить это ChatLLM, но модель генерировала код, который не компилировался: придумывала несуществующие Mock-объекты, игнорировала архитектурные соглашения проекта и использовала не те тестовые утилиты.

Проблема оказалась не в модели, а в отсутствии контекста. Вместо очередного набора промптов мы создали систему правил на базе AGENTS.md и SKILL.md. Это превратило генерацию тестов из разового запроса в воспроизводимый инженерный процесс.

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

Читать далее

Новости

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

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

В новом выпуске ioS-приложение на 10 лет и правда о Coil в Jetpack Compose, физический аналоговый ввод на плоском экране в iOS и первый убыток JetBrains за 26 лет, «конце эпохи ручного программирования», почему нельзя слепо копировать Ozon, Amazon и Taobao, история Chess.com, ИИ-ревьюер на 4000 PR в день и многое другое. Заходите!

Читать далее

Почему значок VPN в Android не гарантирует, что VPN действительно работает

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

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

В статье - как Android на самом деле определяет наличие VPN, почему этого недостаточно, какие есть более надёжные способы проверки, и описание моих трудностей и их решений при написании pet-проекта для Android.

Читать далее

Как Google Play сделал публикацию бесплатного приложения настоящим испытанием

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

Привет, Хабр!

Если вы читали мои прошлые статьи, то знаете Гига Писаря: зажимаешь кнопку, говоришь, отпускаешь, и текст появляется там, где стоит курсор. Речь распознаёт модель GigaAM от Сбера прямо на телефоне, без интернета и без облака.

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

Поэтому я решил выложить Писарь в Google Play, но там есть нюанс и мне потребуется ваша помощь

Читать далее

WASM кроссбраузерность во Flutter Web на 2026

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

В мае 2024 года команда Flutter выпустила версию Flutter 22, в которой они стабилизировали поддержку WebAssembly, объединив компилятор Dart с системой сборки мусора WebAssembly — WASM GC.

Примерно с этого же времени я много экспериментировал со сборками WASM и, в принципе, для широкого круга приложений они работают не хуже JavaScript, кроме двух интересных проблем. Это несовместимость данной технологии с браузерами Firefox и Safari.

Я решил покопаться в этом вопросе: то есть, при чём здесь вообще Flutter? И действительно ли команда Flutter не занимается этой ситуацией и почему не занимается.

Читать далее

Google: борьба за безопасность или очередное выманивание денег!?

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

Ну вот и докатились. Многие уже, наверное, слышали о выходе очередных ограничений от компании Google для Android‑разработчиков. На этот раз дело коснулось святая святых — независимых авторов, распространяющих свои приложения в обход официальной платформы Play Store. Под видом заботы о пользователях выраженной в обеспечении безопасности при распространении софта Google подложил неожиданную свинью.

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

Теперь для полноценного распространения приложений даже вне Google Store разработчикам необходимо пройти регистрацию в Android Developer Console. Основными требованиями стали предоставление личных документов, генерация хеша APK‑файла, указание имени пакета и самое «вкусное» — оплата членского взноса в размере всё тех же 25 долларов США за эту самую регистрацию. В итоге, если раньше разработчики распространяли свои приложения вне Google Store бесплатно, теперь Google решил залезть в карман и к ним.

Зачем Google это делает?

Версия Google: защита пользователей от вредоносного ПО, фишинга и клонов популярных приложений. Привязка к паспорту и хеш‑файлу позволяет заблокировать злоумышленников «намертво», чтобы они не смогли создавать тысячи анонимных аккаунтов.

Читать далее

Экран перестал обновляться, и виноват оказался не ваш код

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

Экран получил первое состояние и застыл: запросы проходят, исключений нет, а в дебаге проблема вообще не воспроизводится. Разбираемся, почему StateFlow может «замолчать», как отличить особенности его семантики от реального бага и при чём здесь R8 в релизной сборке Android‑приложения.

Разобраться в StateFlow

Физический аналоговый ввод на плоском экране в iOS игре

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

«Мясная педаль: как я превратил большой палец в псевдо‑Force Touch на iPhone»

Мы привыкли воспринимать сенсорный экран довольно просто: палец находится в какой‑то точке, система знает его координаты (x, y), а дальше практически вся привычная механика мобильного управления строится вокруг изменения этих координат. Нажал на кнопку, сделал свайп, потянул виртуальный стик, передвинул слайдер — в каждом случае мы так или иначе говорим телефону, где находится палец или куда он переместился.

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

Я большой фанат автосимов, и именно в них особенно хорошо почувствовал ограничение такого подхода. С кнопками и слайдерами всё прекрасно работает визуально: передвинул ползунок — увидел новое положение, нажал кнопку — увидел реакцию интерфейса. Но мне не хватало самого ощущения контроля, потому что в автомобиле работа с педалью — это не только её положение, а постоянное дозирование воздействия и обратная связь. Мне хотелось не просто видеть на экране условные 30 или 60 процентов сцепления, а чувствовать изменение прямо под пальцем, точно удерживать промежуточное значение и физически понимать, когда я приближаюсь, например, к точке схватывания.

Читать далее

Одна аналитика на две платформы: как мы синхронизировали iOS и Android в hh.ru

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

Всем привет! Меня зовут Максимкин Андрей, я iOS-разработчик в hh.ru. В далеком 2023 году мы уже рассказывали про нашу мобильную аналитику в этой статье. С тех пор много воды утекло, а вместе с ней поменялся и наш флоу работы с аналитикой. И начну я как раз с того, что нас к этому подтолкнуло. 

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

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

Читать далее

Rich Push Notifications в iOS: Notification Service Extension, Notification Content Extension и неочевидные детали

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

Rich Push Notifications в iOS выглядят просто, пока дело не доходит до Notification Service Extension и Notification Content Extension. Где должна находиться category? Зачем нужен mutable-content? Как передать изображения между расширениями, использовать один Content Extension для нескольких категорий и отладить всё это в Xcode?

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

Читать далее

Правда о Coil в Jetpack Compose: измеряем реальный оверхед SubcomposeAsyncImage

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

«SubcomposeAsyncImage в списках использовать нежелательно, он тормозит скролл» — так написано в документации популярной библиотеки Coil. Действительно ли это так, и во сколько миллисекунд обходится сабкомпозиция на самом деле?

Я провел масштабный бенчмарк: взял 5 разных популярных способов загрузки картинок на тяжелом датасете из 500 элементов с замерами через Macrobenchmark на реальных устройствах, далее сравнил результаты с прогнозами четырех нейросетей (Claude, DeepSeek, Gemini, Qwen), а так же обнаружил неожиданный архитектурный нюанс.

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

Читать далее

Как разобрать macOS на части

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

Всем привет! Меня зовут Игорь Белов, я инженер в команде Мобильной Архитектуры Авито. Больше 6 лет занимаюсь iOS-разработкой, а ещё мне нравится изучать фундаментальные темы Computer Science и разбираться, как те или иные вещи работают под капотом.

В статье я расскажу, как исследовать произвольные приложения macOS с помощью отладчика LLDB и сопутствующих инструментов, и тем самым прокачать свой повседневный инструментарий разработчика. Сначала исследуем произвольно запущенные процессы в macOS с помощью LLDB. Затем на основе собранных знаний сделаем инъекцию своего кода, чтобы изменить их поведение. Ещё немного затронем теорию, подготовим и настроим окружение. В конце я посоветую, что почитать, чтобы углубиться в тему.

Статья будет полезна инженерам любого уровня, которым интересно узнать, как устроены привычные вещи. И да, это образовательная статья, а примеры из неё не предназначены для обхода защиты и несанкционированного вмешательства в чужие сервисы или данные.

На создание этого материала меня вдохновило выступление Дерека Селандера — ему уже около десяти лет, но оно всё ещё актуально. Мне захотелось взять идею оттуда в более прикладном виде и спроецировать на современную повседневную разработку.

Читать далее

Как я сделал лыжный тренер на датчиках и вайб‑кодинге — вместо подписки на готовый

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

На рынке есть готовые продукты: пара датчиков на ботинки, приложение считает технику катания, подсказывает, что тренировать. Работает неплохо. Но по подписке — и недёшево: например, у Carv безлимитный сезонный доступ стоит $249 / £199 в год. И вот тут возникает вопрос: насколько эта подписка вообще оправдана? Датчик — это акселерометр с гироскопом за пару долларов и Bluetooth‑модуль, приложение — по сути обработка сигнала и немного статистики. Разовая покупка железа плюс разработка — понятные, конечные затраты. А подписка — плата за то, что уже посчитано один раз и с тех пор просто работает. Есть ощущение, что здесь платишь не за вычисления, а за то, что вход на рынок для конкурентов высокий: откалибровать алгоритмы, написать мобильное приложение, а потом ещё поддерживать серверы, пользователей и производство железа — дорого и долго. Подписка отбивает эти инвестиции. Но большая часть этого барьера — стоимость разработки, а она за последние пару лет резко упала: с ИИ‑инструментами то, что раньше требовало команды, становится посильным для одного человека. Продукт для рынка так не сделать — там нужна калибровка на тысячах лыжников, поддержка и сертификация. А вот любительский инструмент — вполне.

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

Читать далее

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

20 лет спустя, или как я все‑таки выпустил свое странное социальное приложение

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

Третий и, очень хочется верить, заключительный том моего персонального трехтомника "Война и мир" о гештальте, эмоциях и попытке сделать социальное приложение, о котором никто не просил.

Войти и выйти. Делов на 5 минут.

Мобильная разработка за неделю #648 (28 сентября — 4 октября)

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

В этом дайджесте применение gRPC в iOS и A2UI в Jetpack Compose, добавление новых сценариев в существующее Android-приложение без технического долга и офлайн-карта в кармане, отчет The State of Kotlin 2026, первое «убойное» приложение для iPhone Duo, нейросеть для игры в «Точки» и многое другое. Заходите!

Читать далее

Если у вас Android, жизнь стала чуточку легче

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

Привет, Хабр!

Если вы читали прошлые статьи, то знаете Гига Писаря: зажимаешь клавишу, говоришь, отпускаешь, и текст появляется там, где стоит курсор. Распознаёт речь модель GigaAM от Сбера, прямо на устройстве, без интернета.

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

Читать далее

Смотрим кино вместе на своём сервере: как заставить плееры идти в ногу и не дёргать картинку

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

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

Я сделал совместный просмотр в своём self-hosted медиацентре Avalon MediaCard. У каждого участника идёт оригинальный поток без пережатия напрямую с сервера, а бэкенд следит только за тем, чтобы все зрители находились ровно в одной точке фильма. А если это сериал, комната никуда не исчезает: она сохраняется вместе с текущей серией и секундой, чтобы в следующий раз можно было продолжить ровно с того же места.

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

Читать далее

Flutter на клиенте, Fletch на сервере: бэкенд на знакомом Dart

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

Вы пишете приложение на Flutter. Модели уже описаны, бизнес-правила продуманы. Осталась небольшая деталь: сервер, который будет принимать запросы и работать с данными.

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

Dart позволяет написать обе стороны приложения. А Fletch предлагает довольно понятный способ сделать серверную: знакомые по Express маршруты, middleware, обработчики запросов и немного инфраструктуры, которую не хочется каждый раз собирать вручную.

Разберёмся, как это выглядит в коде, откуда берётся скорость и какие мелочи стоит заметить до первого деплоя.

Читать далее

3D в игре на Flame: от одной модели до целого мира

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

River Sortie это шутер в духе River Raid, в который можно сыграть прямо в браузере. Самолёт летит вверх по бесконечной реке, сбивает танкеры, вертолёты и мосты, заправляется над складами. Всё, что в нём движется, это обычные компоненты Flame с хитбоксами Flame, а рисует всё это в 3D flutter3d. Расскажу, как два движка поделили работу, что для этого пришлось добавить в мост flame_flutter3d, и про короткий способ, когда в 2D-игре нужна всего одна трёхмерная модель.

Читать далее

Как анимировать матрицу на Swift UIKit

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

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

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