Kotlin Adept Notes
前往频道在 Telegram
Канал о разработке на Kotlin и обо всем, что с ним связано По всем вопросам и рекламе: @ajiekcx
显示更多2 358
订阅者
-124 小时
+47 天
-830 天
数据加载中...
相似频道
标签云
进出提及
---
---
---
---
---
---
吸引订阅者
六月 '26
六月 '26
+17
在0个频道中
五月 '26
+23
在0个频道中
Get PRO
四月 '26
+36
在0个频道中
Get PRO
三月 '26
+34
在0个频道中
Get PRO
二月 '26
+28
在0个频道中
Get PRO
一月 '26
+38
在0个频道中
Get PRO
十二月 '25
+32
在0个频道中
Get PRO
十一月 '25
+58
在0个频道中
Get PRO
十月 '25
+268
在3个频道中
Get PRO
九月 '25
+68
在1个频道中
Get PRO
八月 '25
+79
在1个频道中
Get PRO
七月 '25
+247
在2个频道中
Get PRO
六月 '25
+136
在1个频道中
Get PRO
五月 '25
+59
在0个频道中
Get PRO
四月 '25
+52
在0个频道中
Get PRO
三月 '25
+115
在3个频道中
Get PRO
二月 '25
+84
在2个频道中
Get PRO
一月 '25
+44
在0个频道中
Get PRO
十二月 '24
+85
在1个频道中
Get PRO
十一月 '24
+142
在2个频道中
Get PRO
十月 '24
+97
在0个频道中
Get PRO
九月 '24
+185
在2个频道中
Get PRO
八月 '24
+415
在2个频道中
Get PRO
七月 '24
+42
在0个频道中
Get PRO
六月 '24
+39
在0个频道中
Get PRO
五月 '24
+109
在1个频道中
Get PRO
四月 '24
+97
在3个频道中
Get PRO
三月 '240
在1个频道中
Get PRO
二月 '24
+95
在3个频道中
Get PRO
一月 '24
+52
在1个频道中
Get PRO
十二月 '23
+276
在3个频道中
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 21 六月 | 0 | |||
| 20 六月 | 0 | |||
| 19 六月 | 0 | |||
| 18 六月 | +3 | |||
| 17 六月 | 0 | |||
| 16 六月 | +2 | |||
| 15 六月 | +2 | |||
| 14 六月 | +1 | |||
| 13 六月 | 0 | |||
| 12 六月 | 0 | |||
| 11 六月 | +1 | |||
| 10 六月 | +1 | |||
| 09 六月 | +2 | |||
| 08 六月 | +1 | |||
| 07 六月 | +1 | |||
| 06 六月 | +1 | |||
| 05 六月 | +1 | |||
| 04 六月 | 0 | |||
| 03 六月 | 0 | |||
| 02 六月 | +1 | |||
| 01 六月 | 0 |
频道帖子
Как устроены продукты, которые задают тренды?
Т-Банк готовит летний фест для тех, кому важно не просто слушать, а разбираться, как реально устроены продукты
20 июня «Сезон кода» собирает разработчиков, аналитиков и продактов в Санкт-Петербурге, чтобы показать, как создаются продукты — от первых гипотез до продакшена.
Вас ждут:
— прикладные доклады команд Т-Банка и других компаний про архитектуру, бэкенд и интеграции;
— демо-зоны с ключевыми платформенными и коммуникационными сервисами и графовой аналитикой;
— продуктовый стрим «Продуктовая кухня»: разберем, как данные превращаются в решения, а гипотезы — в рост продукта и ценность для пользователя;
— формат, где знакомства происходят прямо по ходу программы.
А еще — баскетбольная площадка, пинг-понг и большое афтепати с диджеем.
Фест пройдет в ИТ-хабе Группы компаний «Т-Технологии».
Количество мест ограничено — успейте зарегистрироваться
| 2 | Как сделать аналог availability check из iOS в KMP
В Swift есть специальный механизм проверки доступности API на разных версиях ОС:
``swift
if #available(iOS 17.4, *) {
newAPI()
} else {
legacyAPI()
}
Это позволяет выполнять код только на определённых версиях ОС, где нужный API гарантированно существует.
Но, к сожалению, такого механизма нет в Kotlin Native при работе над KMP-проектами. И если мы хотим реализовать данную возможность только в Kotlin-коде, то придётся искать обходное решение.
В первую очередь понадобится метод для определения версии iOS:
```kotlin
internal fun isIosVersionAtLeast(major: Int, minor: Int = 0, patch: Int = 0): Boolean {
val target = cValue<NSOperatingSystemVersion> {
majorVersion = major.toLong()
minorVersion = minor.toLong()
patchVersion = patch.toLong()
}
return NSProcessInfo.processInfo.isOperatingSystemAtLeastVersion(target)
}
Однако само по себе это не поможет. Приложение всё равно будет крашиться при запуске на старых версиях ОС, если во фреймворке есть символы несуществующего класса.
Поэтому придётся добавить в настройки сборки shared-фреймворка специальный флаг линковки, который будет подключать указанный системный фреймворк только в том случае, если он доступен:
it.binaries.framework {
linkerOpts.addAll(listOf("-weak_framework", "AuthenticationServices"))
}
Однако если обратиться к несуществующему классу, то приложение всё равно упадет в рантайме. Поэтому для дополнительной безопасности можно также проверять наличие класса через NSClassFromString("ClassName"). | 964 |
| 3 | ✅ kmp-telegram-login
Решил реализовать пример работы с OAuth 2.0 в KMP, как и обещал, но делать просто пример в вакууме не хотелось, и я вспомнил про недавно вышедший android-telegram-login. Подумал, что было бы полезно адаптировать его под KMP.
Но что бы вы думали? Разумеется, кто-то уже навайбкодил это до меня здесь, причём всего пару дней назад 💅
В целом код из репозитория и наша реализация довольно схожи, за исключением некоторых важных моментов.
Там также используется безопасный Code Flow + PKCE, но если Telegram не установлен на устройстве, то вместо нового AuthTabIntent используется CustomTabsIntent и есть подозрение, что с https-схемой могут быть проблемы на некоторых браузерах.
⚠️ Однако в либе есть очень критичная проблема. Похоже, разработчики ещё не запускали код на устройствах с iOS ниже 17.4 или не удосужились написать, как это исправить. Если собрать KMP-фреймворк с этой библиотекой, приложение просто крашнется при запуске, поскольку ASWebAuthenticationSessionCallback доступен только начиная с этой версии ОС.
Именно поэтому мы у себя в итоге отказались от использования Universal Links и оставили только кастомную схему.
На самом деле это можно исправить, и о том, как это сделать, я расскажу в следующем посте, так что stay tuned! | 1 092 |
| 4 | Недушное изучение и практика разговорного английского в онлайн-школе Authentic Pigeon, чтобы привести язык в порядок и дотянуться до офферов за рубежом. Узнать подробнее и записать на бесплатное демо-занятие можно в телеграм-боте.
Абсолютно кайфую от подхода … Занятия тут это не потогонка, а крутой дружеский разговор.
Студент школы — Иван
Реклама. ИП Моисеева А.А. ИНН 270393875959 | 1 715 |
| 5 | Решили тут перейти в дизайн-системе на state-based TextField, чтобы порешать разные проблемы предыдущей версии. И, как говорится, что же могло пойти не так 😐
Какие плюсы получили:
🟢Упростилась работа с курсором — страшные хаки больше не нужны
🟢Перестали лагать быстрые изменения текста на старых устройствах
🟢VisualTransformation теперь разделился на InputTransformation и OutputTransformation, что позволяет гибче работать с изменением текста
Какие минусы:
🔘Пришлось костылить обёртку с двумя LaunchedEffect, чтобы сохранить перегрузку с предыдущим API
🔘Ну и самое бесячее: в новом TextField почему-то решили поменять отступ от клавиатуры. Теперь экран подскролливается к каретке ввода, и выглядит это как на изображении выше. А фиксится всё ужасно костыльным образом.
💬 Так что вопрос к знатокам: кто-нибудь уже сталкивался с подобной проблемой? И если да, то как её решили? | 2 049 |
| 6 | Особенности работы с OAuth 2.0 в KMP
Во многих мобильных приложениях аутентификация и авторизация пользователей происходят через протокол OAuth 2.0, который является индустриальным стандартом.
В нём предусмотрены различные флоу авторизации, и наиболее подходящим для мобильных приложений считается Authorization Code + PKCE. Этот флоу предотвращает перехват данных благодаря генерации временных параметров: codeChallenge и codeVerifier.
Я не сторонник использования сторонних неофициальных библиотек в целом, и тем более для такой критичной вещи, как аутентификация. А в мире KMP найти что-то подходящее ещё сложнее, поэтому часто приходится делать всё самому.
🤖 Android
Для Android в пакете androidx.browser появился очень удобный механизм AuthTabIntent, который берёт на себя почти всю работу, хотя и не без нюансов.
Если выбранный в системе браузер по умолчанию не поддерживает AuthTab, ничего работать не будет. А кроме Chrome и Firefox, насколько я знаю, его почти никто не поддерживает. Поэтому придётся либо явно указывать пакет браузера, либо делать fallback, если подходящего браузера нет.
🍏iOS
На iOS есть аналогичный удобный механизм ASWebAuthenticationSession. Но, как это часто бывает у Apple, не все фичи работают на старых версиях iOS. Например, редирект через https-схему (Universal Links) поддерживается только начиная с iOS 17.4, а на более ранних версиях придётся использовать кастомную схему. И в KMP это довольно сложно разграничить — приходится прибегать к чёрной магии чтобы исключать символы при загрузке фреймворка 🤨
⭐️Если тема для вас актуальна и нужен KMP-сэмпл, ставьте реакции и я постараюсь собрать полноценный пример.
#KMP #OAuth | 2 405 |
| 7 | Твой код — в сердце мощного ИИ! 💚
Команда GigaChat зовёт на One Day Offer амбициозных Java-разработчиков, которые готовы создавать AI‑продукты уровня BigTech и стать частью крупнейшего AI-комьюнити.
Если ты дружишь с Java (версии 8–25), ладишь со Spring и Hibernate, а PostgreSQL и ClickHouse для тебя — не просто слова, переходи по ссылке и занимай слот на One Day Offer.
Встречаемся 23 мая — очень ждём именно тебя! | 1 822 |
| 8 | Переход на AGP 9 в KMP-проектах
Мы долго откладывали миграцию на AGP 9, ждали, пока всякие авторы по типу Huawei адаптирует свои плагины, и наконец решились ⚪️
Казалось бы, спустя столько времени это должна была быть легкая прогулка, но не тут-то было.
С какими проблемами столкнулись
🟢Теперь нельзя использовать плагин android.application в KMP-модулях.
🟢Все модули нужно было мигрировать на новый Android Gradle Plugin.
🟢Больше нельзя генерировать BuildType в KMP-модулях.
🟢Значительно изменились многие API, которые мы использовали в своих Gradle-плагинах.
Помимо этого, обновление Kotlin и Compose нам тоже вставило палки в колеса, но сегодня не об этом. Так что поделюсь рекомендациями для тех, кто еще не перевел свои проекты.
Скиллы для агентов
🟢Официальный skill от Google для миграции KMP-проектов абсолютно не подходит: он лишь понаделал кучу deprecated свойств в gradle.properties.
🟢А вот аналогичный skill от JetBrains хорош! К сожалению, мы узнали о нем поздно, поэтому пришлось делать свой, но с pet-проектом он справился отлично.
Что еще почитать
🟢Переход на Android Gradle Plugin для KMP
🟢Миграция на built-in Kotlin
🟢Гайд по миграции на AGP 9
💬 А как прошла ваша миграция на APG 9? | 1 758 |
| 9 | Особенности работы с Passkeys в Android и iOS
Мы наконец-то реализовали мультиплатформенный модуль для работы с Passkeys и хочу поделиться нюансами, с которыми столкнулись.
Passkeys — более безопасная и простая альтернатива паролям, где аутентификация в сервисе происходит по биометрии.
В случае с Android поддержка Passkeys появилась с Android 9, в то время как на iOS только с iOS 16. При этом технология значительно совершенствовалась в последних версиях ОС, например, предоставляя выбор кастомного менеджера паролей.
🤖 В Android работа с Passkeys происходит через CredentialManager и реализована довольно удобно: почти всё происходит под капотом, достаточно лишь передать JSON с бэкенда. Но есть две проблемы: обработка ошибок и необходимость в Activity context, что создаёт определённые архитектурные сложности. В случае обработки ошибок приходится вручную извлекать из текста через регулярки коды ошибок, чтобы отображать понятные пользователю сообщения.
🇨🇳 А вот пользователи Huawei, к сожалению, не смогут воспользоваться этой фичей, так как CredentialManager просто отказывается работать с другими менеджерами паролей. Хотя для Huawei существует своя реализация FIDO2, API там реализован далеко не лучшим образом, и всё это делается через отдельную Activity, которая будет открываться даже если ключей нет 😐
🍏В iOS же работа с Passkeys происходит через ASAuthorizationController, где приходится вручную мапить каждое поле, конвертировать NSData в Base64URL и обратно. В общем, работать со всем этим добром не очень удобно. Также имеются отличия от Android: например, нельзя передать excludeCredentials для исключения дубликатов ключей, и не поддерживается direct attestation, который позволяет определить, что устройство подписано корневым сертификатом производителя.
💬 А вы интегрировали Passkeys в свой проект или планируете это сделать?
#Passkeys #KMP #Android #iOS | 2 143 |
| 10 | Mobius 2026 Spring: конференция для мобильных разработчиков
Почему мобильные приложения тормозят на проде? Как строить архитектуру, которая масштабируется с ростом пользователей? Где AI уже помогает решать инженерные задачи?
Эти и многие другие вопросы разберем на Mobius этой весной.
📅 12–13 мая, Москва + онлайн
Два дня докладов, воркшопов и живого общения мобильного сообщества. В программе — интеграции с бэкендом, управление состоянием, CI/CD, инструменты, оптимизация перфоманса и поддержка крупных проектов.
Листайте карточки — собрали топовые доклады из программы.
Используйте промокод, чтобы купить персональный билет со скидкой — KOTLINADEPT
Купить билет
Реклама. ООО «Джуг Ру Груп». ИНН 7801341446 | 0 |
| 11 | Генерация макетов через Figma MCP 🖌
Пока все говорят про "убийцу Figma", хочу рассказать о том, как мне удалось примерить шапочку дизайнера и собрать макеты приложения в Figma с использованием корпоративной дизайн-системы с помощью Figma MCP.
Не так давно Figma сделала скил под названием figma-use, который даёт доступ к рисованию на канвасе, переменным, стилям и компонентам. И это стало отличным шансом собрать макеты приложения без навыков работы в Figma.
Я не стал сразу пытаться собирать макеты в Figma, а начал с генерации макетов в виде сайта, скормив бизнес-сценарии приложения и несколько изображений-референсов по стилю AI-агенту. В целом Claude с одного промта справился очень даже неплохо, дальше пришлось просто допилить некоторые моменты.
И уже после этого я решил зафиксировать макеты в Figma на основе сгенерированного сайта. Но первое, во что я упёрся — это лимиты Figma: они закончились буквально за пару вызовов MCP, так что на бесплатном тарифе можете даже не пытаться что-то сделать 🙃
Далее я попробовал выборочно перенести экран как есть, без использования дизайн-системы, и это сработало хорошо, всё перенеслось так, как я и ожидал. Но проблемы начались, когда нужно было использовать компоненты существующей дизайн-системы.
В нашем случае ключевой проблемой оказались кастомные шрифты, которых нет в Figma, из-за чего MCP не может редактировать текст в компонентах 😠
В итоге, чтобы добиться хоть какого-то вменяемого результата, мне пришлось создать ещё два скила: один для корректной работы с палитрой, чтобы правильно выбирать цвета, и отдельно для работы с дизайн-системой, где описаны id всех компонентов и их свойства, а также решения для всех проблем, возникших по пути.
Через боль и страдания я перенёс все макеты. И что могу сказать по текущему статусу работы Figma MCP: пока что это очень сырая штука. Механизм self-валидации через скриншоты работает ужасно — такое ощущение, что работаешь со слепым дизайнером. Да и в целом всё это работает очень долго, даже банальные задачи могут занимать несколько минут, которые профессиональный дизайнер сделает в разы быстрее.
💬 А что вы думаете: сможет ли Figma адаптироваться к новому миру? Или макеты уже прошлый век, и всё сразу будет верстаться в коде?
#Figma #MCP #AI | 0 |
| 12 | Как защитить API от нежданных клиентов
На днях я делал приложение для bug bounty активности на конференции, в котором нужно будет найти секретную ссылку. Мне не хотелось, чтобы всё решилось простым запросом в AI или пересборкой приложения с отключением SSL-пиннинга, поэтому я задумался о том, как защититься от пересборки приложения, чтобы только версия с моей подписью могла делать запросы к серверу.
Я решил попробовать Play Integrity. Всё бы ничего, но приложение должно быть обязательно опубликовано в Google Play, хотя бы во внутреннем тестировании, иначе аттестация устройства не будет проходить. Поэтому этот вариант мне не подошёл, и я решил реализовать собственный сервер аттестации, который проверяет цепочку сертификатов, извлекает из сертификата отпечаток подписи приложения и сравнивает его с заданным.
Звучит круто, но почему тогда это не используется массово? Дело в том, что, во-первых, это работает не на всех версиях Android. Кроме того, устройство должно поддерживать Hardware Attestation, что может отсечь часть устройств и на них приложение просто не будет работать.
Если вас заинтересовала тема, вы ещё успеваете залететь на Podlodka Android Crew и послушать доклад про Play Integrity, где разберут как работают эти механизмы. А ещё вы сможете попробовать сами обойти эту защиту в нашей bug bounty активности 💻
Так что присоединяйтесь, будет не только полезно, но и интересно 😉 | 0 |
| 13 | Розыгрыш билета на Podlodka Android Crew #15
Мы снова подготовили для вас новый сезон конференции Podlodka Android Crew, который пройдет с 30 марта по 3 апреля.
В этот раз неделя будет посвящена безопасности в Android-разработке, и, на мой взгляд, нам удалось собрать интересную программу.
Мой личный топ докладов, которые хотелось бы послушать:
🔘Про защиту видеоконтента
🔘Про passkeys, так как прямо сейчас мы имплементируем это у себя
🔘Про то, как работает защита Play Integrity
🔘Про reverse engineering на практике от моего коллеги
И в связи с этим хочу провести розыгрыш билета.
Условия розыгрыша
💬 Вам нужно написать комментарий под этим постом на тему безопасности мобильных приложений. Можно рассказать про самый интересный баг в безопасности, с которым вы сталкивались, или, наоборот, поделиться опытом, как вы реализовали какое-то безопасное решение.
Итоги розыгрыша
🗓 Победителя выберу случайным образом уже в эту субботу в 10:00 МСК. Удачи!
P.S. Ну а для тех, кто не хочет участвовать в розыгрыше, могу предложить скидку по промокоду adept15 | 0 |
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
