В нашем новом дайджесте моменты неотзывчивости и автоматизация рутины, правила линтера и легендарный мобильный GPU, как и где практиковаться начинающему мобильному разработчику, исследование приложений с подпиской 2024 и многое другое. Подключайтесь!
Подписывайтесь на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.

 iOS
 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
 How to build a draggable bottom sheet with a scroll view in SwiftUI
• Everything you need to know about Swift 5.10
 Everything you need to know about Swift 5.10
• Concurrency Recipes
 Concurrency Recipes
• How to Dynamically Construct Complex Predicates for SwiftData
 How to Dynamically Construct Complex Predicates for SwiftData
• Aspect-Oriented Programming in Swift
 Aspect-Oriented Programming in Swift
• Implementing a TV Guide with SwiftUI
 Implementing a TV Guide with SwiftUI
• Exploring SwiftUI: Creating a Scope View using DragGesture
 Exploring SwiftUI: Creating a Scope View using DragGesture
• Global actors in Swift
 Global actors in Swift
• Using Apples OpenAPI Generator to Make and Mock Network Calls in SwiftUI
 Using Apples OpenAPI Generator to Make and Mock Network Calls in SwiftUI
• Navigation between modules in iOS
 Navigation between modules in iOS
• Understanding visionOS
 Understanding visionOS
• Using @_silgen_name to call private Swift code and improve build times
 Using @_silgen_name to call private Swift code and improve build times
• Tips and Considerations for Using Lazy Containers in SwiftUI
 Tips and Considerations for Using Lazy Containers in SwiftUI
• Local SPM — Mastering Modularization with Swift Package Manager
 Local SPM — Mastering Modularization with Swift Package Manager
• From Slow to Fast: Profiling SwiftUI Applications for Peak Performance
 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
 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 — Regions, Markers and Annotations and CameraPosition
• MapKit with SwiftUI — Map Destination Persistence and MockData
 MapKit with SwiftUI — Map Destination Persistence and MockData
• How to get started with Swift Macros
 How to get started with Swift Macros
• Paginating SwiftData
 Paginating SwiftData
• Do you know what view.layoutIfNeeded() actually does?
 Do you know what view.layoutIfNeeded() actually does?
• Swift Playdate Examples: примеры разработки игр для Playdate на Swift
 Swift Playdate Examples: примеры разработки игр для Playdate на Swift
• Swift Translate: автоматический перевод String Catalog
 Swift Translate: автоматический перевод String Catalog
• Concurrency Recipes: проблемы Swift Concurrency
 Concurrency Recipes: проблемы Swift Concurrency
 Android
 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
 How to create Glovo-like main screen animation using Jetpack Compose
• Kotlin Design Patterns: Abstract Factory Explained
 Kotlin Design Patterns: Abstract Factory Explained
• Designing your account deletion experience with users in mind
 Designing your account deletion experience with users in mind
• Downloadable and Preloaded Fonts on Android
 Downloadable and Preloaded Fonts on Android
• State of Dependency Management in Android Studio
 State of Dependency Management in Android Studio
• Hilt, ViewModels & Assisted Injection
 Hilt, ViewModels & Assisted Injection
• A Weekend AI Project: Running LLaMA and Gemma AI Models on the Android Phone
 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
 Monetizing Marvels: A Developer’s Guide to In-App Purchases on Android
• ANR in Android & its types
 ANR in Android & its types
• A comprehensive guide to understand Kotlin Flows
 A comprehensive guide to understand Kotlin Flows
• Going edge-to-edge with Compose without losing it
 Going edge-to-edge with Compose without losing it
• The Night’s Watch: Safeguarding store operations
 The Night’s Watch: Safeguarding store operations
• Trim, Transcode, Concatenate: Your Guide to Media3 Editing Libraries
 Trim, Transcode, Concatenate: Your Guide to Media3 Editing Libraries
