Мобильная разработка
13.1K subscribers
992 photos
238 videos
3.11K links
Актуальное по мобильной разработке — Android, iOS, кроссплатформа

Разместить рекламу: @tproger_sales_bot
Правила общения: https://tprg.ru/rules
Другие каналы: @tproger_channels
Сайт: https://tprg.ru/site

Регистрация в перечне РКН: https://tprg.ru/oVBP
Download Telegram
Android CLI получил Device Streaming для тестов на реальных смартфонах

Google добавила в Android CLI поддержку Device Streaming: теперь консоль и ИИ-агенты могут работать с физическими устройствами в облаке. Подключение идет через защищенный ADB over SSL, поэтому удаленный смартфон виден тулчейну так же, как если бы был подключен по USB.

Из терминала можно деплоить сборки, выгружать системные логи и трейсы, а также снимать скриншоты в headless-режиме. Параллельно каталог официальных инструкций Android skills вырос до 20+ файлов SKILL.md: от профилирования в PerfettoSQL и миграции на CameraX до аудита правил Google Play.

В блоге привели кейс команды FotMob: с навыком по Wear Compose Material 3 инженеры за один день перевели восемь списков на TransformingLazyColumn и убрали рукописный rotary-код. При этом инструкции поймали ошибки модели — забытый contentPadding и хардкод размеров sp.

@mobi_dev
This media is not supported in your browser
VIEW IN TELEGRAM
❤6👍3👎2💯1
Как ускорить React Native-приложение с картой и Zustand

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

Компоненты вынесли из родительского: иначе React заново монтирует их из-за новой ссылки на функцию. В Zustand компоненты подписали отдельными селекторами только на нужные данные.

Маркеры обновляли лишь при изменении счётчика, поиск по массиву заменили заранее собранной Map. Страницы API объединяли перед записью в хранилище, а форматирование перенесли с загрузки данных на чтение.
😁1💯1
Как внедрить Maestro в React Native и не дублировать E2E-тесты

Команда Add Jam сравнила внедрение Maestro и Detox. Maestro работает вне кодовой базы приложения: достаточно установить консольную утилиту и направить её на запущенную сборку. Тесты описываются в YAML, а одни и те же сценарии и проверки запускаются на iOS и Android без изменений.

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

Ограничения тоже разобраны: селекторы по testID нестабильно находили перекрывающиеся и абсолютно позиционированные элементы. Приходилось нажимать по координатам, из-за чего тест зависел от вёрстки. Ещё виртуальная клавиатура мешала следующим нажатиям, а LogBox перекрывал элементы интерфейса.
🎉1
Как отделить эффект Baseline Profiles от очистки запуска Android-приложения

В Compose-приложении автора Baseline Profiles ускоряли запуск, но итоговые 18–34% появились после очистки стартового пути. Разбор эксперимента с запуском показывает, как не приписать весь результат профилю.

Автор сравнивал запуск без профиля в verify и с ним в speed-profile, каждый раз принудительно останавливая приложение. Затем убрал запуск интерфейса из фонового события, вынес чтение настроек и блокирующий ввод-вывод из критического пути.

Кейс пригодится для воспроизводимых замеров старта Android-приложения: цифра ускорения важна вместе с её причиной.
👍2
Почему @ObservedObject сбрасывает модель в SwiftUI

@ObservedObject следит за изменениями модели, полученной извне, но не хранит созданный внутри представления экземпляр. Когда состояние родителя меняется, SwiftUI может заново создать значение дочернего View. Вместе с ним появится новый CounterViewModel, а счётчик вернётся к нулю.

Если дочернее представление само создаёт модель, объявляйте её через @StateObject. SwiftUI сохранит экземпляр, пока считает представление тем же самым. Если модель создаёт родитель, он хранит её через @StateObject и передаёт ребёнку как @ObservedObject.

Для нового кода под iOS 17 и новее источник предлагает @Observable с @State, но правило владения остаётся тем же. Пример со сбрасывающимся счётчиком и варианты исправления приведены с кодом.
❤2
Как собрать стабильную пирамиду тестов для Flutter-приложения

