Сегодня хочется поделиться видео записями выступлений на тему мобильной мультиплатформы с прошедшего Kotlin/Everywhere Minsk.
Интересное:
* Reaktive: реактивное программирование в Kotlin Multiplatform - про перенос Rx в мультиплатформу, с поддержкой смены потоков, разбор от авторов библиотеки (уже было чуть раньше в постах);
* Sliced but whole. A little adventure in multiplatform world - не сильно успешный опыт использования mpp, стоит и такие кейсы знать. Подсвечивает проблемы адаптации людей с градлом, разобран и фронтенд веб с kotlin2js, интероп Firebase ios фреймворка с kotlin/native. Итог от спикера - "не для продакшена". Если рассматривать мобильную разработку - по нашему опыту для продакшена уже полгода как готово :)
* iOS & Kotlin. Путь приложения от начала до публикации в AppStore - взгляд айосника на разработку с kotlin mpp, в кейсе когда айосник единственный разраб на проекте и андроид платформы пока еще нет;
* Kotlin Multiplatform с точки зрения бизнеса - тут понятно из названия. Минимум технической инфы, максимум мнения бизнеса (аутсорс) на технологию и опыт использования.
https://www.youtube.com/playlist?list=PL0SwNXKJbuNmNzTBowoiL7tem0-1gOsmo
#videos
Интересное:
* Reaktive: реактивное программирование в Kotlin Multiplatform - про перенос Rx в мультиплатформу, с поддержкой смены потоков, разбор от авторов библиотеки (уже было чуть раньше в постах);
* Sliced but whole. A little adventure in multiplatform world - не сильно успешный опыт использования mpp, стоит и такие кейсы знать. Подсвечивает проблемы адаптации людей с градлом, разобран и фронтенд веб с kotlin2js, интероп Firebase ios фреймворка с kotlin/native. Итог от спикера - "не для продакшена". Если рассматривать мобильную разработку - по нашему опыту для продакшена уже полгода как готово :)
* iOS & Kotlin. Путь приложения от начала до публикации в AppStore - взгляд айосника на разработку с kotlin mpp, в кейсе когда айосник единственный разраб на проекте и андроид платформы пока еще нет;
* Kotlin Multiplatform с точки зрения бизнеса - тут понятно из названия. Минимум технической инфы, максимум мнения бизнеса (аутсорс) на технологию и опыт использования.
https://www.youtube.com/playlist?list=PL0SwNXKJbuNmNzTBowoiL7tem0-1gOsmo
#videos
Затронем важную часть разработки, которая совсем не видна пользователям, но очень нужна разрабам - логирование. В мобильной мультиплатформе есть небольшой выбор библиотек:
* https://github.com/JakeWharton/timber - стандарт в Android разработке. Мультиплатформенная версия начата, но так и не закончена. Есть форк от Touchlab где доделана и айос версия (https://github.com/touchlab/timber/tree/native), но в bintray нет сборки с актуального котлина (можно просто скачать себе исходники и собрать самому себе в мавен репозиторий);
* https://github.com/AAkira/Napier - библиотека вдохновленная Timber'ом - поддержка обеих мобильных платформ из коробки, api примерно такое же как и у Timber. Так же возможно добавлять свои логгеры (зовутся Antilog). Поддерживает актуальнную версию kotlin;
* https://github.com/korlibs/klogger - мультиплатформенный логгер, без поддержки множества output'ов (как сделано у Timber и Napier) и пока без апдейта до актуального 1.3.50;
* https://github.com/florent37/Multiplatform-Log - самый простейший логгер, так же без поддержки множества output'ов. До актуальной версии kotlin так и не обновлено.
Если подвести краткий вывод - в MPP для логирования брать нужно Napier. Почти тот же Timber, но для всех платформ и не требуется самим пересобирать на новую версию котлина.
#libs
* https://github.com/JakeWharton/timber - стандарт в Android разработке. Мультиплатформенная версия начата, но так и не закончена. Есть форк от Touchlab где доделана и айос версия (https://github.com/touchlab/timber/tree/native), но в bintray нет сборки с актуального котлина (можно просто скачать себе исходники и собрать самому себе в мавен репозиторий);
* https://github.com/AAkira/Napier - библиотека вдохновленная Timber'ом - поддержка обеих мобильных платформ из коробки, api примерно такое же как и у Timber. Так же возможно добавлять свои логгеры (зовутся Antilog). Поддерживает актуальнную версию kotlin;
* https://github.com/korlibs/klogger - мультиплатформенный логгер, без поддержки множества output'ов (как сделано у Timber и Napier) и пока без апдейта до актуального 1.3.50;
* https://github.com/florent37/Multiplatform-Log - самый простейший логгер, так же без поддержки множества output'ов. До актуальной версии kotlin так и не обновлено.
Если подвести краткий вывод - в MPP для логирования брать нужно Napier. Почти тот же Timber, но для всех платформ и не требуется самим пересобирать на новую версию котлина.
#libs
GitHub
GitHub - JakeWharton/timber: A logger with a small, extensible API which provides utility on top of Android's normal Log class.
A logger with a small, extensible API which provides utility on top of Android's normal Log class. - JakeWharton/timber
Обратим внимание на еще один важный для разработки момент - Continuous Integration. Уже нельзя представить современный проект без CI, который как минимум должен автоматизировать деплой билдов, а в идеале - проводить и тестирование и проверку кода на правила разработки.
Что же меняется на CI относительно чисто нативных iOS и Android проектов, если мы начинаем использовать общую библиотеку на Kotlin MultiPlatform?
Ответ - практически ничего. Для android все остается также как было. Для iOS могут потребоваться некоторые изменения. Обратим внимание на них:
1. На раннере собирающем iOS должна быть java для корректного запуска gradle и компиляции kotlin/native;
2. При интеграции общей библиотеки через cocoapods перед вызовом pod install должен быть собран фреймворк (в официальном cocoapods плагине перед pod install нужно вызвать у gradle задачу podspec, а если использовать наш mobile-multiplatform плагин как в moko-template - можно просто вызывать pod install и все сделается само);
3. При интеграции общей библиотеки через билдфазу с отдельным таргетом в самом проекте - билдфаза сама запустит градл и все что нужно сделает, без необходимости делать что-то предварительно;
4. Для запуска тестов на айос пока требуется добавлять отдельную градл таску в конфигурацию общей библиотеки. Таска соберет запускаемый файл тестов и запустит его на симуляторе iOS.
У нас, в IceRock, для CI используется GitLab CI, раннер это mac-mini на котором и xcode и android sdk установлены, сборка android проекта делается полностью средствами градла, а сборка айос полностью средствами Fastlane.
Так же по этой теме есть неплохая статья https://diamantidis.github.io/2019/09/08/continuous-integration-for-kotlin-native-projects-with-gitlab-ci, в которой разобрана вся настройка CI для GitLab под проект с общей библиотекой, включая и запуск тестов и прогон lint. Статья входит в цикл статей про MPP - там есть и про настройку окружения, и про настройку юнит тестов, и про инструменты проверки кода. Есть и проект пример с этим всем https://gitlab.com/diamantidis_io/kmp_template/tree/master
Упомянуто:
https://kotlinlang.org/docs/reference/native/cocoapods.html - официальный gradle плагин cocoapods
https://github.com/icerockdev/mobile-multiplatform-gradle-plugin - gradle плагин для упрощения настройки mobile mpp проектов
https://github.com/icerockdev/moko-template - проект шаблон с использованием mobile-multiplatform плагина (примеры фичей и ридми пока в процессе)
#posts #tips
Что же меняется на CI относительно чисто нативных iOS и Android проектов, если мы начинаем использовать общую библиотеку на Kotlin MultiPlatform?
Ответ - практически ничего. Для android все остается также как было. Для iOS могут потребоваться некоторые изменения. Обратим внимание на них:
1. На раннере собирающем iOS должна быть java для корректного запуска gradle и компиляции kotlin/native;
2. При интеграции общей библиотеки через cocoapods перед вызовом pod install должен быть собран фреймворк (в официальном cocoapods плагине перед pod install нужно вызвать у gradle задачу podspec, а если использовать наш mobile-multiplatform плагин как в moko-template - можно просто вызывать pod install и все сделается само);
3. При интеграции общей библиотеки через билдфазу с отдельным таргетом в самом проекте - билдфаза сама запустит градл и все что нужно сделает, без необходимости делать что-то предварительно;
4. Для запуска тестов на айос пока требуется добавлять отдельную градл таску в конфигурацию общей библиотеки. Таска соберет запускаемый файл тестов и запустит его на симуляторе iOS.
У нас, в IceRock, для CI используется GitLab CI, раннер это mac-mini на котором и xcode и android sdk установлены, сборка android проекта делается полностью средствами градла, а сборка айос полностью средствами Fastlane.
Так же по этой теме есть неплохая статья https://diamantidis.github.io/2019/09/08/continuous-integration-for-kotlin-native-projects-with-gitlab-ci, в которой разобрана вся настройка CI для GitLab под проект с общей библиотекой, включая и запуск тестов и прогон lint. Статья входит в цикл статей про MPP - там есть и про настройку окружения, и про настройку юнит тестов, и про инструменты проверки кода. Есть и проект пример с этим всем https://gitlab.com/diamantidis_io/kmp_template/tree/master
Упомянуто:
https://kotlinlang.org/docs/reference/native/cocoapods.html - официальный gradle плагин cocoapods
https://github.com/icerockdev/mobile-multiplatform-gradle-plugin - gradle плагин для упрощения настройки mobile mpp проектов
https://github.com/icerockdev/moko-template - проект шаблон с использованием mobile-multiplatform плагина (примеры фичей и ридми пока в процессе)
#posts #tips
Ioannis Diamantidis
Continuous Integration for Kotlin Native projects with Gitlab CI
A post to document how to setup a GitLab CI pipeline that will run the code styling and unit test jobs for a Kotlin Native project that contains an iOS app, an Android app and a shared library.
При разговоре о мультиплатформенной разработке iOS разработчики обычно предполагают что это означает отказ от привычных им библиотек. В контексте Kotlin Multiplatform хочется развеять это заблуждение...
* Первый момент (и самый очевидный) - так как UI делается все так же в Swift, то разработчику доступны все нативные библиотеки как через CocoaPods так и Carthage;
* Второе - внутри самой общей библиотеки на Kotlin в ios-specific части тоже можно использовать зависимости из нативного мира - ограничение только в том что библиотека должна иметь objc биндинг (так как Kotlin/Native взаимодействует именно с objc). Вручную это делается через cinterop;
* Третье - для упрощения подключения iOS библиотек к kotlin ios-specific gradle плагин org.jetbrains.kotlin.native.cocoapods позволяет прям в gradle указать список pod'ов которые будут автоматически проброшены в kotlin. И в ios-specific части можно работать с подключенными библиотеками. У плагина есть пара ограничений (нет поддержки SubSpec и собирать библиотеку нужно будет обязательно через Xcode, так как для линковки все данные о подключенных Pod'ах именно у Xcode).
Документация по плагину - https://github.com/JetBrains/kotlin-native/blob/master/COCOAPODS.md
Ручное подключение библиотеки, без плагина - https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#cinterop-support
#tips
* Первый момент (и самый очевидный) - так как UI делается все так же в Swift, то разработчику доступны все нативные библиотеки как через CocoaPods так и Carthage;
* Второе - внутри самой общей библиотеки на Kotlin в ios-specific части тоже можно использовать зависимости из нативного мира - ограничение только в том что библиотека должна иметь objc биндинг (так как Kotlin/Native взаимодействует именно с objc). Вручную это делается через cinterop;
* Третье - для упрощения подключения iOS библиотек к kotlin ios-specific gradle плагин org.jetbrains.kotlin.native.cocoapods позволяет прям в gradle указать список pod'ов которые будут автоматически проброшены в kotlin. И в ios-specific части можно работать с подключенными библиотеками. У плагина есть пара ограничений (нет поддержки SubSpec и собирать библиотеку нужно будет обязательно через Xcode, так как для линковки все данные о подключенных Pod'ах именно у Xcode).
Документация по плагину - https://github.com/JetBrains/kotlin-native/blob/master/COCOAPODS.md
Ручное подключение библиотеки, без плагина - https://kotlinlang.org/docs/reference/building-mpp-with-gradle.html#cinterop-support
#tips
Forwarded from Nikolay
Небольшое дополнение - можно взаимодействовать и с библиотеками написанными на Си, а также возможно работать и в другую сторону, экспортируя Котлин в виде Objective-C или C деклараций.
Наконец-то опубликованы видео с прошедшего DroidCon New York, на котором было очень много внимания уделено именно Kotlin Multiplatform в мобильной разработке. Что есть:
* Native Concurrency and Coroutines - от автора библиотеки CoroutineWorker , которая позволяет выполнять suspend функции на отдельных потоках - как появилась библиотека и как используется в Autodesk;
* Multiplatform Library Development - от автора библиотеки multiplatform-settings - про разработку mpp библиотеки, про проектирование апи под обе платформы, про состояние kotlin mpp на данный момент;
* Lessons Learned from Using Kotlin Multiplatform internally - опыт погружения андроид и айос специалистов в мультиплатформу, какие шишки набивали, какие выводы сделали, фидбек айосников;
* Effective Multiplatform Architecture - очень классная презентация с полезными аргументами как продать мпп бизнесу, так и для технарей с полезными идеями как вводить мультиплатформу в существующий проект;
* Multiplatform Functional Architecture - про архитектуру MVU (Model-View-Update) на мультиплатформе. Библиотека oolong поможет строить такую архитектуру. Для любителей Redux;
* SwiftUI meets Kotlin Multiplatform! - небольшой доклад про то как дружили общую библиотеку и SwiftUI. Для этого предложено и ViewModel'и унести на сторону нативного android, ios кода;
* Using Kotlin/JS and Kotlin/Native on Android - доклад от Jake Wharton о том как на андроиде он дружил обычный котлин, нативный котлин и kotlin js в одном приложении;
* Building apps using Kotlin Native - расказ про разработку общей библиотеки, для новичков в теме. Даже задета тема про Worker'ы для многопоточности на Native.
#videos
* Native Concurrency and Coroutines - от автора библиотеки CoroutineWorker , которая позволяет выполнять suspend функции на отдельных потоках - как появилась библиотека и как используется в Autodesk;
* Multiplatform Library Development - от автора библиотеки multiplatform-settings - про разработку mpp библиотеки, про проектирование апи под обе платформы, про состояние kotlin mpp на данный момент;
* Lessons Learned from Using Kotlin Multiplatform internally - опыт погружения андроид и айос специалистов в мультиплатформу, какие шишки набивали, какие выводы сделали, фидбек айосников;
* Effective Multiplatform Architecture - очень классная презентация с полезными аргументами как продать мпп бизнесу, так и для технарей с полезными идеями как вводить мультиплатформу в существующий проект;
* Multiplatform Functional Architecture - про архитектуру MVU (Model-View-Update) на мультиплатформе. Библиотека oolong поможет строить такую архитектуру. Для любителей Redux;
* SwiftUI meets Kotlin Multiplatform! - небольшой доклад про то как дружили общую библиотеку и SwiftUI. Для этого предложено и ViewModel'и унести на сторону нативного android, ios кода;
* Using Kotlin/JS and Kotlin/Native on Android - доклад от Jake Wharton о том как на андроиде он дружил обычный котлин, нативный котлин и kotlin js в одном приложении;
* Building apps using Kotlin Native - расказ про разработку общей библиотеки, для новичков в теме. Даже задета тема про Worker'ы для многопоточности на Native.
#videos
Сегодня поделюсь статьей, которую возможно уже видели в сети, но она имеет очень интересную информацию. Статья про разработку библиотеки kissme - не про поцелуи, а про хранение данных в keychain. Помимо просто истории о разработке multiplatform библиотеки и столкновением с некоторыми ограничениями, тут есть то что не часто встретишь - линковка objective-c библиотеки в kotlin код. У ребят как раз был кейс, что не смогли через kotlin ios-specific код сделать нужную функциональность и поэтому решили сделать дополнительно objective-c библиотеку, которую прилинковали к котлину через cinterop и в итоге вызывали из котлина функции своей библиотеки.
Kissme: Kotlin Secure Storage Multiplatform library. The Code Story.
#posts #libs
Kissme: Kotlin Secure Storage Multiplatform library. The Code Story.
#posts #libs
GitHub
GitHub - netguru/Kissme: Kissme: Kotlin Secure Storage Multiplatform
Kissme: Kotlin Secure Storage Multiplatform. Contribute to netguru/Kissme development by creating an account on GitHub.
Сегодня у нас пост новостей от JetBrains.
Kotlin/Native в следующем релизе получит:
* поддержка Xcode 11
* новый LLVM
* новые API iOS, macOS
* поддержка watchOS и tvOS.
Подробнее тут - https://github.com/JetBrains/kotlin-native/pull/3391
Попробовать можно будет уже скоро - EAP планируется в ближайшие недели.
Так же вы можете задать вопросы про новый релиз напрямую авторам в нашем чатике - нажимайте Discuss и обращайтесь - Николай Иготти уже там (новость как раз от него).
#news
Kotlin/Native в следующем релизе получит:
* поддержка Xcode 11
* новый LLVM
* новые API iOS, macOS
* поддержка watchOS и tvOS.
Подробнее тут - https://github.com/JetBrains/kotlin-native/pull/3391
Попробовать можно будет уже скоро - EAP планируется в ближайшие недели.
Так же вы можете задать вопросы про новый релиз напрямую авторам в нашем чатике - нажимайте Discuss и обращайтесь - Николай Иготти уже там (новость как раз от него).
#news
Ioannis Diamantidis продолжает свою серию статей о Kotlin/Native. Новая статья From Kotlin to Native: Or how Kotlin concepts are mapped to the Apple framework разбирает некоторые особенности получаемого из Kotlin кода iOS фреймворка - как Kotlin код выглядит из ObjectiveC и Swift.
Это не полный список особенностей на стыке Kotlin и ObjC, но знать их очень полезно. Так же еще особенности можно подсмотреть в нашей летней статье - Опыт работы с Kotlin Multiplatform за 10 месяцев. Краткий список особенностей kotlin на стыке с ios доступен в презентации.
Так же в октябре на AppsConf мы отметим еще несколько новых особенностей по актуальной версии Kotlin.
#posts #slides
Это не полный список особенностей на стыке Kotlin и ObjC, но знать их очень полезно. Так же еще особенности можно подсмотреть в нашей летней статье - Опыт работы с Kotlin Multiplatform за 10 месяцев. Краткий список особенностей kotlin на стыке с ios доступен в презентации.
Так же в октябре на AppsConf мы отметим еще несколько новых особенностей по актуальной версии Kotlin.
#posts #slides
Ioannis Diamantidis
From Kotlin to Native: Or how Kotlin concepts are mapped to the Apple framework
TL;DR This post is about how some specific Kotlin features are compiled to Objective-C and how they can be used in a Swift project when using Kotlin Native to build an Apple framework.
Можно ли работать с базой данных из common кода под ios и android? Ответ - конечно можно :) И есть несколько путей:
1. Метод "в лоб" - делаем interface реализация которого будет проброшена с нативной стороны и на android и ios делаем отдельные реализации БД так, как привыкли разработчики;
2. Делаем expect/actual классы, чтобы уже внутри котлина реализовать всю работу с БД, используя нативные средства Android и iOS в actual реализациях;
3. Используем библиотеку SQLiter которая позволяет в common коде работать с sqlite БД напрямую, без каких либо оберток;
4. Используем библиотеку SQLDelight от известных square (которые успели переименоваться в cashapp). Данная библиотека идет в паре с gradle plugin'ом который из специального файла, в котором описана схема базы данных и запросы, которые планируется выполнять, генерирует сущности и методы для выполнения запросов. И все это доступно из common кода для обеих мобильных платформ, а так же уже проверено на Android годами ранее.
Рекомендуемый на данный момент способ это конечно SQLDelight. Для знакомства с ним можно воспользоваться:
* Презентацией SELECT * SQLDelight JOIN Multiplatform в которой разобраны преимущества библиотеки;
* Статьей SQLDelight 1.x Quick Start Guide for Android с пошаговой инструкцией и даже примером юниттестирования;
* Статьей Kotlin Multiplatform. Very beginner’s guide (part 3) Database с пошаговым примером реализации БД, но статья со времен kotlin 1.3.31, так что возможны некоторые нестыковки, особенно по версиям библиотек используемых - с 1.3.50 на айос не сойдутся они, нужно более новые;
* Проектом Droidcon Lisbon - здесь в app есть common source set и используется SQLDelight с версией kotlin 1.3.41;
* Проектом Newsout тоже на версии kotlin 1.3.41.
А еще SQLDelight поддерживает Flow для оповещения о изменениях, но на iOS там есть проблемы, требующие обхода.
#libs #slides #projects
1. Метод "в лоб" - делаем interface реализация которого будет проброшена с нативной стороны и на android и ios делаем отдельные реализации БД так, как привыкли разработчики;
2. Делаем expect/actual классы, чтобы уже внутри котлина реализовать всю работу с БД, используя нативные средства Android и iOS в actual реализациях;
3. Используем библиотеку SQLiter которая позволяет в common коде работать с sqlite БД напрямую, без каких либо оберток;
4. Используем библиотеку SQLDelight от известных square (которые успели переименоваться в cashapp). Данная библиотека идет в паре с gradle plugin'ом который из специального файла, в котором описана схема базы данных и запросы, которые планируется выполнять, генерирует сущности и методы для выполнения запросов. И все это доступно из common кода для обеих мобильных платформ, а так же уже проверено на Android годами ранее.
Рекомендуемый на данный момент способ это конечно SQLDelight. Для знакомства с ним можно воспользоваться:
* Презентацией SELECT * SQLDelight JOIN Multiplatform в которой разобраны преимущества библиотеки;
* Статьей SQLDelight 1.x Quick Start Guide for Android с пошаговой инструкцией и даже примером юниттестирования;
* Статьей Kotlin Multiplatform. Very beginner’s guide (part 3) Database с пошаговым примером реализации БД, но статья со времен kotlin 1.3.31, так что возможны некоторые нестыковки, особенно по версиям библиотек используемых - с 1.3.50 на айос не сойдутся они, нужно более новые;
* Проектом Droidcon Lisbon - здесь в app есть common source set и используется SQLDelight с версией kotlin 1.3.41;
* Проектом Newsout тоже на версии kotlin 1.3.41.
А еще SQLDelight поддерживает Flow для оповещения о изменениях, но на iOS там есть проблемы, требующие обхода.
#libs #slides #projects
Тем кто интересуется темой тестирования кода будет полезна статья Shared Library in Kotlin Multiplatform в которой разобрано по шагам создание общей библиотеки и добавление к ней простых тестов.
В паре с статьей идет и проект-пример, в котором можно наглядно посмотреть и тесты и демо приложение, работающее с сетью (ktor-client, kotlinx.serialization, coroutines - стандартный mpp набор).
Еще примеры тестов можно посмотреть в проекте-примере от russwolf (автор multiplatform-settings) и в еще одном проекте примере.
#posts #samples #tests
В паре с статьей идет и проект-пример, в котором можно наглядно посмотреть и тесты и демо приложение, работающее с сетью (ktor-client, kotlinx.serialization, coroutines - стандартный mpp набор).
Еще примеры тестов можно посмотреть в проекте-примере от russwolf (автор multiplatform-settings) и в еще одном проекте примере.
#posts #samples #tests
Karumi Blog
Shared Library in Kotlin Multiplatform
Explaining our experience with the shared library in Kotlin Multiplatform.
Badoo продолжает радовать контентом по Kotlin Multiplatform. В этот раз подготовили хоршую подробную статью по настройке автосборки для мультиплатформенной библиотеки - Continuous delivery для вашей Kotlin Multiplatform библиотеки. Стоит ознакомиться со статьей даже тем, кто не собирается настраивать CI/CD, так как помимо конфигурации для автоматической сборки и выгрузки в maven репозиторий через Travis CI всех таргетов библиотеки, там описано и строение публикуемых данных - особенно интересно про Gradle Metadata, что так активно используется Kotlin Multiplatform проектами. Всем бы авторам MPP библиотек настроить автоматизацию на github по примеру ребят, чтобы апдейты к библиотекам выходили как можно быстрее, после релиза новой версии котлина.
#posts #libs
#posts #libs
Хабр
Continuous delivery для вашей Kotlin Multiplatform библиотеки
Привет! Меня зовут Юрий Влад, я Android-разработчик в компании Badoo и принимаю участие в создании библиотеки Reaktive — Reactive Extensions на чистом Kotlin. В...
А для тех кто уже успел ознакомиться со статьей от Badoo, есть интересная библиотека - реактивщину в kotlin multiplatform оказывается несут не только Badoo, но и Mirego. И их реализация зовется Trikot.streams. Эта библиотека так же позволяет делать реактивные цепочки с переключением потоков на обеих мобильных платформах (на native так же как Reaktive данные замораживаются для передачи между потоками), но от привычного Rx API библиотеки отличается.
Примеры использования trikot.streams выглядят очень похожими на LiveData, как в moko-mvvm, при чем так же есть конвертация stream в LiveData для android, а для iOS сделан дополнительный cocoapod с вспомогательными swift методами привязки stream к элементам на экране (как и в moko-mvvm).
#libs
Примеры использования trikot.streams выглядят очень похожими на LiveData, как в moko-mvvm, при чем так же есть конвертация stream в LiveData для android, а для iOS сделан дополнительный cocoapod с вспомогательными swift методами привязки stream к элементам на экране (как и в moko-mvvm).
#libs
GitHub
GitHub - mirego/trikot.streams: Reactive Streams for Kotlin Multiplatform with mutability checks
Reactive Streams for Kotlin Multiplatform with mutability checks - GitHub - mirego/trikot.streams: Reactive Streams for Kotlin Multiplatform with mutability checks
Те кто ознакомился с проектом-примером от Karumi, который был в посте со статьей о тестировании, могли заметить что в gradle конфигурации общей библиотеки есть специальная gradle таска, которая генерирует на основе содержимого gradle.properties класс KotlinConfig, по аналогии BuildConfig в android. Эта функциональность далее была выделена в отдельный gradle-plugin который назвали Hagu. Благодаря ему можно вынести различную конфигурацию из кода в gradle.properties файл и иметь единое место для конфигурации. Но в отличие от android в mpp пока нет поддержки buildFlavor, поэтому для конфигурирования разных окружений (dev,prod,stage) это не особо подходит. Зато подходит для подключения разных buildSecret из переменных окружения CI в сборку (чтобы не хранить секреты в самом гите, особенно важно для опенсорс проектов).
#plugins
#plugins
GitHub
GitHub - Karumi/KotlinMultiplatformApp: Application example using Kotlin multiplatform
Application example using Kotlin multiplatform. Contribute to Karumi/KotlinMultiplatformApp development by creating an account on GitHub.
В одном из прошлых постов были разобраны возможные варианты по работе с датой и временем в common коде. Среди всех библиотек особо выделялась библиотека klock, так как имела практически весь нужный в мобильной разработке функционал. Сегодня хочется упомянуть другую библиотеку работы с датой/временем - fluid-time. Она так же поддерживает kotlin 1.3.50 и android (jvm), ios платформы. В ней есть работа с датами, временем, таймзонами, интеграция с kotlinx.serialization из коробки, timestamp. Но чего в ней нет, так это хорошей документации. Поэтому знакомиться с библиотекой и ее API надо через код.
Тем же кто решит заглянуть в gradle конфигурацию библиотеки для упрощения разбора следует сразу ознакомиться с gradle-plugin'ом, который был сделан автором библиотеки специально для поддержки всех своих библиотек.
Так же у автора есть fluid-stdlib - дополнения к kotlin-stdlib в котором есть вынесение в общий код Currency, Country (с использованием на платформах системных инструментов) и множество разных дополнений к типам данных. Опять же документация скудная, смотрите код.
#libs
Тем же кто решит заглянуть в gradle конфигурацию библиотеки для упрощения разбора следует сразу ознакомиться с gradle-plugin'ом, который был сделан автором библиотеки специально для поддержки всех своих библиотек.
Так же у автора есть fluid-stdlib - дополнения к kotlin-stdlib в котором есть вынесение в общий код Currency, Country (с использованием на платформах системных инструментов) и множество разных дополнений к типам данных. Опять же документация скудная, смотрите код.
#libs
Для тех кто пользуется REST API и имеет в проектах OpenAPI (Swagger) спецификацию (надеюсь проектов без серверной спецификации уже все таки нет) в проекте OpenAPIGenerator появилась поддержка генерации kotlin-multiplatform API. На днях вышел релиз, в котором данное изменение уже присутствует.
Генерируется api завязанное на ktor-client, coroutines, KotlinxSerializer (фича ktor-client). Наружу результат запроса выдается в виде HttpResponse из ktor, то есть снаружи можно без проблем обрабатывать любой статус-код.
Мы в IceRock пока не проверяли этот генератор, так как уже полгода пользуемся своим, который наконец-то выгрузили в опенсорс - moko-network. Он основан на более старой версии OpenAPIGenerator'а, но проверен уже несколькими боевыми проектами. Поддерживаются и сериализация enum'ов с разными имя-значение (что из коробки kotlinx.serialization не умеет, но в OpenAPIGenerator'е это реализовано аналогично как у нас), а так же сериализация делается не через фичу KotlinxSerializer чтобы напрямую каждому запросу указывать конкретный сериализатор, это избавляет от проблемы "только один list сериализатор на всю api". В ридми пока не заполнен блок использования, но можно посмотреть по проекту-примеру.
Те кто попробует официальную версию из OpenAPIGenerator'а - прошу напишите свой фидбек использования нам в чат (кнопка discuss). А если и с нашим плагином сравнить удастся - такой фидбек будет еще полезнее.
#plugins
Генерируется api завязанное на ktor-client, coroutines, KotlinxSerializer (фича ktor-client). Наружу результат запроса выдается в виде HttpResponse из ktor, то есть снаружи можно без проблем обрабатывать любой статус-код.
Мы в IceRock пока не проверяли этот генератор, так как уже полгода пользуемся своим, который наконец-то выгрузили в опенсорс - moko-network. Он основан на более старой версии OpenAPIGenerator'а, но проверен уже несколькими боевыми проектами. Поддерживаются и сериализация enum'ов с разными имя-значение (что из коробки kotlinx.serialization не умеет, но в OpenAPIGenerator'е это реализовано аналогично как у нас), а так же сериализация делается не через фичу KotlinxSerializer чтобы напрямую каждому запросу указывать конкретный сериализатор, это избавляет от проблемы "только один list сериализатор на всю api". В ридми пока не заполнен блок использования, но можно посмотреть по проекту-примеру.
Те кто попробует официальную версию из OpenAPIGenerator'а - прошу напишите свой фидбек использования нам в чат (кнопка discuss). А если и с нашим плагином сравнить удастся - такой фидбек будет еще полезнее.
#plugins
GitHub
Kotlin multiplatform client by andrewemery · Pull Request #3900 · OpenAPITools/openapi-generator
Support for the generation of Kotlin Multiplatform clients.
Background
The kotlin language defined in the Swagger Codegen project currently generates a Kotlin client that can run on the JVM. Somewh...
Background
The kotlin language defined in the Swagger Codegen project currently generates a Kotlin client that can run on the JVM. Somewh...
Разработка приложений с общим кодом на обе платформы не нова, и среди популярных решений есть сейчас React Native (от которого некоторые большие компании начинают уходить), Flutter (к которому многие идут) и Kotlin Multiplatform (про который наш канал). И периодически слышен вопрос от некоторых разработчиков: вот на kotlin можно написать общую логику, но нельзя писать UI (точнее неудобно), а можно ли совместить общую логику на kotlin и общий UI на Flutter?
Ответ: да, можно. И это даже делали...На эту тему есть пара статей - Fast Prototypes with Flutter + Kotlin/Native (русский перевод) и Приложение для iOS и Android на Kotlin + Flutter UI. При чем у второй статьи есть и открытый код, а сама статья это пошаговая инструкция как сделать так же самому (первая же статья больше про сам принцип и немного про ограничения этого симбиоза).
Если задуматься над вопросом "а зачем?" то мысли есть такие:
1. Для разработки прототипа одним человеком (особенно если сделать автоматическую генерацию каналов для связи kotlin и flutter между собой) - нам нужен человек который и общую логику на kotlin напишет и ui сразу на обе платформы сделает, при чем с hot reload и действительно быстрой разработкой визуала;
2. Для дальнейшего развития этого прототипа в большое замудреное приложение, напичканное разными нативными штуками типа фоновых сервисов, интеграций разных экстеншенов и прочих платформенных штук. С заменой UI на нативный, привычный всем пользователям. То есть достигаем как можно быстрее состояния MVP для проверки гипотезы, а если ее ждет успех - тогда уже вкладываем ресурсы в нативную разработку (не выкидывая общую бизнеслогику написанную на kotlin).
Возможно и у вас есть свое мнение по поводу вопроса "зачем соединять flutter и kotlin mpp?" - заходите в чат и поделитесь.
#posts #cases
Ответ: да, можно. И это даже делали...На эту тему есть пара статей - Fast Prototypes with Flutter + Kotlin/Native (русский перевод) и Приложение для iOS и Android на Kotlin + Flutter UI. При чем у второй статьи есть и открытый код, а сама статья это пошаговая инструкция как сделать так же самому (первая же статья больше про сам принцип и немного про ограничения этого симбиоза).
Если задуматься над вопросом "а зачем?" то мысли есть такие:
1. Для разработки прототипа одним человеком (особенно если сделать автоматическую генерацию каналов для связи kotlin и flutter между собой) - нам нужен человек который и общую логику на kotlin напишет и ui сразу на обе платформы сделает, при чем с hot reload и действительно быстрой разработкой визуала;
2. Для дальнейшего развития этого прототипа в большое замудреное приложение, напичканное разными нативными штуками типа фоновых сервисов, интеграций разных экстеншенов и прочих платформенных штук. С заменой UI на нативный, привычный всем пользователям. То есть достигаем как можно быстрее состояния MVP для проверки гипотезы, а если ее ждет успех - тогда уже вкладываем ресурсы в нативную разработку (не выкидывая общую бизнеслогику написанную на kotlin).
Возможно и у вас есть свое мнение по поводу вопроса "зачем соединять flutter и kotlin mpp?" - заходите в чат и поделитесь.
#posts #cases
Medium
Sunsetting React Native
Due to a variety of technical and organizational issues, we will be sunsetting React Native and putting all of our efforts into making…
В очередной раз пост о Reaktive. Сегодня он особенный, так как библиотека получила первый релиз, а значит Rx в общем коде доступен и стабилен.
А в добавку к релизу у библиотеки появились новые дополнения:
1. интероп с rxjava2/3 - для тех кто постепенно переносит android приложение в общий код и имеет в самом приложении rxjava - будет проще цепляться к общему коду, который на Reaktive;
2. интероп с coroutines - тут уже не только с android миром, но и с другими multiplatform библиотеками можно взаимодействовать. Например сделать запросы через ktor-client с Reaktive, скрывая стандартные coroutines внутри.
Badoo одни из немногих в русском сегменте, кто развивает поддержку kotlin multiplatform в мобильной разработке. Спасибо ребятам :)
#libs
А в добавку к релизу у библиотеки появились новые дополнения:
1. интероп с rxjava2/3 - для тех кто постепенно переносит android приложение в общий код и имеет в самом приложении rxjava - будет проще цепляться к общему коду, который на Reaktive;
2. интероп с coroutines - тут уже не только с android миром, но и с другими multiplatform библиотеками можно взаимодействовать. Например сделать запросы через ktor-client с Reaktive, скрывая стандартные coroutines внутри.
Badoo одни из немногих в русском сегменте, кто развивает поддержку kotlin multiplatform в мобильной разработке. Спасибо ребятам :)
#libs
GitHub
GitHub - badoo/Reaktive: Kotlin multi-platform implementation of Reactive Extensions
Kotlin multi-platform implementation of Reactive Extensions - badoo/Reaktive
Уже пошла подготовка новой версии котлина к релизу - kotlin 1.3.60 EAP 1 уже доступен.
Общий список изменений большей частью содержит множество багфиксов, заметна большая работа над стабилизацией. В IDE улучшена поддержка gradle-kts (более быстрые подсказки, ура). Но самое интересное для мобильной мультиплатформенной разработки вынесено в отдельный список изменений (kotlin/native changelist) и тут видно сильно больше работы над развитием, чем стабилизацией:
* Добавлена поддержка Xcode 11 (это не означает что в kotlin 1.3.50 нельзя с xcode 11 работать, а значит что что все новые API выпущенные apple в Xcode 11 теперь доступны из kotlin);
* Добавлены новые таргеты - watchos, tvos, native android. Уже можно брать и пробовать шарить kotlin код по часам и андроида и айоса, по тв приставкам обеих платформ, и даже делать native библиотеки для андроида тоже на котлине, чтобы например достучаться напрямую до какой нибудь C библиотеки которую хочется подцепить в приложение;
* Улучшена производительность в некоторых кейсах (от 5 до 50 раз ускорения);
* Улучшена скорость сборки больших многомодульных проектов;
* Исправлена ошибка подсчета ссылок на стыке kotlin и swift при многопоточном выполнении;
* Исправлена ошибка приводящая к крешам на ios arm64.
Те кто пробуют поддержку новых таргетов - отпишите свое мнение в чат. А мы в скором времени поделимся своим фидбеком от работы с watchos из kotlin/native, там же в чате.
#news
Общий список изменений большей частью содержит множество багфиксов, заметна большая работа над стабилизацией. В IDE улучшена поддержка gradle-kts (более быстрые подсказки, ура). Но самое интересное для мобильной мультиплатформенной разработки вынесено в отдельный список изменений (kotlin/native changelist) и тут видно сильно больше работы над развитием, чем стабилизацией:
* Добавлена поддержка Xcode 11 (это не означает что в kotlin 1.3.50 нельзя с xcode 11 работать, а значит что что все новые API выпущенные apple в Xcode 11 теперь доступны из kotlin);
* Добавлены новые таргеты - watchos, tvos, native android. Уже можно брать и пробовать шарить kotlin код по часам и андроида и айоса, по тв приставкам обеих платформ, и даже делать native библиотеки для андроида тоже на котлине, чтобы например достучаться напрямую до какой нибудь C библиотеки которую хочется подцепить в приложение;
* Улучшена производительность в некоторых кейсах (от 5 до 50 раз ускорения);
* Улучшена скорость сборки больших многомодульных проектов;
* Исправлена ошибка подсчета ссылок на стыке kotlin и swift при многопоточном выполнении;
* Исправлена ошибка приводящая к крешам на ios arm64.
Те кто пробуют поддержку новых таргетов - отпишите свое мнение в чат. А мы в скором времени поделимся своим фидбеком от работы с watchos из kotlin/native, там же в чате.
#news
GitHub
Release Kotlin 1.3.60 EAP 1 · JetBrains/kotlin
CHANGELOG
1.3.60
Android
KT-27170 Android lint tasks fails in Gradle with MPP dependency
Compiler
New Features
KT-31230 Refine rules for allowed Array-based class literals on different platforms...
1.3.60
Android
KT-27170 Android lint tasks fails in Gradle with MPP dependency
Compiler
New Features
KT-31230 Refine rules for allowed Array-based class literals on different platforms...