Обновить
256K+

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

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

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

Заметки как чаты: почему я перестал искать папку и начал искать сообщение

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

Всем привет я Артур Валиев, пятничная статья, поехали.

Я каждый день кидаю заметки не в специальное приложение, а в Избранное в Telegram — просто потому, что там приятнее писать: пружинный отскок сообщения, ноль лагов, мгновенный отклик клавиатуры. Это натолкнуло меня на мысль — а что, если взять не идею мессенджера, а буквально инженерный подход Telegram к рендерингу и анимациям, и применить его к заметкам?

В статье — сначала идея: почему классические заметки-стикеры умерли как формат, и как выглядела бы лента заметок на движке уровня Telegram. Дальше — техническая часть с кодом: виртуализация списка, spring-анимации через transform/opacity вместо layout-свойств, оптимистичный рендер, отказ от polling, полнотекстовый поиск через SQLite FTS5. И под конец — честный разбор, почему нативный C++ структурно обходит любой JS-рантайм: отсутствие пауз GC, плотность памяти, JIT-разогрев, реальная многопоточность без сериализации.;)

Читать далее

Новости

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

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

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

Читать далее

Flutter 3.47 — Что нового во Flutter?

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

Вышла версия Flutter 3.47, и вместе с ней мы получили несколько интересных нововведений.

Сегодня мы приветствуем выпуск версии 1.0 автономного приложения material_uiи cupertino_uiпакетов. Это важная веха, которая отделяет системы проектирования от основного SDK.

Мы также повышаем производительность и улучшаем инструменты во всех областях. В этом релизе Impeller по умолчанию доступен для настольных компьютеров, наши конвейеры подготовлены для iOS, macOS и Xcode 27, а предварительные версии виджетов Flutter переведены в стабильную версию.

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

Читать далее

Красное не мёржим: как мы внедрили e2e тесты в разработку

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

Можно ли сделать e2e тесты мощным инструментом раннего отлова багов, не потопив при этом CI и не всем не разругавшись?

Рассказываю, через что пришлось пройти, чтобы релизы были спокойные, пайплайны — зеленые, разработчики — довольные.

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

Читать далее

Документация проекта по разработке мобильного приложения с помощью Claude Code

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

Предисловие

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

Сразу оговорюсь, что это не enterprise решения.

Это небольшие мобильные приложения, разрабатываемые в режиме вайб-кодинга с использованием ИИ-агента Claude Code Opus 5

Концепция приложения

App Concept

Краткое описание приложения.

Очень краткое, на языке пользователя, без технических подробностей.

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

Часто формулируется как ответ на вопрос - “Чего хочет пользователь?”

Хранится в архиве проекта.

Как правило, не редактируется.

Читать далее

Почему HTTPS-прокси не видит трафик приложения

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

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

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

Читать далее

Мы сделали “Tinder для любителей аниме и видеоигр”, привлекли 100 000 пользователей… и закрылись. Что пошло не так?

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

Cuddli стал №1 среди дейтинг-приложений для гиков, собрал более 100 000 пользователей, помог создать тысячи пар, а пользователи настолько любили сервис, что сами раздавали его стикеры и рекламировали приложение на фестивалях.

А потом закрылся.

Читать далее

Мобильная разработка за неделю #642 (3 — 9 августа)

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

В новом выпуске применение для .fixedSize и (не)слежка в приложениях Яндекс для Android, погружение в One‑Time Events в Android и регрессионное UI-тестирование для iOS, Shipaton 2026 от JetBrains, offline‑first PWA, сканер для слабых смартфонов, идеальный телефон для цифрового детокса и многое другое. Заходите!

Читать далее

Локальная база на клиенте: Blazor WebAssembly и MAUI на SQLite — без EF DbContext, Include и миграций

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

Офлайн-хранилище со сложным графом и outbox: быстрый старт в MAUI и в браузере, базовые операции и почему в этой роли EF Core только мешает.

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

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

И вот тут начинается знакомое.

Читать далее

AI и склонение немецких прилагательных

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

Всю свою сознательную жизнь я «учил» немецкий: в школе, универе, на внутренних курсах IT-компании и самостоятельно. Слово «учил» я поставил в кавычки, потому что на самом деле я ничего никогда нигде не учил, ну разве что зазубрил немецкий алфавит в школе. Всё как-то училось само, слова запоминались после нескольких повторений, грамматика – после нескольких упражнений. Слава Богу, память всегда была хорошая. Но во-первых, если в будущем эти слова и грамматика не использовались, всё это вскорости выветривалось из головы, а во-вторых, так это не работает со сложными темами. Такими, как, например, склонение немецких прилагательных.

Тем, кто учит английский, повезло: прилагательные там не склоняются вовсе, но в немецком (как и в русском) всё совсем не так:

Читать далее

«Как за вами (не) следит Яндекс»: что на самом деле происходит внутри Android-приложений

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

На днях на Хабре вышла статья с разбором Яндекс Браузера и приложения Яндекс для Android. Автор сделал несколько выводов о работе приложений на основе анализа кода.

Часть наблюдений в статье действительно описывает существующие механизмы, однако их назначение интерпретируется неверно. Во многих случаях речь идёт не о специфике Яндекса, а о стандартных механизмах Android, Chromium, работе современных голосовых помощников или платёжных SDK.

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

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

Читать далее

Пользователи: 46 000. Прибыль: $0. Дикая история запуска приложения для ставок на смерть персонажей «Игры престолов»

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

2019 год. Выходит последний сезон “Игры престолов”. Позже его назовут “худшим завершением сериала в истории телевидения”, Disney передумает сотрудничать с его создателями, испортив им карьеры, фанаты, как обычно, будут в гневе… 