• How to Drag and Drop using Modifier.dragAndDropSource/Target - Jetpack Compose
 How to Drag and Drop using Modifier.dragAndDropSource/Target - Jetpack Compose
• Unit Testing Tutorial for Android: Getting Started
 Unit Testing Tutorial for Android: Getting Started
• Seven recipes to understand flows and asynchrony in Kotlin
 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
 Now in Android: 100 — Android 15 DP 1, Stable Studio Iguana, Cloud Photo Picker, and more
• What’s new in Android Studio Iguana
 What’s new in Android Studio Iguana
• Google for Games Developer Summit 2024
 Google for Games Developer Summit 2024
• How to Create a Document Scanner App with MLKit
 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
 If You Think THIS Is a Best Practice, You’re WRONG in 99% of the Cases
• The Missing Library of the Compose Multiverse
 The Missing Library of the Compose Multiverse
• Making Data Visualizations More Accessible
 Making Data Visualizations More Accessible
• Imperative, declarative, object oriented, functional: four of a Kotlin kind
 Imperative, declarative, object oriented, functional: four of a Kotlin kind
• Appteka: альтернативный магазин приложений для Android
 Appteka: альтернативный магазин приложений для Android
• Kotest: мощный, элегантный и гибкий фреймворк для тестирования Kotlin
 Kotest: мощный, элегантный и гибкий фреймворк для тестирования Kotlin
• Legado: читалка для Android
 Legado: читалка для Android
 Кроссплатформа
 Кроссплатформа
• Интеграция нативных SDK во Flutter-приложение
• Как быстро получать данные из ОС Аврора через интерфейс D-Bus во Flutter-приложении
• Что нового во Flutter 3.19
• Работа с Data Assets во Flutter
• Методы-расширения в Dart
• Коллекции во Flutter
• Making a 2.5D game using Flutter — Tutorial
 Making a 2.5D game using Flutter — Tutorial
• Building a Flutter SDK Part 2: A Deep Dive Into pub.dev
 Building a Flutter SDK Part 2: A Deep Dive Into pub.dev
• Flutter: Offline playback for video_player
 Flutter: Offline playback for video_player
• How to manage Keystore Paths in Flutter (Android)
 How to manage Keystore Paths in Flutter (Android)
• Goodbye PWA, Hello PWA — Apple And Progressive Web Apps
 Goodbye PWA, Hello PWA — Apple And Progressive Web Apps
• Leveraging Key-Value Observing in Kotlin Multiplatform for iOS
 Leveraging Key-Value Observing in Kotlin Multiplatform for iOS
• Slint v1.5 — a modern, declarative GUI toolkit — released with Android support
 Slint v1.5 — a modern, declarative GUI toolkit — released with Android support
• I made LAN file sharing app using only Dart and Flutter
 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
 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
 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
 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 It All Goes Live: An Overview of Discord’s Streaming Technology
• How Khan Academy Scaled to 30 Million Users
 How Khan Academy Scaled to 30 Million Users
• Winning a hackathon, losing my sanity
 Winning a hackathon, losing my sanity
• Why software projects fail
 Why software projects fail
• Back End Developer Roadmap 2024
 Back End Developer Roadmap 2024
 Аналитика, маркетинг и монетизация
 Аналитика, маркетинг и монетизация
• Приложения с подпиской 2024 — отчет RevenueCat
• Google Play анонсирует новые функции для игр
• Как персонализация на основе ИИ выведет продвижение мобильных приложений на новый уровень
• Apple тестирует ИИ в своей рекламной платформе
• Apple снова разблокировала учетную запись Epic Games
• Аналитика нового продукта «под ключ»
• Turning organic success into long-term revenue
 Turning organic success into long-term revenue
