В этом дайджесте «условное ценообразование» для подписок и как управлять сложностью состояния, еще одно проигранное дело Google и как компания смогла проиграть там, где Apple выиграла, как почувствовать себя кассиром, анимации переходов во Flutter, рефакторинг кода и многое другое!
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/c2/gd/6z/c2gd6z_ehmsw9wys04vyfj9g_aw.png)
iOS
• Custom Segmented Control
• Beeper отказывается от борьбы с Apple и выкладывает код в open source
• Вопросы с собеседований: коллекции в Swift
• Поваренная книга SwiftUI: состояние, привязка, ObservableObject и ObservedObject
• В Internet Archive нашли старые приложения и игры из TestFlight
• Apple представила «условное ценообразование» для подписок
•
Plain Swift — a simple Swift IDE for Windows
•
Should you add final to all your Swift classes?
•
Decoupled stacked sheet navigation with multiple modals in SwiftUI
•
Integrating Haptic Feedback In SwiftUI Projects
•
Hierarchical background styles in SwiftUI
•
Stop using MVVM and abusing Observable classes in SwiftUI
•
Coordinator Pattern for iOS Apps
•
Why I chose The Composable Architecture for SwiftUI and never looked back
•
Mastering MapKit in SwiftUI. Interactions.
•
Preparing your App for VoiceOver: Accessibility Actions
•
How to get the most played Apple Music songs and albums using Swift
•
Quick Search with SwiftUI Searchable
•
Xcode 15’s Hidden Treasure: Logging Like a Pro 2024
•
Swift: Singleton Pattern
•
The Case Against [unowned self]
•
iOS UI Testing with Deep Links
•
Scalable and Modular System Design for the simplest iOS App
•
Creating a Scrolling Parallax Effect with SwiftUI
•
SwiftUI View Models: Lifecycle Quirks
•
Become More Senior iOS Developer with these 4 Xcode Tips & Tricks
•
❸☻- Simulation Emojimix on Xcode
•
Building Complex Scroll Animations With New iOS 17 APIs
•
SwiftUI Widgets | App Groups | Charts | Expense Tracker App
•
How To Create A Submission Form In Xcode 15
•
This is the CRAZIEST Swift code you’ll ever see
•
SwiftData CloudKit
•
SwiftUI Animated Toasts
•
BadgeIcon: системные иконки для SwiftUI
•
Google AI SDK for Swift: генеративный ИИ для ваших приложений
Android
• Как управлять сложностью состояния — Сергей Опивалов
• Создаем пассивный UI в Jetpack Compose
• Подключение сканера к Android или как почувствовать себя кассиром
• Stone. Квалификаторы и идентификаторы
• Как устроен Gradle Config Cache. Лучшие Практики. Интервью с инженером команды Gradle
• Google выплатит $700 млн в еще одном споре о Play Store + Все изменения, которые произойдут в Google Play и загрузке приложений
• Что нового в AOSP 14
• Вопросы с собеседований: для чего нужны inline функции
•
Animating Inside and Outside the Box with Jetpack Compose
•
The ViewModel’s leaked Flow collectors problem
•
Glassmorphic Bottom Navigation in Jetpack Compose
•
Building Passive UI in Jetpack Compose
•
Kandy: the new Kotlin plotting library by JetBrains
•
Don’t use var in enums
•
Unleashing WebSocket in Android?
•
Effect Handlers in Jetpack Compose: A Complete Guide
•
Kotlin under the hood: how to get rid of recursion
•
Foreground Services in Android 14: What’s Changing?
•
Multi-Module with Clean Architecture
•
Crash Course on the Android UI Layer | Part 2
•
Fortifying Android Apps: A Comprehensive Guide to Securing Your App and Codebase with Kotlin
•
State Management in Jetpack Compose
•
Live Streaming and Audio Equalizer with ExoPlayer in Jetpack Compose
•
Android Thread & Relation With Coroutine
•
Demystifying Kotlin: Understanding the Inner Workings of Inline Functions
•
How to handle single-event in Jetpack Compose
•
Android Launch Modes Explained
•
(W)rap — Android Developers Backstage
•
Introducing Gemini, Google at NeurIPS 2023, and more dev news!
•
Performance Optimization with @Stable and @Immutable in Jetpack Compose
•
Demystifying Pixel Shaders (AGSL)
•
Do You Have to Learn Clean Architecture as a Beginner?
•
NanoKt: библиотека расширений для Android и Kotlin
•
Ludwig: набор UI-компонентов для Jetpack Compose
•
Android-PiP: реализация «картинки в картинке»
Кроссплатформа
• Transition Animation: настраиваем анимацию переходов во Flutter
• Создаем federated plugin для Flutter-проекта
• Автоматизированное тестирование событий аналитики в мобильном приложении: насколько это реально и оправдано
• Just DUIT — первый взгляд на server-driven UI фреймворк для Flutter
• Мультиплатформенная разработка на чистой Java
• Android System Design: делаем библиотеку Firebase
• Handle push and locale notifications in your Flutter app
•
Jetpack Preferences DataStore in Kotlin Multiplatform
•
Flutter and SQLite: A Deep Dive into Local Data Persistence
•
Globe (a Flutter & Dart deployment platform) is now in public preview
•
How we built it: Ask Dash — A generative AI Flutter application
•
A novel architecture for Multiplatform applications with Pavel Lahoda
Разработка
• 13 советов для начинающих разработчиков, которые уже прочитали все остальные советы
• Рефакторинг кода, и как его не бояться
• Cоздание идеальных вкладок
• Как подготовиться к собеседованию по System Design мобильному разработчику
• Mobile Web, навигация и при чем тут Nginx
• «Они убивают Lottie — молодцы!»
• История разработки приложения для складных смартфонов Samsung. Часть 2 — гайдлайны
• Модульная запутанность. Как распарсить одну модель в разных модулях
• Оптимизация и автоматизация в бэкенд-разработке мобильных приложений: как ускорить разработку в четыре раза
• Разработка Авто.ру и роль руководителя в команде
• Что такое observability мобильного приложения
• Мобильные релизы в Авито
• Силиконовая Долина глазами российского разработчика
• Релокация на Кипр
•
Redesigning our global order tracking experience
•
I’ve vastly misunderstood the Single Responsibility Principle
•
Empirically supported code review best practices
•
How to Scale an App to 10 Million Users on AWS
•
We Can’t Hire You
Аналитика, маркетинг и монетизация
• Эпический вопрос: как Google проиграл там, где Apple выиграла
• 5 трендов в области маркетинга приложений 2023 — и их проекция на 2024
• Краткое руководство по анализу данных и проведению продуктовых исследований
• Claim, социальная сеть, позволяющая пользователям зарабатывать и обмениваться вознаграждениями, привлекает $4 млн
• Spill, инклюзивная альтернатива X, запускает бету на iOS и Android
• Location — cоздатели Zenly выпускают приложение, похожее на Zenly
• Маркетологи в мобайле. Итоги года 2023. Часть 1
• Топ быстрорастущих приложений в России в декабре
• Итоги года и планы на 2024 от Adjust
• Количество пользователей социальной сети Jagat превысила 10 миллионов
• Спрос на приложения для ментального здоровья почти сошел на нет
• Самые скачиваемые приложения в мире в ноябре 2023
•
Using campaign links to track impressions, downloads, and sales
AI, Устройства, IoT
• Управляем школьниками, не привлекая внимание санитаров
• Как пользователи убедили Chevrolet продать им машину за 100 рублей — или проблемы использования ИИ-чатботов
• NORVI Arita: добавляем SD картридер и веб-интерфейс (почти контроллер мечты)
• Сравнение популярных брокеров MQTT с открытым исходным кодом
• Apple разработала прорывной метод запуска LLM на устройствах с ограниченной памятью
• Apple останавливает продажи Apple Watch Series 9/Ultra 2 из-за нарушений патентов
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/c2/gd/6z/c2gd6z_ehmsw9wys04vyfj9g_aw.png)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• Custom Segmented Control
• Beeper отказывается от борьбы с Apple и выкладывает код в open source
• Вопросы с собеседований: коллекции в Swift
• Поваренная книга SwiftUI: состояние, привязка, ObservableObject и ObservedObject
• В Internet Archive нашли старые приложения и игры из TestFlight
• Apple представила «условное ценообразование» для подписок
•
![](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/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 или как почувствовать себя кассиром
• Stone. Квалификаторы и идентификаторы
• Как устроен Gradle Config Cache. Лучшие Практики. Интервью с инженером команды Gradle
• Google выплатит $700 млн в еще одном споре о Play Store + Все изменения, которые произойдут в Google Play и загрузке приложений
• Что нового в AOSP 14
• Вопросы с собеседований: для чего нужны inline функции
•
![](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/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.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)
• Transition Animation: настраиваем анимацию переходов во Flutter
• Создаем federated plugin для Flutter-проекта
• Автоматизированное тестирование событий аналитики в мобильном приложении: насколько это реально и оправдано
• Just DUIT — первый взгляд на server-driven UI фреймворк для Flutter
• Мультиплатформенная разработка на чистой Java
• Android System Design: делаем библиотеку Firebase
• Handle push and locale notifications in your Flutter app
•
![](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/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• 13 советов для начинающих разработчиков, которые уже прочитали все остальные советы
• Рефакторинг кода, и как его не бояться
• Cоздание идеальных вкладок
• Как подготовиться к собеседованию по System Design мобильному разработчику
• Mobile Web, навигация и при чем тут Nginx
• «Они убивают Lottie — молодцы!»
• История разработки приложения для складных смартфонов Samsung. Часть 2 — гайдлайны
• Модульная запутанность. Как распарсить одну модель в разных модулях
• Оптимизация и автоматизация в бэкенд-разработке мобильных приложений: как ускорить разработку в четыре раза
• Разработка Авто.ру и роль руководителя в команде
• Что такое observability мобильного приложения
• Мобильные релизы в Авито
• Силиконовая Долина глазами российского разработчика
• Релокация на Кипр
•
![](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/getpro/habr/post_images/509/dc9/bde/509dc9bde69347ecbe0c21ff2973d7e7.jpg)
• Эпический вопрос: как Google проиграл там, где Apple выиграла
• 5 трендов в области маркетинга приложений 2023 — и их проекция на 2024
• Краткое руководство по анализу данных и проведению продуктовых исследований
• Claim, социальная сеть, позволяющая пользователям зарабатывать и обмениваться вознаграждениями, привлекает $4 млн
• Spill, инклюзивная альтернатива X, запускает бету на iOS и Android
• Location — cоздатели Zenly выпускают приложение, похожее на Zenly
• Маркетологи в мобайле. Итоги года 2023. Часть 1
• Топ быстрорастущих приложений в России в декабре
• Итоги года и планы на 2024 от Adjust
• Количество пользователей социальной сети Jagat превысила 10 миллионов
• Спрос на приложения для ментального здоровья почти сошел на нет
• Самые скачиваемые приложения в мире в ноябре 2023
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
![](https://habrastorage.org/getpro/habr/post_images/853/812/9f5/8538129f5e7b404a720121cb9c3814db.jpg)
• Управляем школьниками, не привлекая внимание санитаров
• Как пользователи убедили Chevrolet продать им машину за 100 рублей — или проблемы использования ИИ-чатботов
• NORVI Arita: добавляем SD картридер и веб-интерфейс (почти контроллер мечты)
• Сравнение популярных брокеров MQTT с открытым исходным кодом
• Apple разработала прорывной метод запуска LLM на устройствах с ограниченной памятью
• Apple останавливает продажи Apple Watch Series 9/Ultra 2 из-за нарушений патентов
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.