Мобильная разработка за неделю #530 (11 — 17 марта)

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

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

g0q2zvqotpndygeyqxpjcrgxt_0.png

f1930ac4945596eb9707bc7a01bc5bdc.pngiOS

• Разработка, управляемая тестами (TDD), для исправления ошибок
• SwiftUI уроки (часть 4)
• Вы можете сделать пейвол в алерте. Но, вероятно, не стоит.
• Cocoapods pod install без интернета на CI при использовании Tuist
• Моменты неотзывчивости iOS-приложений: как найти и исправить
• Swift-уроки: cоздание горизонтального меню с индикатором
• Apple разрешает распространение приложений с сайтов
• Поваренная книга SwiftUI: лучшие практики управления состояниями в SwiftUI
• Вышла VisionOS 1.1
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to build a draggable bottom sheet with a scroll view in SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifEverything you need to know about Swift 5.10
• 377ae0333d0f4b7b97307c9eea5ee21a.gifConcurrency Recipes
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to Dynamically Construct Complex Predicates for SwiftData
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAspect-Oriented Programming in Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifImplementing a TV Guide with SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifExploring SwiftUI: Creating a Scope View using DragGesture
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGlobal actors in Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUsing Apples OpenAPI Generator to Make and Mock Network Calls in SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifNavigation between modules in iOS
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnderstanding visionOS
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUsing @_silgen_name to call private Swift code and improve build times
• 377ae0333d0f4b7b97307c9eea5ee21a.gifTips and Considerations for Using Lazy Containers in SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifLocal SPM — Mastering Modularization with Swift Package Manager
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngFrom Slow to Fast: Profiling SwiftUI Applications for Peak Performance
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftUI Performance Optimisation: How to manage Data Flow and UI Updates in your iOS and macOS apps
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngMapKit with SwiftUI — Regions, Markers and Annotations and CameraPosition
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngMapKit with SwiftUI — Map Destination Persistence and MockData
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow to get started with Swift Macros
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngPaginating SwiftData
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngDo you know what view.layoutIfNeeded () actually does?
• 96716bcb926741e79bb1c284a88083ca.pngSwift Playdate Examples: примеры разработки игр для Playdate на Swift
• 96716bcb926741e79bb1c284a88083ca.pngSwift Translate: автоматический перевод String Catalog
• 96716bcb926741e79bb1c284a88083ca.pngConcurrency Recipes: проблемы Swift Concurrency

e1a3cf2a8b65a0da69bbdd5c0ad040fe.pngAndroid

• Автоматизируем рутину в 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 обеспечивает получение точных данных об ориентации устройства
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to create Glovo-like main screen animation using Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifKotlin Design Patterns: Abstract Factory Explained
• 377ae0333d0f4b7b97307c9eea5ee21a.gifDesigning your account deletion experience with users in mind
• 377ae0333d0f4b7b97307c9eea5ee21a.gifDownloadable and Preloaded Fonts on Android
• 377ae0333d0f4b7b97307c9eea5ee21a.gifState of Dependency Management in Android Studio
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHilt, ViewModels & Assisted Injection
• 377ae0333d0f4b7b97307c9eea5ee21a.gifA Weekend AI Project: Running LLaMA and Gemma AI Models on the Android Phone
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMonetizing Marvels: A Developer«s Guide to In-App Purchases on Android
• 377ae0333d0f4b7b97307c9eea5ee21a.gifANR in Android & its types
• 377ae0333d0f4b7b97307c9eea5ee21a.gifA comprehensive guide to understand Kotlin Flows
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGoing edge-to-edge with Compose without losing it
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe Night«s Watch: Safeguarding store operations
• 377ae0333d0f4b7b97307c9eea5ee21a.gifTrim, Transcode, Concatenate: Your Guide to Media3 Editing Libraries
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to Drag and Drop using Modifier.dragAndDropSource/Target — Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnit Testing Tutorial for Android: Getting Started
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSeven recipes to understand flows and asynchrony in Kotlin
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngNow in Android: 100 — Android 15 DP 1, Stable Studio Iguana, Cloud Photo Picker, and more
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngWhat«s new in Android Studio Iguana
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngGoogle for Games Developer Summit 2024
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow to Create a Document Scanner App with MLKit
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngIf You Think THIS Is a Best Practice, You«re WRONG in 99% of the Cases
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngThe Missing Library of the Compose Multiverse
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngMaking Data Visualizations More Accessible
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngImperative, declarative, object oriented, functional: four of a Kotlin kind
• 96716bcb926741e79bb1c284a88083ca.pngAppteka: альтернативный магазин приложений для Android
• 96716bcb926741e79bb1c284a88083ca.pngKotest: мощный, элегантный и гибкий фреймворк для тестирования Kotlin
• 96716bcb926741e79bb1c284a88083ca.pngLegado: читалка для Android

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

