Мобильная разработка за неделю #585 (21 — 27 апреля)

В новом дайджесте продолжаем изучение архитектурного линтинга и CI/CD, исследуем «приключение на 20 минут» с legacy-кодом и оправдания для вайб-кодинга, SwiftUI Instruments, скрытные ботнеты, выпуск приложений Spotify и многое другое. Заходите!

abo52qhqg8dx9p6w9yawu35kjbq.jpeg

Подписывайтесь на мой Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков.

f1930ac4945596eb9707bc7a01bc5bdc.pngiOS

• Архитектурный линтинг для Swift: часть 3 + часть 2
• Отлаживаем приложение вместе со SwiftUI Instruments
• Введение в Measurement в Swift
• Работа в Booking, жизнь в Амстердаме, автогонки в Европе
• Многопоточность с нуля на примере пиццы
• Организация и поддержка нативных UI-тестов в iOS
377ae0333d0f4b7b97307c9eea5ee21a.gifIs There A Better AsyncButton?
377ae0333d0f4b7b97307c9eea5ee21a.gifUsing NavigationPath with TabView in SwiftUI
377ae0333d0f4b7b97307c9eea5ee21a.gifAutomatic Dependency Injection (DI) in Swift 6 to make your code clean
377ae0333d0f4b7b97307c9eea5ee21a.gifSwift 6.2: A first look at how it«s changing Concurrency
377ae0333d0f4b7b97307c9eea5ee21a.gifA fast, lightweight replacement for SwiftData
377ae0333d0f4b7b97307c9eea5ee21a.gifHow to Build a Native QR Code Generator for iPhone with SwiftUI
377ae0333d0f4b7b97307c9eea5ee21a.gifReading data from HealthKit in a SwiftUI app
377ae0333d0f4b7b97307c9eea5ee21a.gifSee How Many Times Your SwiftUI Views Redraw Using Instruments
377ae0333d0f4b7b97307c9eea5ee21a.gifSwiftUI: Inline Editable Table
377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding Type‑Safe, High‑Performance SwiftData / Core Data Models
377ae0333d0f4b7b97307c9eea5ee21a.gifUsing singletons in Swift 6
377ae0333d0f4b7b97307c9eea5ee21a.gifHow to persist navigation state in SwiftUI
377ae0333d0f4b7b97307c9eea5ee21a.gifNavigationRouter: A simple stack-based navigation system for SwiftUI
377ae0333d0f4b7b97307c9eea5ee21a.gifHow to Add Tap to Copy with UIPasteboard in SwiftUI
377ae0333d0f4b7b97307c9eea5ee21a.gifGithub Actions for iOS project
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftUI Inline Toasts — Xcode 16
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSpecial Effects with SwiftUI Text
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngMastering SwiftUI Transitions — Custom & Built-in Animations
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngBuild a Custom Location Picker in SwiftUI: Search & Map Interactions
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftUI — Auto / Manual Scrolling Infinite Carousel in 4 Minutes — Xcode 16
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngVideos from try! Swift Tokyo 2025
96716bcb926741e79bb1c284a88083ca.pngAAInfographics — декларативный фреймворк для создания графиков
96716bcb926741e79bb1c284a88083ca.pngSnapshotTestingMacros — макросы для генерации снепшотов из функций

e1a3cf2a8b65a0da69bbdd5c0ad040fe.pngAndroid

• CI/CD по кнопке: как мы автоматизировали сборку SampleApp для SDK RuStore
• Обновляем AOSP-приложение «Контакты», или Чем обернулось «приключение на 20 минут» с legacy-кодом
• Как запустить локальную LLM (AI) в Android Studio
• Content Based Theme в Android приложении
• Разработка SDK
• Прожарка на код-ревью от Яндекса
• Алиса, открой багажник!
• Зачем нужен виртуальный дисплей в Android
• Находим и увольняем low-перформеров
• Опубликована программа I/O 2025
377ae0333d0f4b7b97307c9eea5ee21a.gifExploring Jetpack Compose: DockedSearchBar
377ae0333d0f4b7b97307c9eea5ee21a.gifMaps in Jetpack Compose — A beginner«s guide
377ae0333d0f4b7b97307c9eea5ee21a.gifThe Story Behind K2 Mode and How It Works
377ae0333d0f4b7b97307c9eea5ee21a.gifConfiguring multiple SQLite databases in Android with SQLDelight 2
377ae0333d0f4b7b97307c9eea5ee21a.gifLint Be Gone: Speed Up Your Android Release APK Builds
377ae0333d0f4b7b97307c9eea5ee21a.gifHow to have «Crystal Clear Certificates»: Securing your Android Apps using Certificate Transparency
377ae0333d0f4b7b97307c9eea5ee21a.gifLeveraging Sealed Classes and Interfaces for Better Domain Modeling
377ae0333d0f4b7b97307c9eea5ee21a.gifKotlin Coroutines: The real difference between Job.cancel () and Scope.cancel ()
377ae0333d0f4b7b97307c9eea5ee21a.gifUnderstanding Execution Order in Jetpack Compose: DisposableEffect, LaunchedEffect, and Composables
377ae0333d0f4b7b97307c9eea5ee21a.gifCollapsing AppBar with Scroll Effect in Jetpack Compose
377ae0333d0f4b7b97307c9eea5ee21a.gifKotlin Generics Explained: Once Upon a Type…
377ae0333d0f4b7b97307c9eea5ee21a.gifHow I Use Internal Testing to Ship Production-Ready Android Apps
377ae0333d0f4b7b97307c9eea5ee21a.gifHow Dropbox leverages testing to maintain high level of trust at scale
377ae0333d0f4b7b97307c9eea5ee21a.gifWhat«s new in the Jetpack Compose April »25 release
377ae0333d0f4b7b97307c9eea5ee21a.gifAt the Mountains of Madness with Jetpack Compose
377ae0333d0f4b7b97307c9eea5ee21a.gifWrite Testable Time-Dependent Coroutine Code in Kotlin: Avoid System.currentTimeMillis
377ae0333d0f4b7b97307c9eea5ee21a.gifTOP 10 Live Data Questions (2025)
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngDeveloping for the SDK Runtime
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngNow in Android: 115 — Gemini in Android Studio, Enhancing Safety and Security, and more
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngThe 3 Biggest Coding Mistakes I Made In My Android Projects
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngFull Guide to Testing APIs on Android & KMP With Ktor MockEngine
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow Junie Helps You Code Faster with Kotlin in IntelliJ IDEA
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngDouble Dispatch: Prelude to the Visitor Pattern
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngWhat if your IDE could talk back… and help? Junie by JetBrains is here.
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngWhy did my build fail? Using AI to troubleshoot faster with Failure Summaries
96716bcb926741e79bb1c284a88083ca.pngSoundRemote — воспроизведение музыки с PC на Android
96716bcb926741e79bb1c284a88083ca.pngAstraCrypt — шифрование и сокрытие файлов
96716bcb926741e79bb1c284a88083ca.pngLearn Kotlin Flow — реальные примеры работы с Kotlin Flow