Но 7 лет назад GoT была на пике хайпа и именно в этот момент двое друзей решили выпустить приложение, идеально подстроенное под зашкаливающий спрос. За две недели оно собрало 46000 пользователей, завирусилось в Reddit, twitter, форумах и подкастах…

И заработало $0.

Читать далее

Как мы построили систему регрессионного UI-тестирования для iOS-приложения: XCUITest, mock backend и XcodeBuildMCP

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

По мере роста UI-регрессии сложнее всего становится управлять не тестами, а их окружением: состоянием приложения, ответами backend и воспроизводимостью сценариев. В статье разбираю архитектуру, которая связывает тест-кейсы QA, mock-профили, XCUITest и XcodeBuildMCP в единый процесс — от подготовки сценария до запуска в CI.

Читать далее

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

SayFable — офлайн-библиотека с NLP-разметкой, синтезом на 68 языков и чатом по книге

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

Привет, Хабр! В прошлых статьях я рассказывал про локальный переводчик с синтезом голоса на кабардинском и про то, как собрать полный NLP-стек для «финального босса лингвистики» из старых словарей. За прошедшие месяцы весь этот стек - лемматизация, POS, NER, тональность, эмбеддинги, синтез - переехал с Python/Flask на десктопе в Swift-приложение на iOS и заодно перерос сам себя: начиналось всё как синтезатор речи для одного языка, а выросло в персональную библиотеку для любого контента - книги, статьи, подкасты, видео, музыка, файлами или ссылками. Полгода на голом Swift 6, вечерами и выходными.

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

Читать далее

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

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

Мы делаем RCQ, мессенджер со сквозным шифрованием и открытым кодом (AndroidiOSпротокол). В нашем основном регионе приложение блокируют, поэтому обход встроен внутрь клиента: sing-box в самом приложении, пул релеев, подписанный конфиг с их списком, запасной путь через CDN.

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

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

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

Читать далее

От object detection к классическому CV: разрабатываем сканер для слабых смартфонов

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

Привет хабр!

Мы разрабатываем приложение для управления линейным персоналом.

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

Внутри продукта эта технология называется MotionCode. Внешне всё выглядит довольно просто: панель воспроизводит последовательность визуальных элементов, камера телефона считывает их, а приложение восстанавливает код.

На практике путь от первого прототипа до стабильной работы оказался гораздо сложнее. Мы успели обучить модель для object detection, столкнуться с ограничениями мобильного железа, отказаться от нейросети и почти без опыта в компьютерном зрении построить собственный real-time-пайплайн обработки кадров.

Читать далее

Что мы поняли про детей, когда делали детские задания в приложении

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

Что будет, если платить детям за то, что они помыли посуду? Будут ли их мотивировать только деньги? Или есть что-то важнее?

Однажды мы сделали в приложении Альфа-Банка раздел «Детские задания». Это одна из ключевых фич детского банка, которая позволяет родителям и детям создавать задания, договариваться о награде и отмечать их выполнение. Но почти сразу стало понятно, что главный вопрос здесь совсем не про интерфейс, а про то, какую роль вообще должны играть такие задания в отношениях между ребёнком и родителями.

И, кажется, ни одна функция детского банка не вызывала столько споров, как задания: «А что дальше? Будем платить детям за уборку комнаты? За пятёрки? За то, что они вообще соизволили вынести мусор?»

Для многих детских задания выглядят именно как семейный маркетплейс, где ребёнок выставляет счёт за каждое полезное действие. Когда мы начинали делать эту фичу в Альфа-Банке, мы тоже боялись скатиться к «Вынеси мусор — получи 50 рублей». Но что, если это будет не про оплату действий, а про развитие самостоятельности?

У нас две аудитории: родители (которые хотят быть наставниками, а не банкоматами) и дети 6–13 лет (для которых карта — первый опыт обращения с деньгами). Привет, меня зовут Алексей Богомолов, я дизайнер цифровых продуктов, я расскажу, как мы стартовали с парой неочевидных гипотез и о том, как некоторые результаты нас сильно удивили.

Читать далее

Offline‑first PWA на примере фитнес‑трекера

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

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

Для начала, что такое PWA? Это веб‑страница которая выглядит и ведёт себя как приложение, но при этом имеет технические ограничения веб‑страницы.

Читать далее

Picture-in-Picture в iOS: от запуска до переключения контента

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

С системной функцией Picture-in-Picture (PiP) сталкивались, пожалуй, все владельцы iPhone: кто-то смотрит видео на фоне переписки, кто-то общается по видеосвязи в любимых мессенджерах. Для пользователя это просто удобство, а для разработчика видеосервиса — отдельный механизм со своей инфраструктурой, жизненным циклом и набором ограничений. В этой статье я разберу интеграцию PiP как встроенного плеера: от первого запуска до переключения контента. Поделюсь нюансами, с которыми вы точно столкнётесь на практике, и покажу, как обойти типовые грабли.

Читать далее

Сборщик мусора в Dart. Часть 2: поколения и scavenge

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

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

Перед нами стоит самый главный вопрос: А как сборщик все-таки за собой убирает? 

Молодое и старое поколение.

Что происходит в обычном build() у Flutter-виджета? За один кадр создается куча временных объектов: EdgeInsets, Padding, промежуточные TextStyle, какие-то списки, замыкания. Живут они до следующего ребилда(Не учитывая const).

Также у нас есть и другая категория объектов, которые живут долго: синглтоны, кэши, репозитории, состояние приложения.  Они создаются один раз  и живут все время работы.
Отсюда вывод, если молодые объекты пересоздаются пачками, а старые в основном живут, то убирать их одинаково не выгодно. Именно поэтому Dart делит кучу на 2 поколения...

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