• Интеграция нативных SDK во Flutter-приложение
• Как быстро получать данные из ОС Аврора через интерфейс D-Bus во Flutter-приложении
• Что нового во Flutter 3.19
• Работа с Data Assets во Flutter
• Методы-расширения в Dart
• Коллекции во Flutter
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMaking a 2.5D game using Flutter — Tutorial
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding a Flutter SDK Part 2: A Deep Dive Into pub.dev
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter: Offline playback for video_player
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to manage Keystore Paths in Flutter (Android)
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGoodbye PWA, Hello PWA — Apple And Progressive Web Apps
• 377ae0333d0f4b7b97307c9eea5ee21a.gifLeveraging Key-Value Observing in Kotlin Multiplatform for iOS
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSlint v1.5 — a modern, declarative GUI toolkit — released with Android support
• 377ae0333d0f4b7b97307c9eea5ee21a.gifI made LAN file sharing app using only Dart and Flutter

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

• Первый легендарный мобильный GPU: каким был PowerVR MBX Lite? Пишем игру-демку про «жигули» с нуля
• Discord открывает SDK для разработки встроенных игр и приложений
• Как и где практиковаться начинающему мобильному разработчику
• Как искать отличных Senior-инженеров
• Приложение викторины: внедрение Cardoteka и основные паттерны проектирования с Riverpod
• Как принимать решения, строить команды и выбирать инструменты разработки — Павел Щедухин (Ozon Tech)
• Публичное собеседование по System Design
• Мобильная инфраструктура. Взгляд изнутри
• BDUI — удовольствие или боль?
• BDUI на 100%: управляем шиммерами с бэкенда
• Stashpad запускает блокнот для разработчиков с совместной работой
• В 2023 году Google выплатил $10 млн за поиск уязвимостей
• Как Google испортил свою открытую культуру и скомпрометировал свой продукт
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe most important goal in designing software is understandability
• 377ae0333d0f4b7b97307c9eea5ee21a.gifYou«re not a weak developer if you don«t always show off your technical excellence
• 377ae0333d0f4b7b97307c9eea5ee21a.gifContext-switching — one of the worst productivity killers in the engineering industry
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow It All Goes Live: An Overview of Discord«s Streaming Technology
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow Khan Academy Scaled to 30 Million Users
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWinning a hackathon, losing my sanity
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWhy software projects fail
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngBack End Developer Roadmap 2024

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

• Приложения с подпиской 2024 — отчет RevenueCat
• Google Play анонсирует новые функции для игр
• Как персонализация на основе ИИ выведет продвижение мобильных приложений на новый уровень
• Apple тестирует ИИ в своей рекламной платформе
• Apple снова разблокировала учетную запись Epic Games
• Аналитика нового продукта «под ключ»
• 377ae0333d0f4b7b97307c9eea5ee21a.gifTurning organic success into long-term revenue
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAbysmal revenue stats of 30K mobile apps show why devs keep pushing for subs

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

• KC868-A8M: 8×8, GSM, RTC и прочие плюшки (плюс CAN для любителей)
• Протокол защищенного обмена для индустриальных систем CRISP: поддержка в устройствах Рутокен
• Microsoft открывает бесплатный доступ к GPT-4 Turbo в Copilot
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUsing my new Raspberry Pi to run an existing GitHub Action

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

© Habrahabr.ru