• Abysmal revenue stats of 30K mobile apps show why devs keep pushing for subs
 Abysmal revenue stats of 30K mobile apps show why devs keep pushing for subs
 AI, Устройства, IoT
 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
 Using my new Raspberry Pi to run an existing GitHub Action
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.

 iOS
 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
 How to build a draggable bottom sheet with a scroll view in SwiftUI•
 Everything you need to know about Swift 5.10
 Everything you need to know about Swift 5.10•
 Concurrency Recipes
 Concurrency Recipes•
 How to Dynamically Construct Complex Predicates for SwiftData
 How to Dynamically Construct Complex Predicates for SwiftData•
 Aspect-Oriented Programming in Swift
 Aspect-Oriented Programming in Swift•
 Implementing a TV Guide with SwiftUI
 Implementing a TV Guide with SwiftUI•
 Exploring SwiftUI: Creating a Scope View using DragGesture
 Exploring SwiftUI: Creating a Scope View using DragGesture•
 Global actors in Swift
 Global actors in Swift•
 Using Apples OpenAPI Generator to Make and Mock Network Calls in SwiftUI
 Using Apples OpenAPI Generator to Make and Mock Network Calls in SwiftUI•
 Navigation between modules in iOS
 Navigation between modules in iOS•
 Understanding visionOS
 Understanding visionOS•
 Using @_silgen_name to call private Swift code and improve build times
 Using @_silgen_name to call private Swift code and improve build times•
 Tips and Considerations for Using Lazy Containers in SwiftUI
 Tips and Considerations for Using Lazy Containers in SwiftUI•
 Local SPM — Mastering Modularization with Swift Package Manager
 Local SPM — Mastering Modularization with Swift Package Manager•
 From Slow to Fast: Profiling SwiftUI Applications for Peak Performance
 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
 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 — Regions, Markers and Annotations and CameraPosition•
 MapKit with SwiftUI — Map Destination Persistence and MockData
 MapKit with SwiftUI — Map Destination Persistence and MockData•
 How to get started with Swift Macros
 How to get started with Swift Macros•
 Paginating SwiftData
 Paginating SwiftData•
 Do you know what view.layoutIfNeeded() actually does?
 Do you know what view.layoutIfNeeded() actually does?•
 Swift Playdate Examples: примеры разработки игр для Playdate на Swift
 Swift Playdate Examples: примеры разработки игр для Playdate на Swift•
 Swift Translate: автоматический перевод String Catalog
 Swift Translate: автоматический перевод String Catalog•
 Concurrency Recipes: проблемы Swift Concurrency
 Concurrency Recipes: проблемы Swift Concurrency Android
 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
 How to create Glovo-like main screen animation using Jetpack Compose•
 Kotlin Design Patterns: Abstract Factory Explained
 Kotlin Design Patterns: Abstract Factory Explained•
 Designing your account deletion experience with users in mind
 Designing your account deletion experience with users in mind•
 Downloadable and Preloaded Fonts on Android
 Downloadable and Preloaded Fonts on Android•
 State of Dependency Management in Android Studio
 State of Dependency Management in Android Studio•
 Hilt, ViewModels & Assisted Injection
 Hilt, ViewModels & Assisted Injection•
 A Weekend AI Project: Running LLaMA and Gemma AI Models on the Android Phone
 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
 Monetizing Marvels: A Developer’s Guide to In-App Purchases on Android•
 ANR in Android & its types
 ANR in Android & its types•
 A comprehensive guide to understand Kotlin Flows
 A comprehensive guide to understand Kotlin Flows•
 Going edge-to-edge with Compose without losing it
 Going edge-to-edge with Compose without losing it•
 The Night’s Watch: Safeguarding store operations
 The Night’s Watch: Safeguarding store operations•
 Trim, Transcode, Concatenate: Your Guide to Media3 Editing Libraries
 Trim, Transcode, Concatenate: Your Guide to Media3 Editing Libraries•
 How to Drag and Drop using Modifier.dragAndDropSource/Target - Jetpack Compose
 How to Drag and Drop using Modifier.dragAndDropSource/Target - Jetpack Compose•
 Unit Testing Tutorial for Android: Getting Started
 Unit Testing Tutorial for Android: Getting Started•
 Seven recipes to understand flows and asynchrony in Kotlin
 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
 Now in Android: 100 — Android 15 DP 1, Stable Studio Iguana, Cloud Photo Picker, and more•
 What’s new in Android Studio Iguana
 What’s new in Android Studio Iguana•
 Google for Games Developer Summit 2024
 Google for Games Developer Summit 2024•
 How to Create a Document Scanner App with MLKit
 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
 If You Think THIS Is a Best Practice, You’re WRONG in 99% of the Cases•
 The Missing Library of the Compose Multiverse
 The Missing Library of the Compose Multiverse•
 Making Data Visualizations More Accessible
 Making Data Visualizations More Accessible•
 Imperative, declarative, object oriented, functional: four of a Kotlin kind
 Imperative, declarative, object oriented, functional: four of a Kotlin kind•
 Appteka: альтернативный магазин приложений для Android
 Appteka: альтернативный магазин приложений для Android•
 Kotest: мощный, элегантный и гибкий фреймворк для тестирования Kotlin
 Kotest: мощный, элегантный и гибкий фреймворк для тестирования Kotlin•
 Legado: читалка для Android
 Legado: читалка для Android Кроссплатформа
 Кроссплатформа• Интеграция нативных SDK во Flutter-приложение