Руководство по тестированию Flutter разбирает unit-, widget-, golden- и integration-тесты. Логику предлагают выносить из виджетов, связи интерфейса проверять widget-тестами, а запуск, авторизацию, покупки, плагины и платформенные каналы — на устройстве или эмуляторе.

pumpAndSettle() ждёт прекращения новых кадров, поэтому бесконечный индикатор приводит к тайм-ауту. Вместо него автор управляет кадрами через pump(), а асинхронным результатом — через Completer.

Для golden-тестов разобраны расхождения снимков в macOS и Linux CI: влияют шрифты и окружение. Их лучше оставить для выбранных компонентов и запускать в зафиксированной среде.
🤝1
Как нативные контролы SwiftUI меняются в iOS 26 без правок интерфейса

Один бинарник, собранный в Xcode 26.6 с SDK iOS 26.5 и минимальной версией iOS 17, запустили на iOS 17.5 и 26.3. Визуальное сравнение интерфейсов показывает изменения, которые SwiftUI применяет автоматически: добавлять glassEffect() не требуется.

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

После обновления SDK стоит пересобрать приложение и проверить основные экраны на старой и новой iOS. Сворачивание панели вкладок и собственные стеклянные эффекты уже требуют дополнительных API.
👍1💯1
Как закрепить границы Clean Architecture в Swift Packages

Папки Domain, Data и Presentation сами по себе не мешают экрану обратиться к базе или стороннему SDK. В разборе SwiftUI-приложения Popcorn каждую архитектурную границу превращают в отдельный Swift Package с явным списком зависимостей.

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

Такие границы проверяет компилятор: запрещённый импорт ломает сборку, а добавление зависимости в Package.swift видно на ревью. Сценарии можно тестировать с поддельным репозиторием, без сети, базы и симулятора.
❤1👏1
SwiftUI List против UICollectionView: как измерить тяжёлую ленту в iOS 26.1

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

В разборе профилирования List и UICollectionView показаны замеры задержек кадров, памяти, загрузки процессора и нагрева на iPhone 17 с iOS 26.1. Например, SwiftUI-версия за 24 секунды получила 78 задержек кадров и два зависания примерно по две секунды.

Это не универсальный приговор фреймворку, а воспроизводимый стенд с открытым проектом. Его можно взять за основу, чтобы прогнать собственный экран через Instruments и сравнить реализации на целевых устройствах перед выбором UI-фреймворка.
🔥2
Пять функций Android Studio для работы с изменениями в коде

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

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

Отложенные правки хранит сама IDE, а не Git. Если установка Android Studio повредится, изменения можно потерять. В материале показаны действия в меню и снимки интерфейса.
❤1👍1
Как показать данные, пока остальные запросы ещё выполняются

Для одного экрана CardioBot нужно 40–50 запросов к HealthKit. Если собрать их результаты в один объект и только потом обновить интерфейс, пользователь будет ждать завершения всей загрузки.

В разборе Majid данные загружаются через AsyncSequence: каждый шаг возвращает накопленный снимок, а ViewModel обновляет состояние в цикле for await. Внутри отдельных шагов можно сохранить параллельные запросы через async let.

Порядок загрузки становится частью интерфейса: сначала можно получить данные для видимого раздела, затем остальные. Итератор также проверяет отмену задачи и завершает последовательность, когда работа больше не нужна.
💯1
Что меняется в подписках Google Play

Подписка и разовая покупка обычно требуют отдельных оплат. В обзоре новых возможностей Google Play описан Mixed Carts: подписку с автопродлением и разовый товар можно оформить через один вызов API и общий экран оплаты.

Среди других направлений — покупка нескольких мест для команды и предоплаченный баланс с автоматическим пополнением для функций с переменной стоимостью. Часть возможностей проходит тестирование с партнёрами или распространяется через Early Access.

In-App Messaging API уже доступен всем разработчикам. Он позволяет прямо в приложении предложить исправить отклонённый платёж или сообщить о предстоящем изменении цены.
🔥1
Бот для перехода с iPhone на Android

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

Нужно ответить на несколько вопросов о характеристиках и сценариях использования, а бот выдаст подборку подходящих смартфонов.

Удобно, если уже давно задумывались о смене операционной системы или понадобился телефон на базе Android.
👍1👎1🔥1😁1🤝1