Мобильная разработка за неделю #538 (13 — 19 мая)

В новом дайджесте обсуждаем прошедшую I/O, проводим карантин UI-тестов и смотрим как Notion ускорил запуск на Android в 2 раза, отмечаем новые Flutter и Dart, боремся с догмами программирования и многое другое. Подключайтесь!

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

lnual9x4-amhko1hy73xmi_fz_k.png

f1930ac4945596eb9707bc7a01bc5bdc.pngiOS

• Карантин UI-тестов в iOS
• Просим ИИ сделать рефакторинг Swift кода
• SwiftUI: наконец-то пора? Опыт разработки на SwiftUI в контексте UIKit приложения
• Что нам показывают карты
• Почему получение пакетов в Swift Package Manager занимает слишком много времени
• Как зарегистрировать Apple Developer в App Store для физических лиц. Гайд 2024 года •
• Добавляем объём в visionOS-приложение
• SwiftUI уроки (часть 12)
• TextField с автодополнением
• SwiftUI-навигация: просто, нативно и декларативно
• Удивительный мир внутри .ipa
• Core Motion framework в финансовых приложениях
• Как Apple боролась с мошенничеством в App Store в 2023
• Вышла iOS 17.5 с поддержкой веб-распространения приложений
• 377ae0333d0f4b7b97307c9eea5ee21a.gifApple started cheating me out of App Store bundle purchases
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUse and Then Reduce Open Source Dependencies
• 377ae0333d0f4b7b97307c9eea5ee21a.gifA Deep Dive into Dynamic Widget — Swiggy«s Server Driven UI System
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to reduce iOS App Size
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to hide API keys in Xcode code Swift UI — The most efficient way
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwift Concurrency: Safeguarding Data with @Sendable and Actors
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAnimations: Bringing the Host Passport to Life on iOS
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMigrating from CocoaPods to Tuist at Playtomic
• 377ae0333d0f4b7b97307c9eea5ee21a.gifPreventing Retain Cycles in Automated Tests Using addTearDown
• 377ae0333d0f4b7b97307c9eea5ee21a.gifPointfree«s SyncUps App: A Great Example Architecture for a SwiftUI App
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe Dark Side of Unidirectional Architectures in Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to profile your app«s performance and Main Thread usage with Instruments and os_signposts
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBoost Performance by Over 100x Using the Accelerate Framework
• 377ae0333d0f4b7b97307c9eea5ee21a.gifReact to network status updates in SwiftUI using AsyncSequence
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding a Swift package using the Swift 6 language mode
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUsing materials with SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifRefactoring to TipKit from AppStorage and Custom Views in SwiftUI
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngUnlock the power of grammatical agreement
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngAnimate symbols in your app
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngInspectors in SwiftUI: Discover the details
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngDemystify SwiftUI performance
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftUI Stacked ScrollView
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSyncing ScrollView«s + Swipe To Dismiss
• 96716bcb926741e79bb1c284a88083ca.pngSwiftSecurity — современный фреймворк для Keychain API
• 96716bcb926741e79bb1c284a88083ca.pngAtoms — атомарное управление состоянием и инъекция зависимостей для SwiftUI

e1a3cf2a8b65a0da69bbdd5c0ad040fe.pngAndroid

