Обновить
256K+

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

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

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

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

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

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

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

Читать далее

Новости

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

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

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

Читать далее

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

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

Читать далее

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

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

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

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

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

Читать далее

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

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

Привет хабр!

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

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

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

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

Читать далее

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

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

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

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

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

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

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

Читать далее

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

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

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

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

Читать далее

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

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

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

Читать далее

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

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

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

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

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

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

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

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

Читать далее

Трижды в топ‑3 финтеха: 6 потерь эффективности, которые мы устранили, чтобы быть среди лучших

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

Еще в 22-м году я рассказывал, как за довольно небольшой промежуток времени мы смогли ворваться в ТОП-3 финтех-приложений для малого и среднего бизнеса. С тех пор уже состоялось новое исследование MarksWebb 24-го года, в котором мы стали лучшими. В мае текущего года мы стали серебряными призерами — с колоссальным отрывом от всех остальных преследователей.

На связи Кирилл Маканков, iOS-разработчик из ПСБ.

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

1. руководителям всех направлений разработки, так как показывает, где и как находить неэффективные процессы, и, самое главное, — как радикально повышать их эффективность;

2. архитекторам программного обеспечения, так как именно они ответственны за эффективность процессов разработки;

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

И как же стать эффективнее?

1823 коммита за четыре месяца в четыре руки с LLM: что получилось, а что чуть не убило проект

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

Четыре месяца, 1823 коммита и около 200 000 строк кода: мобильное приложение для изучения английского, почти целиком написанное через LLM-агента. Я формулировал задачи, ревьюил и принимал архитектурные решения, но код руками набирал редко.

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

Внутри: конституция проекта в CLAUDE.md, четыре слоя храповиков (включая обёртку над git, которая не даёт обойти хуки), разбор пяти причин, почему анимация рвалась на реальном Android, и слоистая память на pgvector с локальными эмбеддингами.

Читать далее

Тренажер ТРИЗ для инженеров

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

Я давно работаю инженером и когда узнал про ТРИЗ очень заинтересовался. Изучив все приемы пришел к выводу - а ведь не надо даже в наше время уже сидеть и долго мыслить над проблемами разработки ведь все основные шаблоны уже описаны. А ведь каждый шаблон это фактически выход из определенной ситуации и проблемы. В начале я сделал приложение в котором с начало показывается название приема и скрыто его значение. По типу приложения для заучивания слов. Но это мне показалось не очень интересным и скучным, поэтому долго я им не прозанимался и вскоре забыл про него.

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

И вот через несколько дней появилось мое приложение. Ну а теперь подробней о нем.

Читать далее

Сколько токенов в секунду реально выдаёт Mac mini M4

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

Дисклеймер: я держу сервис аренды маков, поэтому у меня под рукой флот одинаковых машин и повод их гонять. Цифры ниже с этих машин, методика описана полностью, данные открыты под CC BY. Ссылок на сервис в статье нет.

Читать далее

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

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

В этом дайджесте дистрибуция iOS‑приложения без App Store и 5 лет Compose, верификация Android разработчиков и нагрев iOS-устройств как продуктовая метрика, локальные LLM на iPhone, “бумажный” асинхронный Kotlin, ускорение корутин, пошаговая инструкция по внедрению скелетон-загрузок, проговаривания мыслей для ИИ и многое другое. Заходите!

Читать далее

Уведомления на Android без Google: почему UnifiedPush через публичный ntfy у вас не работает

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

Как вы помните мы делаем мессенджер. Google-сервисы в нашем основном регионе недоступны, значит FCM отпадает, что мы с этим сделали?

Стандартный ответ на эту задачу известен и выглядит красиво: UnifiedPush. Открытый контракт, никакого Google, пользователь сам выбирает, через кого получать сигналы. Мы так и сделали в июне, всё заработало на тестовых устройствах, и мы поехали дальше.

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

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