KMP-проект с Kotlin Toolchain 0.13: меньше ручной настройки
JetBrains теперь рекомендует Kotlin Toolchain для большинства новых KMP-проектов. Версия 0.13 объединяет создание проекта, настройку окружения, сборку и запуск через CLI.
В разборе обновления команда показывает
Появился импорт SwiftPM-зависимостей через их Objective-C API. А кеши Kotlin/Native позволяют повторно использовать собранные зависимости и пересобирать затронутые файлы в поддерживаемых отладочных конфигурациях.
Для существующих Gradle-проектов это пока не рекомендация к массовой миграции: JetBrains продолжает закрывать пробелы в их поддержке.
JetBrains теперь рекомендует Kotlin Toolchain для большинства новых KMP-проектов. Версия 0.13 объединяет создание проекта, настройку окружения, сборку и запуск через CLI.
В разборе обновления команда показывает
kotlin new: мастер предлагает выбрать тип приложения и целевые платформы. Недостающие компоненты Android SDK устанавливаются и при импорте проекта в IDE. Для iOS улучшили диагностику Xcode и автоматическую подготовку симулятора.Появился импорт SwiftPM-зависимостей через их Objective-C API. А кеши Kotlin/Native позволяют повторно использовать собранные зависимости и пересобирать затронутые файлы в поддерживаемых отладочных конфигурациях.
Для существующих Gradle-проектов это пока не рекомендация к массовой миграции: JetBrains продолжает закрывать пробелы в их поддержке.
👍1
Как передать ИИ-агенту результаты Xcode Instruments
Файл
В разборе RocketTrace автор показывает другой порядок: приложение анализирует запись локально, ранжирует найденные проблемы и передаёт агенту краткую сводку с доказательствами. Затем можно запросить детали конкретной находки.
Для замера рекомендуют свежую сборку в release-конфигурации: отладочная может показать затраты, которых не будет у пользователей. После исправления добавляют новый прогон и сравнивают результаты.
В авторском бенчмарке агенты находили больше проблем с меньшими затратами токенов. Это эксперимент на одной подготовленной записи; результат своего приложения нужно измерять отдельно.
Файл
.trace содержит множество таблиц: CPU, зависания, задачи Swift, обновления SwiftUI. Если агент экспортирует их подряд, большая часть работы уходит на чтение и фильтрацию данных.В разборе RocketTrace автор показывает другой порядок: приложение анализирует запись локально, ранжирует найденные проблемы и передаёт агенту краткую сводку с доказательствами. Затем можно запросить детали конкретной находки.
Для замера рекомендуют свежую сборку в release-конфигурации: отладочная может показать затраты, которых не будет у пользователей. После исправления добавляют новый прогон и сравнивают результаты.
В авторском бенчмарке агенты находили больше проблем с меньшими затратами токенов. Это эксперимент на одной подготовленной записи; результат своего приложения нужно измерять отдельно.
👍2🔥1
Пользователь отменил покупку. Это ещё не ошибка
Собственный экран оплаты и собственная обработка транзакции — два отдельных решения. Можно нарисовать paywall самостоятельно, а завершение покупки оставить SDK RevenueCat.
В руководстве по Android-покупкам разобраны
Для перехода между тарифами важен режим замены. Например,
Когда транзакцию завершает само приложение, на нём остаётся и обязанность подтвердить покупку. Кастомизация интерфейса сама по себе такой обязанности не добавляет.
Собственный экран оплаты и собственная обработка транзакции — два отдельных решения. Можно нарисовать paywall самостоятельно, а завершение покупки оставить SDK RevenueCat.
В руководстве по Android-покупкам разобраны
PurchaseParams, обработчики результата и режимы смены подписки. У отмены пользователем есть отдельный признак: закрытие окна Google Play не стоит превращать в сообщение «Покупка не удалась».Для перехода между тарифами важен режим замены. Например,
WITHOUT_PRORATION может включить новый план сразу, но не списать доплату до окончания текущего периода. Если бизнес-логика ожидает другое, настройку нужно задать явно.Когда транзакцию завершает само приложение, на нём остаётся и обязанность подтвердить покупку. Кастомизация интерфейса сама по себе такой обязанности не добавляет.
❤1🤝1
Как согласовать скругления карточки и контейнера в SwiftUI
Одинаковый
В примере с GeometryReader эти радиусы передают в
Есть ограничение: радиус не превышает половины короткой стороны карточки. Поэтому маленькое представление вплотную к углу экрана может всё равно обрезаться — одного вычисленного скругления недостаточно, нужно проверить отступ.
Свойство возвращает optional: пример использует нулевые радиусы при
Одинаковый
cornerRadius у внешнего контейнера и вложенной карточки не даёт концентрических углов: между ними есть отступ. В iOS 27 значения можно получить через GeometryProxy.concentricCornerRadii.В примере с GeometryReader эти радиусы передают в
UnevenRoundedRectangle. По умолчанию расчёт ориентируется на углы экрана. Чтобы учитывать собственный контейнер, его форму задают через containerShape.Есть ограничение: радиус не превышает половины короткой стороны карточки. Поэтому маленькое представление вплотную к углу экрана может всё равно обрезаться — одного вычисленного скругления недостаточно, нужно проверить отступ.
Свойство возвращает optional: пример использует нулевые радиусы при
nil. Для произвольного прямоугольника есть concentricCornerRadii(in:), которому передают рамку в координатах GeometryProxy.👍1
Долгая задача продолжится, даже если Android-приложение закрыли
Помощник собирает маршрут: ищет перелёт, гостиницу и билеты. Если весь процесс привязан к экрану телефона, уход приложения в фон усложняет сохранение прогресса.
В разборе архитектуры Jetpacker Google переносит многошаговый сценарий на сервер. Координатор ADK вызывает специализированных агентов, а Android-клиент показывает ход работы и запрашивает выбор пользователя.
AG-UI передаёт сообщения и события выполнения. A2UI описывает интерфейс структурированными данными, которые клиент отображает нативными компонентами Jetpack Compose.
Так сервер может менять сочетания поддерживаемых карточек без выпуска новой версии приложения. Но набор компонентов всё равно задаётся на клиенте: произвольный экран, которого бинарник не умеет рисовать, из JSON не появится. В статье есть ссылки на код сервера и Android-приложения.
Помощник собирает маршрут: ищет перелёт, гостиницу и билеты. Если весь процесс привязан к экрану телефона, уход приложения в фон усложняет сохранение прогресса.
В разборе архитектуры Jetpacker Google переносит многошаговый сценарий на сервер. Координатор ADK вызывает специализированных агентов, а Android-клиент показывает ход работы и запрашивает выбор пользователя.
AG-UI передаёт сообщения и события выполнения. A2UI описывает интерфейс структурированными данными, которые клиент отображает нативными компонентами Jetpack Compose.
Так сервер может менять сочетания поддерживаемых карточек без выпуска новой версии приложения. Но набор компонентов всё равно задаётся на клиенте: произвольный экран, которого бинарник не умеет рисовать, из JSON не появится. В статье есть ссылки на код сервера и Android-приложения.
👍1
Границы модулей, которые нельзя обойти случайным import
Фича оформления заказа захотела аватар пользователя — и получила зависимость от реализации профиля. Проект собирается, но менять эти части независимо уже сложнее.
В разборе модульной архитектуры Compose каждую возможность делят на
Правило проверяет convention plugin Gradle: зависимость чужой фичи от
Для навигации наружу отдают launcher, возвращающий маршрут. Фича знает, куда можно перейти, а вызывающий код решает, как изменить back stack. В статье есть примеры проверок и цена такого разделения.
Фича оформления заказа захотела аватар пользователя — и получила зависимость от реализации профиля. Проект собирается, но менять эти части независимо уже сложнее.
В разборе модульной архитектуры Compose каждую возможность делят на
-api и -impl. Только модуль приложения видит реализации. Остальные фичи общаются через контракты.Правило проверяет convention plugin Gradle: зависимость чужой фичи от
-impl останавливает сборку ещё на этапе конфигурации. Внутренние маршруты, репозитории и ViewModel дополнительно закрывают через Kotlin internal.Для навигации наружу отдают launcher, возвращающий маршрут. Фича знает, куда можно перейти, а вызывающий код решает, как изменить back stack. В статье есть примеры проверок и цена такого разделения.
👌1
Кнопка закрытия sheet переехала на боковую панель
На внешнем экране iPhone Duo привычное модальное окно может получить вертикальный toolbar. На внутреннем — остаться с горизонтальным, а при сгибании сдвинуться в сторону.
В примере SwiftUI sheets это происходит автоматически при сборке с iOS 27.1 SDK. Следить за углом шарнира и вручную двигать окно для стандартного поведения не нужно.
Размещение можно уточнить через
Это обход проблемы конкретной беты. Перед добавлением собственных отступов стоит проверить стандартное окно в симуляторе во всех положениях устройства.
На внешнем экране iPhone Duo привычное модальное окно может получить вертикальный toolbar. На внутреннем — остаться с горизонтальным, а при сгибании сдвинуться в сторону.
В примере SwiftUI sheets это происходит автоматически при сборке с iOS 27.1 SDK. Следить за углом шарнира и вручную двигать окно для стандартного поведения не нужно.
Размещение можно уточнить через
presentationPlacement. Но автор нашла нюанс в iOS 27.1 beta: у окна с положением trailing кнопка закрытия иногда перекрывалась системной областью. В её тесте помогло явное presentationDetents([.large]).Это обход проблемы конкретной беты. Перед добавлением собственных отступов стоит проверить стандартное окно в симуляторе во всех положениях устройства.
💯1
Два String — и платёж ушёл не туда
Идентификаторы продавца и банка могут выглядеть одинаково. Если оба представлены строками, перепутанные аргументы спокойно проходят компиляцию.
В разборе опыта Verifone для каждого понятия вводят свой Kotlin value class:
Та же логика распространяется на состояние операции. Обязательное поле не делают nullable «на всякий случай», а разные исходы описывают sealed-типами. Таймаут запроса сам по себе не доказывает, что платёж не состоялся.
Эти приёмы пригодятся и в мобильном клиенте: на границе API сырые данные проверяют и превращают в типы предметной области, с которыми дальше работает приложение.
Идентификаторы продавца и банка могут выглядеть одинаково. Если оба представлены строками, перепутанные аргументы спокойно проходят компиляцию.
В разборе опыта Verifone для каждого понятия вводят свой Kotlin value class:
MerchantId, AcquirerId и другие. После этого подмена одного идентификатора другим становится ошибкой типов.Та же логика распространяется на состояние операции. Обязательное поле не делают nullable «на всякий случай», а разные исходы описывают sealed-типами. Таймаут запроса сам по себе не доказывает, что платёж не состоялся.
Эти приёмы пригодятся и в мобильном клиенте: на границе API сырые данные проверяют и превращают в типы предметной области, с которыми дальше работает приложение.
🔥1
Lottie в пейволле: обычный пример с CDN не заработает
В RevenueCat можно добавить собственную анимацию в серверный пейволл. Но custom component загружается как самостоятельный набор веб-файлов со строгими ограничениями.
В руководстве для Android показаны варианты с Rive и Lottie. Скрипты, стили, runtime и данные анимации упаковывают вместе. Запросы через
У Rive это влияет даже на выбор сборки: стандартный runtime подтягивает WebAssembly, поэтому в примере используют
В таком компоненте размещают декоративную часть. Выбор тарифа и кнопки покупки остаются нативными — обработкой покупки по-прежнему занимается SDK.
В RevenueCat можно добавить собственную анимацию в серверный пейволл. Но custom component загружается как самостоятельный набор веб-файлов со строгими ограничениями.
В руководстве для Android показаны варианты с Rive и Lottie. Скрипты, стили, runtime и данные анимации упаковывают вместе. Запросы через
fetch, inline-скрипты и eval запрещены политикой CSP.У Rive это влияет даже на выбор сборки: стандартный runtime подтягивает WebAssembly, поэтому в примере используют
canvas-single. Данные анимации передают напрямую, без загрузки по URL.В таком компоненте размещают декоративную часть. Выбор тарифа и кнопки покупки остаются нативными — обработкой покупки по-прежнему занимается SDK.
🤝1
Отдельные ToolbarItem ещё не означают отдельные кнопки
В iOS 26 соседние элементы SwiftUI toolbar могут объединяться в одну стеклянную капсулу. Разнести их по нескольким
В разборе группировки toolbar показано, что важны соседство и край панели. Текст, иконки и пользовательские представления могут получить общий фон.
Чтобы разделить действия явно, между ними ставят
Отдельная ловушка — кнопка подтверждения. Одного placement
В iOS 26 соседние элементы SwiftUI toolbar могут объединяться в одну стеклянную капсулу. Разнести их по нескольким
ToolbarItemGroup недостаточно.В разборе группировки toolbar показано, что важны соседство и край панели. Текст, иконки и пользовательские представления могут получить общий фон.
Чтобы разделить действия явно, между ними ставят
ToolbarSpacer. Фиксированный создаёт небольшой промежуток. Гибкий в нижней панели раздвигает группы к краям, но в верхней не получает пространство заголовка.Отдельная ловушка — кнопка подтверждения. Одного placement
confirmationAction недостаточно для собственной капсулы: в примере её выделяет роль confirm. Это стоит проверить, если «Готово» визуально слилось с соседним действием.👏1
Kotlin давно вышел за пределы Android. Вот что показывает опрос
Больше половины Kotlin-разработчиков в исследовании JetBrains сообщили, что работают над backend-проектами. Это полезный контекст для мобильных команд, которые обсуждают общий язык с серверной частью.
В State of Kotlin 2026 собраны данные исследований JetBrains, отраслевые сведения и примеры использования языка. Отдельные разделы посвящены multiplatform и AI-инструментам.
Среди опрошенных Kotlin-разработчиков 93% используют хотя бы один AI coding tool. А 81% оценивают сгенерированный Kotlin-код как полностью корректный или требующий небольших исправлений.
Последнее число описывает ответы людей, а не результат независимого тестирования кода. Отчёт помогает увидеть практики сообщества; решение о KMP или генерации кода для своего приложения всё равно требует отдельной проверки.
Больше половины Kotlin-разработчиков в исследовании JetBrains сообщили, что работают над backend-проектами. Это полезный контекст для мобильных команд, которые обсуждают общий язык с серверной частью.
В State of Kotlin 2026 собраны данные исследований JetBrains, отраслевые сведения и примеры использования языка. Отдельные разделы посвящены multiplatform и AI-инструментам.
Среди опрошенных Kotlin-разработчиков 93% используют хотя бы один AI coding tool. А 81% оценивают сгенерированный Kotlin-код как полностью корректный или требующий небольших исправлений.
Последнее число описывает ответы людей, а не результат независимого тестирования кода. Отчёт помогает увидеть практики сообщества; решение о KMP или генерации кода для своего приложения всё равно требует отдельной проверки.
❤2👎2🎉1