malx8hbgozt6lee8rmxmg96_s6a.pngКроссплатформа

• Локализация Flutter приложения на сервере
377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter | Understanding InheritedWidget
377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter Hero Widget and PageRouteBuilder Animation
377ae0333d0f4b7b97307c9eea5ee21a.gifStop Using MediaQuery for Responsiveness in Flutter
377ae0333d0f4b7b97307c9eea5ee21a.gifCreate a Student–Tutor Booking App with Flutter Calendar
377ae0333d0f4b7b97307c9eea5ee21a.gifTesting Business Logic with Either in Dart: Why You Should Try It

7081c634ec176ab6b953d9d19e82a09a.pngРазработка

• Вайб кодинг — не оправдание для некачественной работы
• Самодельная мобильная лаборатория из старого мультиметра и подручного телефона
• Закулисный взгляд на то, как Spotify выпускает приложения: часть 1
• Ох уж эти скрытные ботнеты
• Optional vs Nullable на стыке технологий
• Интеграция JavaScript в нативные мобильные приложения для криптотрейдинга: нестандартный опыт и технические решения
• Сделай удобно: подборка UI/UX-кейсов из цифровых и нецифровых продуктов (#13)
• Offline First в мобильных приложениях. CRUD на стороне клиента
• Разработчик и стартап: работать | основать | избегать?
• Чего боится твой тимлид?
• Как прогнозируют погоду в 2025 году — ML, Fortran и Big Data
• Tracer стал доступен для ОС Аврора
• Supabase получила еще $200 млн
• Монотонный стек: мощный инструмент для оптимизации алгоритмов
377ae0333d0f4b7b97307c9eea5ee21a.gifClaude Code: Best practices for agentic coding
377ae0333d0f4b7b97307c9eea5ee21a.gifLessons from building and maintaining distributed systems at scale
377ae0333d0f4b7b97307c9eea5ee21a.gifHow I created UI with ChatGPT«s new image generator (4o)
377ae0333d0f4b7b97307c9eea5ee21a.gifWe Interviewed 100 Eng Teams. The Problem With Modern Engineering Isn«t Speed. It«s Chaos.
377ae0333d0f4b7b97307c9eea5ee21a.gifStop Writing If-Else Trees: Use the State Pattern Instead
377ae0333d0f4b7b97307c9eea5ee21a.gifAI Horseless Carriages
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow to Embed HTML5 Games in Apps & Grow App Revenue
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngCode Your Own Llama 4 LLM from Scratch — Full Course
gtu1iaz0-ajkbqpeq8n6dmql4zq.pngEssential Machine Learning and AI Concepts Animated

509dc9bde69347ecbe0c21ff2973d7e7.jpgАналитика, маркетинг и монетизация

• Все знают, где ты находишься — можешь убедиться сам
• OpenAI может купить Chrome
• Game On, Telegram: как мессенджер превращается в игровую платформу будущего
• Сколько я заработал в RuStore и как Роскомнадзор продвигал мое приложение
• Маркетологи в мобайле: Алексей Фомин (Head of Performance Marketing, Бургер Кинг)
• Байесовские А/Б-тесты: множественные сравнения
• Chess.com достиг 200 млн пользователей
• Европейская комиссия оштрафовала Apple на $500 млн за нарушение DMA
• I******* запускает свой клон CapCut — редактор видео Edits

8538129f5e7b404a720121cb9c3814db.jpgAI, Устройства, IoT

• Мы делали презентации 35 лет, а потом пришла нейросеть
• Пайплайн распознавания номеров транспортных средств: как это устроено
• Что нового у Wiren Board: модуль DALI, датчик присутствия в WB-MSW, новое реле в подрозетник
• Как мы в Авито предсказываем категории объявлений по описанию
• Cluely получил $5.3 млн на создание ИИ-платформы «списывания для всего»

← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.

Habrahabr.ru прочитано 6714 раз