Мобильная разработка
13.2K subscribers
914 photos
237 videos
3.04K links
Актуальное по мобильной разработке — Android, iOS, кроссплатформа

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

Регистрация в перечне РКН: https://tprg.ru/oVBP
Download Telegram
Космос, Ferrari, котёнок в коробке: обои на рабочий стол выбирали часами, перебирая варианты один за другим. SpaceWeb и Типичный программист вспомнили это в анкете к 25-летию компании, вместе с любимым спортом и лучшим другом — тоже родом из школьных анкет.

Между вопросами — история аськи, скайпа, биткоина и самой компании с 2001 по 2026 год, плюс немного будущего. В конце — промокод на услуги SpaceWeb и ответ на вопрос какое ты хранилище информации!
1
Справочник по BLE во Flutter: от разрешений и MTU до архитектуры сервиса под продакшен

Туториалы по Flutter обычно заканчиваются на REST. Как только надо поговорить с пульсометром, умной лампой или своим железом, начинается Bluetooth Low Energy, где разрешения различаются между Android и iOS и даже между версиями Android, а жизненный цикл соединения имеет больше состояний, чем ожидаешь. Пакет flutter_blue_plus прячет платформенную боль, оставляя контроль над сканированием и обменом.

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

#flutter
Kotlin, NDK и JNI: как позвать C и C++ из Android-приложения

Поводов спуститься в нативный код три: не хватает производительности, есть готовая библиотека на C или нужна функциональность уровнем ниже, чем даёт платформа. Инструментарий даёт Android NDK, а мостом между Kotlin или Java и нативной стороной работает JNI.

Разбор начинается с архитектуры этой связки, а не с копипасты первого рабочего примера: видно, какие слои участвуют, где проходят границы ответственности и в каком месте вы платите за переход через JNI.

Полезно как карта местности перед первым спуском, особенно если раньше нативный код в проекте трогал кто-то другой.

#kotlin
Android Skills специально строят так, чтобы их можно было выбросить

Google выпустил официальные Android Skills в апреле, отклик превзошёл ожидания, и теперь команда объясняет философию проекта и отвечает на накопившиеся вопросы.

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

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

#android
Compose Multiplatform 1.12.0 отдаёт запущенное приложение агенту через MCP

Вышла версия 1.12.0. Главное для тех, кто кодит с ассистентом: в Compose Hot Reload появился MCP-сервер, через который агент обращается к работающему приложению, а не угадывает его состояние по исходникам.

Помимо этого подтянули управление веб-ресурсами и дали более тонкий контроль над состояниями окна на десктопе.

Если у вас общий UI под Android и iOS, смотреть стоит именно на связку hot reload и агентов: это тот случай, когда инструмент меняет цикл правка-сборка-проверка, а не добавляет ещё один API в список. Заметка о релизе в блоге JetBrains.

#compose
Android 17 включает ECH на уровне всей системы

Google добавил в Android 17 поддержку Encrypted Client Hello: стандарт скрывает от сети, какие сайты открывает пользователь. Работает в паре с приватным DNS и прячет имя домена, шифруя его ключом, который расшифровывает только сам сайт.

Для разработчика тут две практические детали. Первая: ECH GREASE включён по умолчанию, устройство подмешивает фиктивные ECH-расширения к сайтам без поддержки, чтобы защищённые соединения не выделялись на общем фоне. Вторая: OkHttp уже втянул поддержку ECH в ядро библиотеки, так что сторонним приложениям она доступна.

В том же наборе Local Network Protection: приложение теперь обязано спросить разрешение, прежде чем сканировать локальную сеть или подключаться к устройствам в ней. Разбор в The Hacker News.

#android
👍5
iOS Safari уносит панели за экран при открытии клавиатуры, и лечится это одной строкой CSS

Сценарий узкий, но узнаваемый: полноэкранный мобильный редактор сделан оверлеем с position: fixed, сверху закреплённая панель инструментов, снизу навигация. Открывается системная клавиатура, и Safari укатывает весь ваш хром за пределы экрана.

🔘 воспроизводится только на коротком контенте, поэтому легко не поймать на тестах;
🔘 плясок с viewport в JavaScript не нужно: достаточно padding-bottom: 60vh на области редактирования.

#ios
Незарегистрированные приложения выпадут из Google Play 30 сентября

