В нашем новом дайджесте моменты неотзывчивости и автоматизация рутины, правила линтера и легендарный мобильный GPU, как и где практиковаться начинающему мобильному разработчику, исследование приложений с подпиской 2024 и многое другое. Подключайтесь!
Подписывайтесь на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/g0/q2/zv/g0q2zvqotpndygeyqxpjcrgxt_0.png)
iOS
• Разработка, управляемая тестами (TDD), для исправления ошибок
• SwiftUI уроки (часть 4)
• Вы можете сделать пейвол в алерте. Но, вероятно, не стоит.
• Cocoapods pod install без интернета на CI при использовании Tuist
• Моменты неотзывчивости iOS-приложений: как найти и исправить
• Swift-уроки: cоздание горизонтального меню с индикатором
• Apple разрешает распространение приложений с сайтов
• Поваренная книга SwiftUI: лучшие практики управления состояниями в SwiftUI
• Вышла VisionOS 1.1
•
How to build a draggable bottom sheet with a scroll view in SwiftUI
•
Everything you need to know about Swift 5.10
•
Concurrency Recipes
•
How to Dynamically Construct Complex Predicates for SwiftData
•
Aspect-Oriented Programming in Swift
•
Implementing a TV Guide with SwiftUI
•
Exploring SwiftUI: Creating a Scope View using DragGesture
•
Global actors in Swift
•
Using Apples OpenAPI Generator to Make and Mock Network Calls in SwiftUI
•
Navigation between modules in iOS
•
Understanding visionOS
•
Using @_silgen_name to call private Swift code and improve build times
•
Tips and Considerations for Using Lazy Containers in SwiftUI
•
Local SPM — Mastering Modularization with Swift Package Manager
•
From Slow to Fast: Profiling SwiftUI Applications for Peak Performance
•
SwiftUI Performance Optimisation: How to manage Data Flow and UI Updates in your iOS and macOS apps
•
MapKit with SwiftUI — Regions, Markers and Annotations and CameraPosition
•
MapKit with SwiftUI — Map Destination Persistence and MockData
•
How to get started with Swift Macros
•
Paginating SwiftData
•
Do you know what view.layoutIfNeeded() actually does?
•
Swift Playdate Examples: примеры разработки игр для Playdate на Swift
•
Swift Translate: автоматический перевод String Catalog
•
Concurrency Recipes: проблемы Swift Concurrency
Android
• Автоматизируем рутину в Android разработке: плагин для создания шаблонного кода на примере создания -api -impl модулей
• Прекратите спорить в Code Review — начните внедрять с правилами линтера
• Кот в мешке: мастерство обработки ошибок внешних ключей SQLite
• Android-приложение на Compose с нуля: Часть 2 (UI)
• Fastlane для Android разработчиков
• Drag and Drop в Jetpack Compose
• Ликбез по вложенной прокрутке в Jetpack Compose
• KatWalk C2: ч2, подслушаем, подсмотрим и разнюхаем или как общаться с незнакомым железом на незнакомом языке
• Собеседование по Kotlin
• Ultron — фреймворк для тестирования Android UI и Compose
• Собираем грабли при профилировании Android-приложений
• Google I/O 2024 пройдет 14 мая
• Чистка Android-проекта для уменьшения размера APK, ускорения сборки и улучшения опыта разработки
• Новый Fused Orientation Provider обеспечивает получение точных данных об ориентации устройства
•
How to create Glovo-like main screen animation using Jetpack Compose
•
Kotlin Design Patterns: Abstract Factory Explained
•
Designing your account deletion experience with users in mind
•
Downloadable and Preloaded Fonts on Android
•
State of Dependency Management in Android Studio
•
Hilt, ViewModels & Assisted Injection
•
A Weekend AI Project: Running LLaMA and Gemma AI Models on the Android Phone
•
Monetizing Marvels: A Developer’s Guide to In-App Purchases on Android
•
ANR in Android & its types
•
A comprehensive guide to understand Kotlin Flows
•
Going edge-to-edge with Compose without losing it
•
The Night’s Watch: Safeguarding store operations
•
Trim, Transcode, Concatenate: Your Guide to Media3 Editing Libraries
•
How to Drag and Drop using Modifier.dragAndDropSource/Target - Jetpack Compose
•
Unit Testing Tutorial for Android: Getting Started
•
Seven recipes to understand flows and asynchrony in Kotlin
•
Now in Android: 100 — Android 15 DP 1, Stable Studio Iguana, Cloud Photo Picker, and more
•
What’s new in Android Studio Iguana
•
Google for Games Developer Summit 2024
•
How to Create a Document Scanner App with MLKit
•
If You Think THIS Is a Best Practice, You’re WRONG in 99% of the Cases
•
The Missing Library of the Compose Multiverse
•
Making Data Visualizations More Accessible
•
Imperative, declarative, object oriented, functional: four of a Kotlin kind
•
Appteka: альтернативный магазин приложений для Android
•
Kotest: мощный, элегантный и гибкий фреймворк для тестирования Kotlin
•
Legado: читалка для Android
Кроссплатформа
• Интеграция нативных SDK во Flutter-приложение
• Как быстро получать данные из ОС Аврора через интерфейс D-Bus во Flutter-приложении
• Что нового во Flutter 3.19
• Работа с Data Assets во Flutter
• Методы-расширения в Dart
• Коллекции во Flutter
•
Making a 2.5D game using Flutter — Tutorial
•
Building a Flutter SDK Part 2: A Deep Dive Into pub.dev
•
Flutter: Offline playback for video_player
•
How to manage Keystore Paths in Flutter (Android)
•
Goodbye PWA, Hello PWA — Apple And Progressive Web Apps
•
Leveraging Key-Value Observing in Kotlin Multiplatform for iOS
•
Slint v1.5 — a modern, declarative GUI toolkit — released with Android support
•
I made LAN file sharing app using only Dart and Flutter
Разработка
• Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля
• Discord открывает SDK для разработки встроенных игр и приложений
• Как и где практиковаться начинающему мобильному разработчику
• Как искать отличных Senior-инженеров
• Приложение викторины: внедрение Cardoteka и основные паттерны проектирования с Riverpod
• Как принимать решения, строить команды и выбирать инструменты разработки — Павел Щедухин (Ozon Tech)
• Публичное собеседование по System Design
• Мобильная инфраструктура. Взгляд изнутри
• BDUI – удовольствие или боль?
• BDUI на 100%: управляем шиммерами с бэкенда
• Stashpad запускает блокнот для разработчиков с совместной работой
• В 2023 году Google выплатил $10 млн за поиск уязвимостей
• Как Google испортил свою открытую культуру и скомпрометировал свой продукт
•
The most important goal in designing software is understandability
•
You’re not a weak developer if you don’t always show off your technical excellence
•
Context-switching — one of the worst productivity killers in the engineering industry
•
How It All Goes Live: An Overview of Discord’s Streaming Technology
•
How Khan Academy Scaled to 30 Million Users
•
Winning a hackathon, losing my sanity
•
Why software projects fail
•
Back End Developer Roadmap 2024
Аналитика, маркетинг и монетизация
• Приложения с подпиской 2024 — отчет RevenueCat
• Google Play анонсирует новые функции для игр
• Как персонализация на основе ИИ выведет продвижение мобильных приложений на новый уровень
• Apple тестирует ИИ в своей рекламной платформе
• Apple снова разблокировала учетную запись Epic Games
• Аналитика нового продукта «под ключ»
•
Turning organic success into long-term revenue
•
Abysmal revenue stats of 30K mobile apps show why devs keep pushing for subs
AI, Устройства, IoT
• KC868-A8M: 8x8, GSM, RTC и прочие плюшки (плюс CAN для любителей)
• Протокол защищенного обмена для индустриальных систем CRISP: поддержка в устройствах Рутокен
• Microsoft открывает бесплатный доступ к GPT-4 Turbo в Copilot
•
Using my new Raspberry Pi to run an existing GitHub Action
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/g0/q2/zv/g0q2zvqotpndygeyqxpjcrgxt_0.png)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• Разработка, управляемая тестами (TDD), для исправления ошибок
• SwiftUI уроки (часть 4)
• Вы можете сделать пейвол в алерте. Но, вероятно, не стоит.
• Cocoapods pod install без интернета на CI при использовании Tuist
• Моменты неотзывчивости iOS-приложений: как найти и исправить
• Swift-уроки: cоздание горизонтального меню с индикатором
• Apple разрешает распространение приложений с сайтов
• Поваренная книга SwiftUI: лучшие практики управления состояниями в SwiftUI
• Вышла VisionOS 1.1
•
![](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/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/e1a/3cf/2a8/e1a3cf2a8b65a0da69bbdd5c0ad040fe.png)
• Автоматизируем рутину в Android разработке: плагин для создания шаблонного кода на примере создания -api -impl модулей
• Прекратите спорить в Code Review — начните внедрять с правилами линтера
• Кот в мешке: мастерство обработки ошибок внешних ключей SQLite
• Android-приложение на Compose с нуля: Часть 2 (UI)
• Fastlane для Android разработчиков
• Drag and Drop в Jetpack Compose
• Ликбез по вложенной прокрутке в Jetpack Compose
• KatWalk C2: ч2, подслушаем, подсмотрим и разнюхаем или как общаться с незнакомым железом на незнакомом языке
• Собеседование по Kotlin
• Ultron — фреймворк для тестирования Android UI и Compose
• Собираем грабли при профилировании Android-приложений
• Google I/O 2024 пройдет 14 мая
• Чистка Android-проекта для уменьшения размера APK, ускорения сборки и улучшения опыта разработки
• Новый Fused Orientation Provider обеспечивает получение точных данных об ориентации устройства
•
![](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/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)
• Интеграция нативных SDK во Flutter-приложение
• Как быстро получать данные из ОС Аврора через интерфейс D-Bus во Flutter-приложении
• Что нового во Flutter 3.19
• Работа с Data Assets во Flutter
• Методы-расширения в Dart
• Коллекции во Flutter
•
![](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/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля
• Discord открывает SDK для разработки встроенных игр и приложений
• Как и где практиковаться начинающему мобильному разработчику
• Как искать отличных Senior-инженеров
• Приложение викторины: внедрение Cardoteka и основные паттерны проектирования с Riverpod
• Как принимать решения, строить команды и выбирать инструменты разработки — Павел Щедухин (Ozon Tech)
• Публичное собеседование по System Design
• Мобильная инфраструктура. Взгляд изнутри
• BDUI – удовольствие или боль?
• BDUI на 100%: управляем шиммерами с бэкенда
• Stashpad запускает блокнот для разработчиков с совместной работой
• В 2023 году Google выплатил $10 млн за поиск уязвимостей
• Как Google испортил свою открытую культуру и скомпрометировал свой продукт
•
![](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/getpro/habr/post_images/509/dc9/bde/509dc9bde69347ecbe0c21ff2973d7e7.jpg)
• Приложения с подпиской 2024 — отчет RevenueCat
• Google Play анонсирует новые функции для игр
• Как персонализация на основе ИИ выведет продвижение мобильных приложений на новый уровень
• Apple тестирует ИИ в своей рекламной платформе
• Apple снова разблокировала учетную запись Epic Games
• Аналитика нового продукта «под ключ»
•
![](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/853/812/9f5/8538129f5e7b404a720121cb9c3814db.jpg)
• KC868-A8M: 8x8, GSM, RTC и прочие плюшки (плюс CAN для любителей)
• Протокол защищенного обмена для индустриальных систем CRISP: поддержка в устройствах Рутокен
• Microsoft открывает бесплатный доступ к GPT-4 Turbo в Copilot
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.