• Второй пошел: Google опубликовала новую бета-версию Android 15
• Как я доказывал Google, что мне нужны данные юзеров, но я не скамер
• Notion на Android теперь запускается в два раза быстрее
• Как мы реализовали кнопку со свайпом на Jetpack Compose
• Как мы отслеживаем просадки FPS в Альфа-Мобайл?
• Как написать свой клиент для YouTube, не привлекая внимания санитаров
• Опыт публикации Андроид приложения в Google Play независимым разработчиком в 2024 году
• Копаемся в встроенном приложении камеры старого Xiaomi. Часть 2
• Открываем AndroidFragment: перенос навигации из Фрагментов в Compose
• Путешествие к центру Композиции
• Scout: новый фреймворк для ускоренного и безболезненного управления зависимостями
• Компиляторные плагины: модификация и анализ Сompose
• Как я code coverage внедрял да Gradle plugin для baseline писал
• Больше приложений в Android для автомобилей
• Project Gameface вышел на Android
• Более частые обновления для Android Studio
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCutting some Slack, for leaks and giggles
• 377ae0333d0f4b7b97307c9eea5ee21a.gifPreparing for K2
• 377ae0333d0f4b7b97307c9eea5ee21a.gifLeveraging Lazy Modules and Background Loading in Kotlin with Koin
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAn Updated Primer on Android Navigation
• 377ae0333d0f4b7b97307c9eea5ee21a.gifConscious Compose optimization 2: Tackling composition
• 377ae0333d0f4b7b97307c9eea5ee21a.gifExploring Advanced MVI Pattern in Android App Development
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe Art of Logging in Android Apps
• 377ae0333d0f4b7b97307c9eea5ee21a.gif«if vs let» in Kotlin
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAndroid: Use Cases hell in MVVM architecture
• 377ae0333d0f4b7b97307c9eea5ee21a.gifKotlin Design Patterns: Flyweight
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnderstanding IPC in Android
• 377ae0333d0f4b7b97307c9eea5ee21a.gifLet Kotlin do the code for you — Part III: Mockito, Mockk, and Code Generation
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCompose Navigation 2.8.0
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAndroid Support for Kotlin Multiplatform
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGoogle I/O 2024 — Android Keynotes
• 377ae0333d0f4b7b97307c9eea5ee21a.gifInjecting Composables with Dagger without losing it
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMastering Compose: Custom Layout and Scoped Modifiers
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCompose Preview Screenshot Testing
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWhat«s New in Jetpack Compose at Google I/O 2024
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngWhat«s new in Android
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngWhat«s new in Google Play
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngВсе видео Google I/O 2024
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngМобайл на Google I/O 2024
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngВсе воркшопы Google I/O 2024
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngДизайн на Google I/O 2024
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngType-Safe Navigation with the OFFICIAL Compose Navigation Library
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow to Implement a Shared Element Transition In Jetpack Compose
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngMastering Kotlin in 7 Steps
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngLooking Forward to Kotlin 2.0
• 96716bcb926741e79bb1c284a88083ca.pngTetherFi — шаринг интернета
• 96716bcb926741e79bb1c284a88083ca.pngNavigation Compose Type — type-safe аргументы для Jetpack Navigation Compose

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

• DivKit теперь и для Flutter. Рассказываем об особенностях BDUI-фреймворка Яндекса
• Почему я верю в востребованность кроссплатформы и Flutter в частности?
• Ключи во Flutter
• Вышел Dart 3.4
• Flutter 3.22: что нового
• Навигация в приложениях Flutter: разбираем Navigator, Router и лучшие библиотеки
• Flutter 3.22 — Что нового во Flutter?
• Анонс Dart 3.4
• Flutter и натив. Пример с Яндекс OAuth
• Полнодуплексное соединение во Flutter
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to publish a Kotlin Multiplatform iOS app on App Store with GitHub Actions
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter: Choosing Mobile UI Tests Automation Tool
• 377ae0333d0f4b7b97307c9eea5ee21a.gifI built the same app with Flutter, React Native, and Ionic
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSay Goodbye to Future.wait ([]) in Dart
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to use Coil in Compose Multiplatform
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGet Dynamic Widget Size in Flutter
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow to Share ViewModels in Compose Multiplatform (with Dependency Injection!)

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

• Фокус на безопасность мобильных приложений
• Мантры программирования — это не догмы, а выражения
• Большой обзор обновлений iOS и Android
• Особенности построения интерфейса для разных платформ
• Грабим Дома на Собеседовании в Google •
• Avito QA meetup
• JetBrains выпускает Aqua — IDE для автоматизации тестирования
• Google открывает доступ к Home API
• Самая мощная ИИ-модель для создания изображений и чат-боты для работы, учёбы и поиска. Что представил Google на I/O 2024
• Итоги I/O 2024
• Developer Keynote Google I/O 2024: официальная поддержка KMP, развитие Gemini и AI в Андроиде
• Как изменились зарплаты айтишников за 2023 год
• Как я слил 3 млн руб и 2 года на мобильное приложение
• 377ae0333d0f4b7b97307c9eea5ee21a.gifYou probably don«t need microservices
• 377ae0333d0f4b7b97307c9eea5ee21a.gifStand Out and Dare to Disagree
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngQuantum Computing Course — Math and Theory for Beginners

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

• Топ быстрорастущих приложений в России в мае
• Маркетологи в мобайле: Ярослава Адаменко (М.Видео и Эльдорадо)
• Тенденции рынка игровых приложений от Adjust и AppLovin
• В App Store растет Airbuds, виджет с музыкой друзей
• Microsoft запустит мобильный магазин игр июле

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

• GPT-4o: больше мощи, но меньше цены. Почему так и что на самом деле умеет модель?
• Открыт конкурс Gemini API с призовым фондом в $3 млн
• Google запускает Firebase Genkit — открытый фреймворк для создания приложений на базе ИИ

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

© Habrahabr.ru