В новом дайджесте изучаем Swift OpenAPI Generator и работу Spotify на Bazel, вспоминаем 15 лет Android и обозреваем невизуальную доступность, внедряем карты, пишем бесполезные программы, возвращаемся к Windows Phone и многое другое!
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/vy/6i/fr/vy6ifruqkoggjoplufd4ohlzbbo.jpeg)
iOS
• Готов ли Swift OpenAPI Generator для продуктивного кода?
• Как Spotify бесшовно перешел на сборки Bazel
• SwiftUI: от сомнений к успешному внедрению
• Keyboard Layout Guide
• Автоматизация ревью ресурсных картинок в iOS
• Реальное iOS собеседование в Яндекс
• Поваренная книга SwiftUI: настройка фона и границ представления + Создание View и его модификаторов
•
SwiftSyntax Code Generation Notes
•
How (not) to monitor SwiftUI @State
•
Observation Evolution: SwiftUI 5’s Shift from Combine
•
Animating with Elegance: Exploring Phased Animations in SwiftUI 5
•
Create a Pie or Donut chart with SwiftUI Charts in iOS 17
•
Unsafe memory mutation
•
Preparing your App for VoiceOver: use Accessibility Label
•
iOS Single App Mode Escape
•
My Toddler Loves Planes, So I Built Her A Radar
•
Typewriter Text Animation In SwiftUI
•
Bad practice: not using Phantom Types
•
Use TensorFlow Lite model in SwiftUI Application
•
Find Ancestor Types
•
Swift Metatypes: What They Are and Why You Should Care
•
Bad practice: not using multiline strings
•
Generating Random Numbers Elegantly in Swift
•
TestFlight makes it even simpler to manage testers
•
SwiftUI Tutorial — Animated TabBar
•
How to Integrate Camera APIs using SwiftUI
•
Custom Swift Logger in Xcode 15
•
Swift Metatypes: What They Are and Why You Should Care
•
Mastering TipKit: Advanced
•
Create a Spotify-Style Lyric View in SwiftUI
•
Beautify Code Without Optionals in Swift
•
Mastering TipKit in iOS 17
•
SwiftUI: Building Notes App + SwiftData + CRUD
•
Build a Twitch-Like Live Streaming App With SwiftUI
•
Resizable Custom Tab Bar for macOS
•
Lock SwiftUI View With Biometric/Custom Number Lock — Local Authentication
•
Tagged: обертка типов для выразительного кода
•
Dime: красивый трекер финансов для iOS
Android
• Воспоминания о 15 годах Android
• Как зловредные приложения могут скрывать работу с буфером обмена в Android 14
• Оптимизируя sequences — или как мой код попал в Kotlin
• Построение графа покрытия UI-тестами бизнес-логики на основе VisualFSM
• Обзор невизуальной доступности смартфонов под управлением операционной системы Android
• Реализация экранов авторизации и регистрации с помощью Custom View и Firebase
• Stone: знакомство с API
• Вопросы с собеседований: для чего нужен Data class в Kotlin
• Собеседование в Яндекс: платформа Android
• По ту сторону EditText. Программная клавиатура в Android
• Kodein в Android. Что за зверь и как его готовить
• Готовим конфигурацию Android-приложения с помощью Dynamic Proxy и рефлексии
• Как OkHttpClient повышает сетевую производительность
• На 65% меньше APK и на 70% меньше потребление памяти: оптимизация приложения для Android — память
•
Adopt Compose for View-based libraries
•
Custom Dialog Animation in Jetpack Compose
•
Dependency Injection in Legacy Code
•
Interaction Latency: Square’s User-Centric Mobile Performance Metric
•
What’s new in Jetpack Benchmark 1.2.0
•
Kotlin and Variance: Navigating Type Relationships
•
From Blank to Beautiful: Implementing Shimmer Effect in Compose
•
Device Streaming: The latest devices you need, when you need them
•
Google Play Games on PC Developer Emulator
•
How to write less code in tests
•
Rethinking Base/Core Classes and Modules in Android Software Development
•
Modularization of Android project in practice
•
How I Fell in Kotlin’s RunBlocking Deadlock Trap, and How You Can Avoid It
•
Currying in Kotlin
•
Data caching using Room in Kotlin, Remote Mediator API, MVI Architecture
•
Details on Google Play’s Photo and Video Permissions policy
•
Kotlin Coroutines vs Threads Performance Benchmark
•
Automatically Mirroring Images for RTL Layouts
•
#TheAndroidShow: faster and easier to build excellent apps, across devices!
•
Play PolicyBytes
•
95% Don’t Understand THIS About Coroutines (Main-Safety)
•
Which Compile Options Should You Choose? (Java & Kotlin Version)
•
Building a Spotify Music Player with Real-Time Lyrics using Flutter
•
Beginner Guide to Mutation Testing in Kotlin
•
Image Toolbox: графический редактор для Android на чистой архитектуре
•
ComposeDialogs: расширяемые диалоги в Material 3
Кроссплатформа
• Flutter Yandex Mapkit: как внедрить основные инструменты Яндекс Карт в проект на Flutter. Часть 1 и Часть 2
• Решаем трудности адаптации мобильных приложений с Responsive_framework
•
Setting up Kotlin Multiplatform with KSP
•
Flutter theme made easy
•
Testing in Flutter and Dart: Unit Testing + II
•
Flutter’s Overlay Widget and OverlayEntry: A Comprehensive Guide
•
The Flutter Forest — Demystifying Flutter trees
•
Mastering Error Handling in Flutter with Dio
•
Building a Spotify Music Player with Real-Time Lyrics using Flutter
•
Full Flutter Beginner Course
•
Twine: мультиплатформенный RSS-ридер на Kotlin и Compose
Разработка
• Пишите больше «бесполезных» программ
• Как интегрировать мультиаккаунт в уже работающий сервис и не поломать всё
• Road Run, или как я свою первую игру делал. Часть 1
• Что будет с мобильными релизами, если улучшать и автоматизировать процессы
• Адаптивный дизайн приложений на Gtk
• Как изменились подходы к автоматизированному тестированию в Тинькофф
• Avito Platform engineering meetup #2
• Ozon Tech Community ML&DS Meetup
• Полный курс по QA. Как правильно писать тесты?
• Сатья Наделла признает, что отказ от Windows Phone и мобильных устройств был ошибкой
• Скриншот-тесты — это ручные тесты
• Respawn: лучшее приложение для саморазвития в мире
• Больше всего денег для счастья нужно программистам
• Разработка мобильных приложений: чем Android лучше iOS?
•
Startup CTO Handbook
•
An Interactive Introduction to Fourier Transforms
•
How does macOS manage virtual cores on Apple silicon?
•
Courier: Reimagining How We Send Push Notifications
•
Step by Step Guide to Succeed in Mobile System Design Interviews
•
An aborted experiment with server Swift
•
How Tinder designs product (and why)
•
Where are all the laid-off software developers going?
•
UK games jobs vacancies reaches three-year low
Аналитика, маркетинг и монетизация
• Luminar Neo упрощает использование ИИ в обработке фотографий
• Wyzr Friends — приложение поиска друзей для взрослых
• Daylyy — еще один анти-I*****
• Возврат к Windows Phone позволяет блокировать рекламу на YouTube
• Сторонние приложения ChatGPT теряют прибыль
•
Q3 2023 Regional Market Pulse from Data.ai
•
India Festive Report 2023
AI, Устройства, IoT
• От Style Transfer до диффузии: эволюция визуальных эффектов на смартфонах
• ChatGPT в мобильной разработке: как использовать, чтобы получить пользу
• $30.5 млн в посевном раунде: CentML — оптимизация обучения и работы ИИ-моделей
• В стандарте Matter 1.2 появилась крупная бытовая техника
• Сделано с помощью ИИ Google — новая серия видео
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/vy/6i/fr/vy6ifruqkoggjoplufd4ohlzbbo.jpeg)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• Готов ли Swift OpenAPI Generator для продуктивного кода?
• Как Spotify бесшовно перешел на сборки Bazel
• SwiftUI: от сомнений к успешному внедрению
• Keyboard Layout Guide
• Автоматизация ревью ресурсных картинок в iOS
• Реальное iOS собеседование в Яндекс
• Поваренная книга SwiftUI: настройка фона и границ представления + Создание View и его модификаторов
•
![](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)
• Воспоминания о 15 годах Android
• Как зловредные приложения могут скрывать работу с буфером обмена в Android 14
• Оптимизируя sequences — или как мой код попал в Kotlin
• Построение графа покрытия UI-тестами бизнес-логики на основе VisualFSM
• Обзор невизуальной доступности смартфонов под управлением операционной системы Android
• Реализация экранов авторизации и регистрации с помощью Custom View и Firebase
• Stone: знакомство с API
• Вопросы с собеседований: для чего нужен Data class в Kotlin
• Собеседование в Яндекс: платформа Android
• По ту сторону EditText. Программная клавиатура в Android
• Kodein в Android. Что за зверь и как его готовить
• Готовим конфигурацию Android-приложения с помощью Dynamic Proxy и рефлексии
• Как OkHttpClient повышает сетевую производительность
• На 65% меньше APK и на 70% меньше потребление памяти: оптимизация приложения для Android — память
•
![](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/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)
• Flutter Yandex Mapkit: как внедрить основные инструменты Яндекс Карт в проект на Flutter. Часть 1 и Часть 2
• Решаем трудности адаптации мобильных приложений с Responsive_framework
•
![](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/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• Пишите больше «бесполезных» программ
• Как интегрировать мультиаккаунт в уже работающий сервис и не поломать всё
• Road Run, или как я свою первую игру делал. Часть 1
• Что будет с мобильными релизами, если улучшать и автоматизировать процессы
• Адаптивный дизайн приложений на Gtk
• Как изменились подходы к автоматизированному тестированию в Тинькофф
• Avito Platform engineering meetup #2
• Ozon Tech Community ML&DS Meetup
• Полный курс по QA. Как правильно писать тесты?
• Сатья Наделла признает, что отказ от Windows Phone и мобильных устройств был ошибкой
• Скриншот-тесты — это ручные тесты
• Respawn: лучшее приложение для саморазвития в мире
• Больше всего денег для счастья нужно программистам
• Разработка мобильных приложений: чем Android лучше iOS?
•
![](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/getpro/habr/post_images/509/dc9/bde/509dc9bde69347ecbe0c21ff2973d7e7.jpg)
• Luminar Neo упрощает использование ИИ в обработке фотографий
• Wyzr Friends — приложение поиска друзей для взрослых
• Daylyy — еще один анти-I*****
• Возврат к Windows Phone позволяет блокировать рекламу на YouTube
• Сторонние приложения ChatGPT теряют прибыль
•
![](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/853/812/9f5/8538129f5e7b404a720121cb9c3814db.jpg)
• От Style Transfer до диффузии: эволюция визуальных эффектов на смартфонах
• ChatGPT в мобильной разработке: как использовать, чтобы получить пользу
• $30.5 млн в посевном раунде: CentML — оптимизация обучения и работы ИИ-моделей
• В стандарте Matter 1.2 появилась крупная бытовая техника
• Сделано с помощью ИИ Google — новая серия видео
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.