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

В этом дайджесте для мобильных разработчиков листаем страницы и повышаем качество кода, защищаем и исследуем код, исследуем новый релиз Flutter, делаем дизайн-систему, автотесты, определяем «производительность» рекламных сетей.

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

soeiudkdcgs1dx9-tsyom9p9wbg.jpeg

f1930ac4945596eb9707bc7a01bc5bdc.pngiOS

• 10 быстрых советов по повышению качества iOS-кода: часть 1 + часть 2
• Добавляем подсказки в приложение с помощью TipKit
• Листаем цифровые страницы: UIPageViewController
• Рефакторинг Swift
• Apple добавит поддержку RCS в следующем году
• Отображение панели выбора фотографий в SwiftUI
• iOS 18 должна стать самой «амбициозной и неотразимой»
• Поваренная книга SwiftUI: обрезка представлений
• 377ae0333d0f4b7b97307c9eea5ee21a.gifProgress toward the Swift 6 language mode
• 377ae0333d0f4b7b97307c9eea5ee21a.gifOn-Crash Backtraces in Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwiftUI: Displaying a Photo Picker
• 377ae0333d0f4b7b97307c9eea5ee21a.gifLocalisation in Xcode 15
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwiftUI at Airbnb: A Case Study
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBeyond the Code: Exploring the Innovations of Swift 6
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe idea of a Fastlane replacement
• 377ae0333d0f4b7b97307c9eea5ee21a.gifGlovo«s Large-Scale App Development: An In-Depth Look
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMastering App Store Submissions with Fastlane Deliver
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe complete guide to iOS & macOS development in Neovim
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHandle TabView data in a type-safe way with Enums
• 377ae0333d0f4b7b97307c9eea5ee21a.gifPreparing your App for Voice Over: Accessibility Value
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWhy mobile apps need a good abstraction?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnit Test Expected Failures in Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwiftUI: How to trigger animations from outside the View scope?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifInspecting Xcode«s build system graph at ease
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMastering ViewThatFits
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to update widgets for StandBy mode
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSwiftData: A Comprehensive Guide to Data Persistence in iOS with CoreData
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAnimatable Dual Axis Graph
• 377ae0333d0f4b7b97307c9eea5ee21a.gifIntroducing Inferno: Metal shaders for SwiftUI
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding Complex Scroll Animations With New iOS 17 APIs
• 377ae0333d0f4b7b97307c9eea5ee21a.gifData Structures in Swift
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow to Refactor Your Code with Late Let and Defer
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngIntroducing Inferno: Metal shaders for SwiftUI
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngAdding Snapchat-Like Filters to a Video Calling App using SwiftUI
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngBuild DALL·E 3 AI WhatsApp Sticker Generator SwiftUI App
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngBuilding Complex Scroll Animations With New iOS 17 API«s
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngSwiftData Dynamic Sorts and Filters
• 96716bcb926741e79bb1c284a88083ca.pngMaterialTabBar: материальный TabBar на SwiftUI
• 96716bcb926741e79bb1c284a88083ca.pngSwift Protobuf: Protocol Buffer для Swift

e1a3cf2a8b65a0da69bbdd5c0ad040fe.pngAndroid

• Защита кода приложения Android. Когда хотели как лучше, а вышло не очень
• Kaspresso для самых маленьких
• Используем Ktlint в вашем Android-проекте
• Настройка Selenoid для запуска UI-тестов на Android
• Сравнение производительности Compose и View
• Разрушители легенд: Как на самом деле магазины проверяют приложения на уязвимости
• Как подружить JUnit 5 и Robolectric?
• Разделение презентационного слоя фичи на модули в Android приложении
• Сквозь дебри разработки, или как я пытался написать приложение
• Приложение для мобильных бригад: «толстый клиент» и полмиллиона строк кода
• Бруклинский мост. Зачем генерируем C++ на Kotlin
• Погружение в Smali. Как выглядят Java и Kotlin со стороны
• Быстрый старт в сборке метрик по билдам в Android-проекте
• Android Storage: обзор инструментария
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSquaring the Circle on Google TV
• 377ae0333d0f4b7b97307c9eea5ee21a.gifNavigation Drawers for Android TV using Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifReactive Programming in Kotlin — Flow
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe many faces of Kermit
• 377ae0333d0f4b7b97307c9eea5ee21a.gifApply Ktlint To Your Android Project
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAdding Konsist and Ktlint to a GitHub Actions Continuous Integration
• 377ae0333d0f4b7b97307c9eea5ee21a.gifNavigating Pitfalls — When to Use derivedStateOf with remember (key) in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAndroid: Jetpack Glance with Hilt
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAndroid WorkManager: Popular Interview Questions and Answers
• 377ae0333d0f4b7b97307c9eea5ee21a.gifCompare Compose and View performance
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe secret to Android«s improved memory on 1B+ Devices: The latest Android Runtime update
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnderstanding Kotlin«s Special Types: Any, Unit, and Nothing
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAIDL: The Android Developer«s Bridge Between Processes
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBasicTextField2: A TextField of Dreams
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAce your live coding interview: Android
• 377ae0333d0f4b7b97307c9eea5ee21a.gif5 quick animations to make your Compose app stand out
• 377ae0333d0f4b7b97307c9eea5ee21a.gifKotlin Sequence vs Collection: Which to choose?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBringing New Input Support to Desktop AVD
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAre you sure you know how Kotlin Flow works?
• 377ae0333d0f4b7b97307c9eea5ee21a.gifComponent-based Approach. Fighting Complexity in Android Applications
• 377ae0333d0f4b7b97307c9eea5ee21a.gifThe latest updates to power your growth on Google Play
• 377ae0333d0f4b7b97307c9eea5ee21a.gifNew APIs for adaptive layouts in Jetpack Compose
• 377ae0333d0f4b7b97307c9eea5ee21a.gifUnderstanding Eventbus with kotlin Flow
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngNow in Android: 95 — Google Play requirements, Animations in Compose, Passkeys in Android, and more!
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngHow to Build an Animated Splash Screen on Android — The Full Guide
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngTop 3 Coroutine Cancellation Traps That Lead to Errors In Your Android App
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngPractical magic with animations in Jetpack Compose
• 96716bcb926741e79bb1c284a88083ca.pngTwitter UI Clone: интерфейс Твиттер на Jetpack Compose
• 96716bcb926741e79bb1c284a88083ca.pngOrbital: анимации Jetpack Compose

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

