Мобильная разработка за неделю #520 (18 — 24 декабря)

В этом дайджесте «условное ценообразование» для подписок и как управлять сложностью состояния, еще одно проигранное дело Google и как компания смогла проиграть там, где Apple выиграла, как почувствовать себя кассиром, анимации переходов во Flutter, рефакторинг кода и многое другое!

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

c2gd6z_ehmsw9wys04vyfj9g_aw.png

f1930ac4945596eb9707bc7a01bc5bdc.pngiOS

• Custom Segmented Control
• Beeper отказывается от борьбы с Apple и выкладывает код в open source
• Вопросы с собеседований: коллекции в Swift
• Поваренная книга SwiftUI: состояние, привязка, ObservableObject и ObservedObject
• В Internet Archive нашли старые приложения и игры из TestFlight
• Apple представила «условное ценообразование» для подписок
• 377ae0333d0f4b7b97307c9eea5ee21a.gifPlain Swift — a simple Swift IDE for Windows
• 377ae0333d0f4b7b97307c9eea5ee21a.gifShould you add final to all your Swift classes?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifDecoupled stacked sheet navigation with multiple modals in SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifIntegrating Haptic Feedback In SwiftUI Projects
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHierarchical background styles in SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifStop using MVVM and abusing Observable classes in SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCoordinator Pattern for iOS Apps
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWhy I chose The Composable Architecture for SwiftUI and never looked back
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMastering MapKit in SwiftUI. Interactions.
• 377ae0333d0f4b7b97307c9eea5ee21a.gifPreparing your App for VoiceOver: Accessibility Actions
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to get the most played Apple Music songs and albums using Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifQuick Search with SwiftUI Searchable
• 377ae0333d0f4b7b97307c9eea5ee21a.gifXcode 15«s Hidden Treasure: Logging Like a Pro 2024
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwift: Singleton Pattern
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe Case Against [unowned self]
• 377ae0333d0f4b7b97307c9eea5ee21a.gifiOS UI Testing with Deep Links
• 377ae0333d0f4b7b97307c9eea5ee21a.gifScalable and Modular System Design for the simplest iOS App
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCreating a Scrolling Parallax Effect with SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwiftUI View Models: Lifecycle Quirks
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBecome More Senior iOS Developer with these 4 Xcode Tips & Tricks
• 377ae0333d0f4b7b97307c9eea5ee21a.gif❸☻- Simulation Emojimix on Xcode
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngBuilding Complex Scroll Animations With New iOS 17 APIs
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftUI Widgets | App Groups | Charts | Expense Tracker App
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow To Create A Submission Form In Xcode 15
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngThis is the CRAZIEST Swift code you«ll ever see
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftData CloudKit
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftUI Animated Toasts
• 96716bcb926741e79bb1c284a88083ca.pngBadgeIcon: системные иконки для SwiftUI
• 96716bcb926741e79bb1c284a88083ca.pngGoogle AI SDK for Swift: генеративный ИИ для ваших приложений

e1a3cf2a8b65a0da69bbdd5c0ad040fe.pngAndroid