Google включает проверку разработчика: package name приложения должен быть зарегистрирован в Play Console. 99% приложений зарегистрировали автоматически, остальное на вас: проверьте список на главной Play Console. Осталось три недели, дальше приложение удаляют из Play глобально.

С той же даты установки проверяют у пользователей Бразилии, Индонезии, Сингапура и Таиланда, не только из Play: Galaxy Store, GetApps, HONOR и OPPO App Market, Palm Store, V-Appstore. Остальные страны подключат в 2027 году. Сборки, которые вы раздаёте мимо стора, регистрируются в Play Console, иначе они не поставятся на сертифицированные устройства.

Если приложений много, в июле заработали API: Android Developer ID Status API проверяет, зарегистрирован ли package name, Android Developer Console API регистрирует имена из CI/CD.

#android
В Китае генеративные фичи вашего iOS-приложения могут отвечать иначе

Вызовы Writing Tools и фреймворка Foundation Models вы пишете один раз, а отвечать на них в разных регионах будут разные модели. The New Stack со ссылкой на Reuters пишет, что Apple собрала для Китая отдельную модель при участии Alibaba: ни ChatGPT, ни Gemini, ни Claude предоставлять там свои сервисы не могут, поэтому опереться можно только на то, что разработано или одобрено внутри страны. Рядом с новой моделью должен работать Qwen, возможно и технологии Baidu.

Какая модель отвечает за какую часть Apple Intelligence, ни Apple, ни партнёры не объяснили. Даты запуска тоже нет, Reuters ждёт сервис в ближайшие месяцы.

Так что генеративные фичи придётся тестировать на китайском аккаунте отдельно. Промпт, отлаженный на европейском регионе, там может ответить иначе.

#ios
Код на C во Flutter дёргается из Dart напрямую, без обвязки под каждую платформу

Готовый код на C в приложении (кодек, крипта, обработка картинок) обычно заворачивают в platform channel, и обвязку пишут дважды: под Android и под iOS. Dart FFI этот слой убирает, Dart вызывает C-функцию сам.

Цена: сигнатуры руками. На каждую функцию объявляете два typedef, один в типах FFI (Int32 Function(Int32, Int32)), второй в дартовых (int Function(int, int)). А функция в библиотеке должна быть с C-совместимым ABI, иначе Dart не найдёт символ.

Загрузка зависит от платформы: на Android библиотека открывается по имени файла, DynamicLibrary.open('libnative_math.so'), в остальных случаях символ ищут в самом процессе приложения, DynamicLibrary.process().

Туториал на dev.to собирает минимальный проект и говорит, где FFI не нужен: под платформенные API Android и iOS ближе platform channels.

#flutter
1👍1
Релиз Flutter-приложения в сторы можно свести к одному пушу в ветку

Билд для тестировщиков к вечеру пятницы обычно выглядит так: архив в Xcode, ошибка подписи, повторный архив, загрузка в TestFlight. Потом то же для Android: подписать APK, залить в Firebase App Distribution, добавить тестировщиков и заметки.

В руководстве freeCodeCamp это перекладывают на GitHub Actions и Fastlane: пуш в ветку dev собирает APK и IPA на серверах GitHub и раздаёт их в Firebase App Distribution и TestFlight, пуш в prod уходит в Google Play и App Store Connect.

Дольше всего настраивается подпись iOS: fastlane match держит сертификаты и профили в отдельном приватном репозитории, а сборка расшифровывает их паролем из секретов GitHub. Ещё нужны ключ App Store Connect API и сервисный аккаунт Google Play.

Начинать стоит с тестовых сборок: стор-релизы подключаются потом той же схемой.

#flutter
1
Автоматизация в приложении не должна ждать сеть, и на Android её можно собрать целиком на устройстве

Вы вешаете смену профиля звука на правило из Firebase, и в метро приложение молчит: пора срабатывать, а ответа сервера нет. То же в самолёте и на слабой связи.

Автор Muffle, приложения для беззвучного режима по времени и месту, вынес состояние на устройство: Room как единственный источник правды, WorkManager для периодических проверок, Geofencing API для геозон, AlarmManager для времени, а профили переключает ForegroundService через AudioManager.

Учтите: ForegroundService нужно объявить типом в манифесте и обосновать в Google Play Console, иначе релиз рискует не пройти ревью. И геозоны с будильниками после перезагрузки регистрируются заново, сверяться с сервером не с чем. Как автор делает переходы состояний атомарными, чтобы телефон не остался в беззвучном режиме навсегда.

#android
❤‍🔥1