• Простой, но масштабируемый State Management для Flutter
• Как мы перешли на кроссплатформенность в середине проекта и успели в срок
• Новый линт в Dart 3.2
• Flutter 3.16: что нового
• Анимация загрузки картинок во Flutter, или как сделать shimmer своими руками
• 377ae0333d0f4b7b97307c9eea5ee21a.gifEmbracing Stable Kotlin Multiplatform (KMP) with Koin
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter: Seamless Header Navigation from AppBar
• 377ae0333d0f4b7b97307c9eea5ee21a.gif8 Steps to Follow When Building Your Next Flutter App
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFlutter localization: step-by-step
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding Responsive UIs in Flutter: A Short Guide
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWhat«s new in Flutter 3.16
• gtu1iaz0-ajkbqpeq8n6dmql4zq.pngIntroducing the Flutter Casual Games Toolkit
• 96716bcb926741e79bb1c284a88083ca.pngLocalSend: кроссплатформенная альтернатива AirDrop

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

• Дизайн-система Gravity UI: как легко построить свой интерфейс
• Что не так с «Авророй» — российской мобильной OC
• Как сделать автотесты гибкими и лаконичными
• Должен ли QA уметь писать код
• GameDev и ОС Аврора. Портирование игры
• Что нового в интерфейсе ОС Аврора 5: управление и паттерны взаимодействия
• Avito Tech Managers meetup #1
• Я прошел собеседования в Google… Как?
• Octoverse 2023: ежегодный отчет от GitHub
• Windows 1.0 исполнилось 40 лет
• 377ae0333d0f4b7b97307c9eea5ee21a.gifBuilding In-Video Search
• 377ae0333d0f4b7b97307c9eea5ee21a.gifSmoothing Out The Bumps: My Journey of Setting Up CI/CD for Android and iOS Apps
• 377ae0333d0f4b7b97307c9eea5ee21a.gifFraming: The 1 most important communication concept every software engineer must know
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow one line of code caused a $60 million loss
• 377ae0333d0f4b7b97307c9eea5ee21a.gifHow I escape what 99% of programmers can«t
• 377ae0333d0f4b7b97307c9eea5ee21a.gifWriting code for MS-DOS with Borland Pascal 7
• 377ae0333d0f4b7b97307c9eea5ee21a.gifMy favorite coding question to give candidates (and why)

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

• Мобильные суперприложения выгодны корпорациям, но это кошмар для простых людей
• RuStore стал первым инклюзивным российским магазином приложений
• SplitMetrics купила App Radar
• Microsoft представила Loop, своего конкурента Notion
• $11.5 млн Серии А: Sunnyside — разумное питье с ИИ
• Опубликован AppsFlyer Performance Index 16
• Почему бенчмарки бесполезны
• Nothing Phone выпустит эксклюзивное приложение для работы с iMessage
• Объявлены финалисты App Store Award: лучшие приложения и игры 2023
• Digital Turbine инвестировала в магазин приложений Aptoide
• Исследуем доходы и установки Callsheet 

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

• Вкатываемся в Machine Learning с нуля за ноль рублей: что, где, в какой последовательности изучить
• Станция Миди и голосовое управление Zigbee-устройствами без интернета. История разработки
• Парк юрского периода глазами нейросети: как развернуть Diffusers для генерации изображений за 10 минут
• Дисплей для Ариты или тайна четырёх перемычек
• Управление сетевыми устройствами: Orange Pi, OpenWRT и Python
• $16 млн в посевном раунде: Codegen — автоматизация задач разработки с помощью ИИ
• 377ae0333d0f4b7b97307c9eea5ee21a.gifAn Android Developer«s Introduction to Machine Learning

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

© Habrahabr.ru