В этом выпуске миграция на Observation и Doom на SwiftUI, современный Compose и прощание с друзьями, принципы хорошего дизайна, красоты кода, эффективного продвижения и многого другого!
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/9x/th/1f/9xth1fkpmbob3m_vxbdz5lwk69s.jpeg)
iOS
• Перф-тесты VS аномалии. Вечная битва за производительность приложений на iOS
• Миграция Ice Cubes на фреймворк SwiftUI Observation
• Jailbreak checker — как обезопасить свое iOS-приложение
• @ViewBuilder Что? Зачем? Когда?
• Руководство по Использованию Многопоточности в Swift
• Паттеры проектирования — Мост
• Пишем свой рендеринг графики на SwiftUI и запускаем на нем Doom
• Поваренная книга SwiftUI: использование предварительного просмотра в Xcode со SwiftUI
•
A new tool for testing macros in Swift
•
Crack Your iOS Interview: Top Questions You Must Know in 2023 Before You Go!
•
Understanding Access Levels in Swift with Examples
•
Benefits of using #pragma mark in Swift
•
Discovering All SwiftUI TextField Keyboard Types
•
3 Cool new features of Swift 5.9
•
How to Handle Content Unavailable Gracefully with iOS 17?
•
Bottom Sheet View Controller with Dynamic Content Height in iOS
•
The sad state of @AppStorage and the Observable framework
•
Store Codable types in AppStorage
•
Efficient Dependency Management in iOS: Introducing AppContainer for MVP+DI architecture
•
WeatherKit Tutorial: Getting Started
•
Understanding Publishers in SwiftUI and Combine
•
Thread safety in Swift with actors
•
Creating a Carousel View in SwiftUI: A Step-by-Step Guide
•
Multipart Request with URLSession and async/await in Swift
•
Closures vs. Delegates in Swift iOS
•
How to use the new inspector SwiftUI view modifier
•
How to create an App Clip for your app
•
Dependency Injection in Swift
•
Crafting Gourmate: The Food Journaling App
•
SwiftUI Animated Carousel Slider With Paging Control
•
Build a SwiftUI Video Calling: How to Ring and Notify Users About a Call
•
How to translate and localize an iOS app with string catalogs in Xcode 15
•
CocoaHeadsNL Meetup
•
SwiftUI Custom Alert View
•
SFSymbol Animations in iOS 17
•
Breaking Down Swift Data Migrations
•
DeviceKit: замена UIDevice
•
iOSSecuritySuite: безопасность и защита от взлома iOS-приложений
Android
• Реализуем современный UI на Jetpack Compose
• «Подарил удочки и попрощался с друзьями на год»: как я стал Android-разработчиком, отказавшись даже от прогулок
• Собеседование на Mobile Developer: Алексей Панов (Контур)
• От плохого кода к хорошему один шаг: юнит тесты, ООП и интерфейсы
• Studio Bot в Android Studio заработал в 170 странах мира
• Написание символьного процессора с помощью Kotlin Symbol Processing (Часть 1) + (Часть 2)
• Тюнинг производительности Kotlin: 20 советов
•
UI Eventing on Android
•
ANR internals: touch dispatching through the view hierarchy
•
ArchUnit vs. Konsist. Why Did We Need Another Kotlin “Linter”?
•
A bird’s eye view of the ioki Android app architecture
•
Kotlin Flow: Simple yet Powerful Implementation
•
Why has my background Worker stopped? Exploring Android WorkManger’s StopReason
•
Mastering RecyclerView Optimizations in Android
•
Lighten MVI architecture: Delegate responsibilities to new components
•
Creating the Creational Design Patterns in Kotlin
•
Implementing In-App Reviews Using Google Play Review API
•
Data Persistence With Room
•
Media on Swiggy’s Mobile Apps
•
Navigation in Jetpack compose. Full guide Beginner to Advanced.
•
How to Implement Swipe-to-Action using AnchoredDraggable in Jetpack Compose
•
Let’s Talk about Kotlin K2
•
First Alpha release of Androidx Bluetooth
•
Java 21 Features With Example
•
Generics in Kotlin
•
Compose Modifier.Node and where to find it
•
Firebase in Android Studio — Android Developers Backstage
•
Now in Android: 91 — Jetpack Glance, Android 14 QPR, Google Play policy and console updates, & more!
•
How to Create a Lazy Column With Categories in Jetpack Compose
•
ComposeCard: красивый экран оплаты на Jetpack Compose
•
ComposeScrollbars: продвинутые скроллбары для Compose
Кроссплатформа
•
Why Kotlin Multiplatform could change everything in the mobile dev world
•
The Power of the late keyword in Dart
•
Behind every widget, there are an element and almost always a render object
•
Mavericks Style Architecture on Kotlin Compose Multiplatform: A Tutorial
•
Trainee Program for Aspiring Flutter Developers
•
Kotlin for Web Development: Beyond Android Apps
•
Integrating Flutter {all 6 platforms} and Python: A Comprehensive Guide
•
The hidden cost of async operations in Flutter/Dart
•
5+ Github Actions to Automate Your React Native Workflow
•
Making Multiplatform Better
•
Creating a Cutting-Edge Movie Streaming App with Flutter & Python
•
Flutter Weather App: погодное приложение в стиле Apple Weather
Разработка
• Особенности SRE и Observability в мобильных приложениях
• Принципы хорошего дизайна интерфейсов. И причем здесь программисты?
• Сделали по красоте: победители «Конкурса красоты кода»
• Ozon Tech Community QA Meetup
• Как использовать метод струн для улучшения любого пользовательского интерфейса
• GitHub Copilot Chat открыли для индивидуальных разработчиков
• Kotlin снова вошел в Топ-20 TIOBE Index
•
Unlocking the Potential of Mobile DevOps: Transforming App Development and Delivery
•
Best Practices for Collecting and Querying Data from Multiple Sources
•
My approach to coding interviews: Optimize for iteration
•
What Happens When You Reach The Age of 35 as a Programmer
•
Tracing: structured logging, but better in every way
•
Every Programmer Should Know #1: Idempotency
•
How to be the favorite engineer among your product manager and designer
•
The ONLY Right Way to Document Your Code
•
ElectricSQL: Local-first платформа синхронизации для Postgres
•
OpenRA: игровой движок для 2D стратегий
Аналитика, маркетинг и монетизация
• Эффективное продвижение в in-app, альтернативных магазинах и через Android APK. Кейс «Национальная Лотерея» и Rocket10
• Как увеличить мощность A/B-теста, если мало данных и время поджимает
• Podlodka #336: ищем пользовательский сегмент
• Модерация приложений и игр в магазине RuStore
• Carrots&Cake: приложение родительского контроля меняет обучение на игры
• Sizzle — не просто решение домашних задач, а объяснение их с помощью ИИ
• Google провел редизайн приложения Fitbit
• Исследование “Мобильный потребитель 2023”
AI, Устройства, IoT
• Диалоги с кофеваркой, про Яндекс Алису и умный дом Home Assistant
• От логики и риторики до теории множеств и матанализа. Полезные материалы по Data Science и машинному обучению
• Слезаем с иглы Siemens: промышленная вентиляция бассейна и спортивного комплекса
• IoT и его криптонит
• $100 млн в Серии B: Writer — генеративная платформа для предприятий
• Исследователи Microsoft AI выставили терабайты данных на всеобщий доступ
• Если бы вы покупали акции, вместо iPhone, у вас сейчас было бы $147,000
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/9x/th/1f/9xth1fkpmbob3m_vxbdz5lwk69s.jpeg)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• Перф-тесты VS аномалии. Вечная битва за производительность приложений на iOS
• Миграция Ice Cubes на фреймворк SwiftUI Observation
• Jailbreak checker — как обезопасить свое iOS-приложение
• @ViewBuilder Что? Зачем? Когда?
• Руководство по Использованию Многопоточности в Swift
• Паттеры проектирования — Мост
• Пишем свой рендеринг графики на SwiftUI и запускаем на нем Doom
• Поваренная книга SwiftUI: использование предварительного просмотра в Xcode со SwiftUI
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/e1a/3cf/2a8/e1a3cf2a8b65a0da69bbdd5c0ad040fe.png)
• Реализуем современный UI на Jetpack Compose
• «Подарил удочки и попрощался с друзьями на год»: как я стал Android-разработчиком, отказавшись даже от прогулок
• Собеседование на Mobile Developer: Алексей Панов (Контур)
• От плохого кода к хорошему один шаг: юнит тесты, ООП и интерфейсы
• Studio Bot в Android Studio заработал в 170 странах мира
• Написание символьного процессора с помощью Kotlin Symbol Processing (Часть 1) + (Часть 2)
• Тюнинг производительности Kotlin: 20 советов
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/webt/ma/lx/8h/malx8hbgozt6lee8rmxmg96_s6a.png)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• Особенности SRE и Observability в мобильных приложениях
• Принципы хорошего дизайна интерфейсов. И причем здесь программисты?
• Сделали по красоте: победители «Конкурса красоты кода»
• Ozon Tech Community QA Meetup
• Как использовать метод струн для улучшения любого пользовательского интерфейса
• GitHub Copilot Chat открыли для индивидуальных разработчиков
• Kotlin снова вошел в Топ-20 TIOBE Index
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/509/dc9/bde/509dc9bde69347ecbe0c21ff2973d7e7.jpg)
• Эффективное продвижение в in-app, альтернативных магазинах и через Android APK. Кейс «Национальная Лотерея» и Rocket10
• Как увеличить мощность A/B-теста, если мало данных и время поджимает
• Podlodka #336: ищем пользовательский сегмент
• Модерация приложений и игр в магазине RuStore
• Carrots&Cake: приложение родительского контроля меняет обучение на игры
• Sizzle — не просто решение домашних задач, а объяснение их с помощью ИИ
• Google провел редизайн приложения Fitbit
• Исследование “Мобильный потребитель 2023”
![](https://habrastorage.org/getpro/habr/post_images/853/812/9f5/8538129f5e7b404a720121cb9c3814db.jpg)
• Диалоги с кофеваркой, про Яндекс Алису и умный дом Home Assistant
• От логики и риторики до теории множеств и матанализа. Полезные материалы по Data Science и машинному обучению
• Слезаем с иглы Siemens: промышленная вентиляция бассейна и спортивного комплекса
• IoT и его криптонит
• $100 млн в Серии B: Writer — генеративная платформа для предприятий
• Исследователи Microsoft AI выставили терабайты данных на всеобщий доступ
• Если бы вы покупали акции, вместо iPhone, у вас сейчас было бы $147,000
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.