• Как управлять сложностью состояния — Сергей Опивалов
• Создаем пассивный UI в Jetpack Compose
• Подключение сканера к Android или как почувствовать себя кассиром
• Stone. Квалификаторы и идентификаторы
• Как устроен Gradle Config Cache. Лучшие Практики. Интервью с инженером команды Gradle
• Google выплатит $700 млн в еще одном споре о Play Store + Все изменения, которые произойдут в Google Play и загрузке приложений
• Что нового в AOSP 14
• Вопросы с собеседований: для чего нужны inline функции
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAnimating Inside and Outside the Box with Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe ViewModel«s leaked Flow collectors problem
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGlassmorphic Bottom Navigation in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding Passive UI in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifKandy: the new Kotlin plotting library by JetBrains
• 377ae0333d0f4b7b97307c9eea5ee21a.gifDon«t use var in enums
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnleashing WebSocket in Android?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifEffect Handlers in Jetpack Compose: A Complete Guide
• 377ae0333d0f4b7b97307c9eea5ee21a.gifKotlin under the hood: how to get rid of recursion
• 377ae0333d0f4b7b97307c9eea5ee21a.gifForeground Services in Android 14: What«s Changing?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMulti-Module with Clean Architecture
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCrash Course on the Android UI Layer | Part 2
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFortifying Android Apps: A Comprehensive Guide to Securing Your App and Codebase with Kotlin
• 377ae0333d0f4b7b97307c9eea5ee21a.gifState Management in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifLive Streaming and Audio Equalizer with ExoPlayer in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAndroid Thread & Relation With Coroutine
• 377ae0333d0f4b7b97307c9eea5ee21a.gifDemystifying Kotlin: Understanding the Inner Workings of Inline Functions
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to handle single-event in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAndroid Launch Modes Explained
• gtu1iaz0-ajkbqpeq8n6dmql4zq.png(W)rap — Android Developers Backstage
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngIntroducing Gemini, Google at NeurIPS 2023, and more dev news!
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngPerformance Optimization with @Stable and @Immutable in Jetpack Compose
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngDemystifying Pixel Shaders (AGSL)
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngDo You Have to Learn Clean Architecture as a Beginner?
• 96716bcb926741e79bb1c284a88083ca.pngNanoKt: библиотека расширений для Android и Kotlin
• 96716bcb926741e79bb1c284a88083ca.pngLudwig: набор UI-компонентов для Jetpack Compose
• 96716bcb926741e79bb1c284a88083ca.pngAndroid-PiP: реализация «картинки в картинке»

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
• 377ae0333d0f4b7b97307c9eea5ee21a.gifJetpack Preferences DataStore in Kotlin Multiplatform
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter and SQLite: A Deep Dive into Local Data Persistence
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGlobe (a Flutter & Dart deployment platform) is now in public preview
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow we built it: Ask Dash — A generative AI Flutter application
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngA novel architecture for Multiplatform applications with Pavel Lahoda

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

• 13 советов для начинающих разработчиков, которые уже прочитали все остальные советы
• Рефакторинг кода, и как его не бояться
• Cоздание идеальных вкладок
• Как подготовиться к собеседованию по System Design мобильному разработчику
• Mobile Web, навигация и при чем тут Nginx
• «Они убивают Lottie — молодцы!»
• История разработки приложения для складных смартфонов Samsung. Часть 2 — гайдлайны
• Модульная запутанность. Как распарсить одну модель в разных модулях
• Оптимизация и автоматизация в бэкенд-разработке мобильных приложений: как ускорить разработку в четыре раза
• Разработка Авто.ру и роль руководителя в команде
• Что такое observability мобильного приложения
• Мобильные релизы в Авито
• Силиконовая Долина глазами российского разработчика
• Релокация на Кипр
• 377ae0333d0f4b7b97307c9eea5ee21a.gifRedesigning our global order tracking experience
• 377ae0333d0f4b7b97307c9eea5ee21a.gifI«ve vastly misunderstood the Single Responsibility Principle
• 377ae0333d0f4b7b97307c9eea5ee21a.gifEmpirically supported code review best practices
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to Scale an App to 10 Million Users on AWS
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWe Can«t Hire You

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

• Эпический вопрос: как Google проиграл там, где Apple выиграла
• 5 трендов в области маркетинга приложений 2023 — и их проекция на 2024
• Краткое руководство по анализу данных и проведению продуктовых исследований
• Claim, социальная сеть, позволяющая пользователям зарабатывать и обмениваться вознаграждениями, привлекает $4 млн
• Spill, инклюзивная альтернатива X, запускает бету на iOS и Android
• Location — cоздатели Zenly выпускают приложение, похожее на Zenly
• Маркетологи в мобайле. Итоги года 2023. Часть 1
• Топ быстрорастущих приложений в России в декабре
• Итоги года и планы на 2024 от Adjust
• Количество пользователей социальной сети Jagat превысила 10 миллионов
• Спрос на приложения для ментального здоровья почти сошел на нет
• Самые скачиваемые приложения в мире в ноябре 2023
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUsing campaign links to track impressions, downloads, and sales

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

• Управляем школьниками, не привлекая внимание санитаров
• Как пользователи убедили Chevrolet продать им машину за 100 рублей — или проблемы использования ИИ-чатботов
• NORVI Arita: добавляем SD картридер и веб-интерфейс (почти контроллер мечты)
• Сравнение популярных брокеров MQTT с открытым исходным кодом
• Apple разработала прорывной метод запуска LLM на устройствах с ограниченной памятью
• Apple останавливает продажи Apple Watch Series 9/Ultra 2 из-за нарушений патентов

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

© Habrahabr.ru