• Как быстро получать данные из ОС Аврора через интерфейс D-Bus во Flutter-приложении
• Что нового во Flutter 3.19
• Работа с Data Assets во Flutter
• Методы-расширения в Dart
• Коллекции во Flutter
•
 Making a 2.5D game using Flutter — Tutorial
 Making a 2.5D game using Flutter — Tutorial•
 Building a Flutter SDK Part 2: A Deep Dive Into pub.dev
 Building a Flutter SDK Part 2: A Deep Dive Into pub.dev•
 Flutter: Offline playback for video_player
 Flutter: Offline playback for video_player•
 How to manage Keystore Paths in Flutter (Android)
 How to manage Keystore Paths in Flutter (Android)•
 Goodbye PWA, Hello PWA — Apple And Progressive Web Apps
 Goodbye PWA, Hello PWA — Apple And Progressive Web Apps•
 Leveraging Key-Value Observing in Kotlin Multiplatform for iOS
 Leveraging Key-Value Observing in Kotlin Multiplatform for iOS•
 Slint v1.5 — a modern, declarative GUI toolkit — released with Android support
 Slint v1.5 — a modern, declarative GUI toolkit — released with Android support•
 I made LAN file sharing app using only Dart and Flutter
 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
 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
 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
 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 It All Goes Live: An Overview of Discord’s Streaming Technology•
 How Khan Academy Scaled to 30 Million Users
 How Khan Academy Scaled to 30 Million Users•
 Winning a hackathon, losing my sanity
 Winning a hackathon, losing my sanity•
 Why software projects fail
 Why software projects fail•
 Back End Developer Roadmap 2024
 Back End Developer Roadmap 2024 Аналитика, маркетинг и монетизация
 Аналитика, маркетинг и монетизация• Приложения с подпиской 2024 — отчет RevenueCat
• Google Play анонсирует новые функции для игр
• Как персонализация на основе ИИ выведет продвижение мобильных приложений на новый уровень
• Apple тестирует ИИ в своей рекламной платформе
• Apple снова разблокировала учетную запись Epic Games
• Аналитика нового продукта «под ключ»
•
 Turning organic success into long-term revenue
 Turning organic success into long-term revenue•
 Abysmal revenue stats of 30K mobile apps show why devs keep pushing for subs
 Abysmal revenue stats of 30K mobile apps show why devs keep pushing for subs AI, Устройства, IoT
 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
 Using my new Raspberry Pi to run an existing GitHub Action← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
 
          