В этом дайджесте для мобильных разработчиков листаем страницы и повышаем качество кода, защищаем и исследуем код, исследуем новый релиз Flutter, делаем дизайн-систему, автотесты, определяем “производительность” рекламных сетей.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/r/w780q1/webt/so/ei/ud/soeiudkdcgs1dx9-tsyom9p9wbg.jpeg)
iOS
• 10 быстрых советов по повышению качества iOS-кода: часть 1 + часть 2
• Добавляем подсказки в приложение с помощью TipKit
• Листаем цифровые страницы: UIPageViewController
• Рефакторинг Swift
• Apple добавит поддержку RCS в следующем году
• Отображение панели выбора фотографий в SwiftUI
• iOS 18 должна стать самой «амбициозной и неотразимой»
• Поваренная книга SwiftUI: обрезка представлений
•
Progress toward the Swift 6 language mode
•
On-Crash Backtraces in Swift
•
SwiftUI: Displaying a Photo Picker
•
Localisation in Xcode 15
•
SwiftUI at Airbnb: A Case Study
•
Beyond the Code: Exploring the Innovations of Swift 6
•
The idea of a Fastlane replacement
•
Glovo’s Large-Scale App Development: An In-Depth Look
•
Mastering App Store Submissions with Fastlane Deliver
•
The complete guide to iOS & macOS development in Neovim
•
Handle TabView data in a type-safe way with Enums
•
Preparing your App for Voice Over: Accessibility Value
•
Why mobile apps need a good abstraction?
•
Unit Test Expected Failures in Swift
•
SwiftUI: How to trigger animations from outside the View scope?
•
Inspecting Xcode’s build system graph at ease
•
Mastering ViewThatFits
•
How to update widgets for StandBy mode
•
SwiftData: A Comprehensive Guide to Data Persistence in iOS with CoreData
•
Animatable Dual Axis Graph
•
Introducing Inferno: Metal shaders for SwiftUI
•
Building Complex Scroll Animations With New iOS 17 APIs
•
Data Structures in Swift
•
How to Refactor Your Code with Late Let and Defer
•
Introducing Inferno: Metal shaders for SwiftUI
•
Adding Snapchat-Like Filters to a Video Calling App using SwiftUI
•
Build DALL·E 3 AI WhatsApp Sticker Generator SwiftUI App
•
Building Complex Scroll Animations With New iOS 17 API’s
•
SwiftData Dynamic Sorts and Filters
•
MaterialTabBar: материальный TabBar на SwiftUI
•
Swift Protobuf: Protocol Buffer для Swift
Android
• Защита кода приложения Android. Когда хотели как лучше, а вышло не очень
• Kaspresso для самых маленьких
• Используем Ktlint в вашем Android-проекте
• Настройка Selenoid для запуска UI-тестов на Android
• Сравнение производительности Compose и View
• Разрушители легенд: Как на самом деле магазины проверяют приложения на уязвимости
• Как подружить JUnit 5 и Robolectric?
• Разделение презентационного слоя фичи на модули в Android приложении
• Сквозь дебри разработки, или как я пытался написать приложение
• Приложение для мобильных бригад: «толстый клиент» и полмиллиона строк кода
• Бруклинский мост. Зачем генерируем C++ на Kotlin
• Погружение в Smali. Как выглядят Java и Kotlin со стороны
• Быстрый старт в сборке метрик по билдам в Android-проекте
• Android Storage: обзор инструментария
•
Squaring the Circle on Google TV
•
Navigation Drawers for Android TV using Jetpack Compose
•
Reactive Programming in Kotlin — Flow
•
The many faces of Kermit
•
Apply Ktlint To Your Android Project
•
Adding Konsist and Ktlint to a GitHub Actions Continuous Integration
•
Navigating Pitfalls — When to Use derivedStateOf with remember(key) in Jetpack Compose
•
Android: Jetpack Glance with Hilt
•
Android WorkManager: Popular Interview Questions and Answers
•
Compare Compose and View performance
•
The secret to Android’s improved memory on 1B+ Devices: The latest Android Runtime update
•
Understanding Kotlin’s Special Types: Any, Unit, and Nothing
•
AIDL: The Android Developer’s Bridge Between Processes
•
BasicTextField2: A TextField of Dreams
•
Ace your live coding interview: Android
•
5 quick animations to make your Compose app stand out
•
Kotlin Sequence vs Collection: Which to choose?
•
Bringing New Input Support to Desktop AVD
•
Are you sure you know how Kotlin Flow works?
•
Component-based Approach. Fighting Complexity in Android Applications
•
The latest updates to power your growth on Google Play
•
New APIs for adaptive layouts in Jetpack Compose
•
Understanding Eventbus with kotlin Flow
•
Now in Android: 95 — Google Play requirements, Animations in Compose, Passkeys in Android, and more!
•
How to Build an Animated Splash Screen on Android — The Full Guide
•
Top 3 Coroutine Cancellation Traps That Lead to Errors In Your Android App
•
Practical magic with animations in Jetpack Compose
•
Twitter UI Clone: интерфейс Твиттер на Jetpack Compose
•
Orbital: анимации Jetpack Compose
Кроссплатформа
• Простой, но масштабируемый State Management для Flutter
• Как мы перешли на кроссплатформенность в середине проекта и успели в срок
• Новый линт в Dart 3.2
• Flutter 3.16: что нового
• Анимация загрузки картинок во Flutter, или как сделать shimmer своими руками
•
Embracing Stable Kotlin Multiplatform (KMP) with Koin
•
Flutter: Seamless Header Navigation from AppBar
•
8 Steps to Follow When Building Your Next Flutter App
•
Flutter localization: step-by-step
•
Building Responsive UIs in Flutter: A Short Guide
•
What’s new in Flutter 3.16
•
Introducing the Flutter Casual Games Toolkit
•
LocalSend: кроссплатформенная альтернатива AirDrop
Разработка
• Дизайн-система Gravity UI: как легко построить свой интерфейс
• Что не так с «Авророй» — российской мобильной OC
• Как сделать автотесты гибкими и лаконичными
• Должен ли QA уметь писать код
• GameDev и ОС Аврора. Портирование игры
• Что нового в интерфейсе ОС Аврора 5: управление и паттерны взаимодействия
• Avito Tech Managers meetup #1
• Я прошел собеседования в Google… Как?
• Octoverse 2023: ежегодный отчет от GitHub
• Windows 1.0 исполнилось 40 лет
•
Building In-Video Search
•
Smoothing Out The Bumps: My Journey of Setting Up CI/CD for Android and iOS Apps
•
Framing: The 1 most important communication concept every software engineer must know
•
How one line of code caused a $60 million loss
•
How I escape what 99% of programmers can’t
•
Writing code for MS-DOS with Borland Pascal 7
•
My favorite coding question to give candidates (and why)
Аналитика, маркетинг и монетизация
• Мобильные суперприложения выгодны корпорациям, но это кошмар для простых людей
• 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
AI, Устройства, IoT
• Вкатываемся в Machine Learning с нуля за ноль рублей: что, где, в какой последовательности изучить
• Станция Миди и голосовое управление Zigbee-устройствами без интернета. История разработки
• Парк юрского периода глазами нейросети: как развернуть Diffusers для генерации изображений за 10 минут
• Дисплей для Ариты или тайна четырёх перемычек
• Управление сетевыми устройствами: Orange Pi, OpenWRT и Python
• $16 млн в посевном раунде: Codegen — автоматизация задач разработки с помощью ИИ
•
An Android Developer’s Introduction to Machine Learning
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/so/ei/ud/soeiudkdcgs1dx9-tsyom9p9wbg.jpeg)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• 10 быстрых советов по повышению качества iOS-кода: часть 1 + часть 2
• Добавляем подсказки в приложение с помощью TipKit
• Листаем цифровые страницы: UIPageViewController
• Рефакторинг Swift
• Apple добавит поддержку RCS в следующем году
• Отображение панели выбора фотографий в SwiftUI
• iOS 18 должна стать самой «амбициозной и неотразимой»
• Поваренная книга SwiftUI: обрезка представлений
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/e1a/3cf/2a8/e1a3cf2a8b65a0da69bbdd5c0ad040fe.png)
• Защита кода приложения Android. Когда хотели как лучше, а вышло не очень
• Kaspresso для самых маленьких
• Используем Ktlint в вашем Android-проекте
• Настройка Selenoid для запуска UI-тестов на Android
• Сравнение производительности Compose и View
• Разрушители легенд: Как на самом деле магазины проверяют приложения на уязвимости
• Как подружить JUnit 5 и Robolectric?
• Разделение презентационного слоя фичи на модули в Android приложении
• Сквозь дебри разработки, или как я пытался написать приложение
• Приложение для мобильных бригад: «толстый клиент» и полмиллиона строк кода
• Бруклинский мост. Зачем генерируем C++ на Kotlin
• Погружение в Smali. Как выглядят Java и Kotlin со стороны
• Быстрый старт в сборке метрик по билдам в Android-проекте
• Android Storage: обзор инструментария
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/webt/ma/lx/8h/malx8hbgozt6lee8rmxmg96_s6a.png)
• Простой, но масштабируемый State Management для Flutter
• Как мы перешли на кроссплатформенность в середине проекта и успели в срок
• Новый линт в Dart 3.2
• Flutter 3.16: что нового
• Анимация загрузки картинок во Flutter, или как сделать shimmer своими руками
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
•
![](https://habrastorage.org/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• Дизайн-система Gravity UI: как легко построить свой интерфейс
• Что не так с «Авророй» — российской мобильной OC
• Как сделать автотесты гибкими и лаконичными
• Должен ли QA уметь писать код
• GameDev и ОС Аврора. Портирование игры
• Что нового в интерфейсе ОС Аврора 5: управление и паттерны взаимодействия
• Avito Tech Managers meetup #1
• Я прошел собеседования в Google… Как?
• Octoverse 2023: ежегодный отчет от GitHub
• Windows 1.0 исполнилось 40 лет
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
![](https://habrastorage.org/getpro/habr/post_images/509/dc9/bde/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
![](https://habrastorage.org/getpro/habr/post_images/853/812/9f5/8538129f5e7b404a720121cb9c3814db.jpg)
• Вкатываемся в Machine Learning с нуля за ноль рублей: что, где, в какой последовательности изучить
• Станция Миди и голосовое управление Zigbee-устройствами без интернета. История разработки
• Парк юрского периода глазами нейросети: как развернуть Diffusers для генерации изображений за 10 минут
• Дисплей для Ариты или тайна четырёх перемычек
• Управление сетевыми устройствами: Orange Pi, OpenWRT и Python
• $16 млн в посевном раунде: Codegen — автоматизация задач разработки с помощью ИИ
•
![](https://habrastorage.org/files/377/ae0/333/377ae0333d0f4b7b97307c9eea5ee21a.gif)
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.