В новом выпуске любовь и терпение Swift и Objective-C, подводные камни тестирования и построение инфраструктуры, универсальные пуши, чтобы править всеми, подписки в App Store и многое другое.
В нашем Telegram-канале Mobile Insights, еще больше материалов для мобильных разработчиков, а в IT Insights — об интересном коде и технологиях. Подключайтесь!
![](https://habrastorage.org/webt/8c/9q/4j/8c9q4jgksry43ywj9c7c6zwzfs8.png)
iOS
• Swift и Objective-C в одном SDK. Стерпится, слюбится
• Примеры анимации SF-символов в SwiftUI
• Анализ производительности для ускорения сборок в Xcode
• Как не забросить свой пет-проект. Мой кейс запуска приложения в App Store
• Проверяем ваш код на API, использование которых нужно будет объяснять
• Подводные камни тестирования кода в Swift Concurrency
• Эластичная анимация
• Декларативная навигация в iOS-приложении
• История «Сбербанк Онлайн» на iOS
• Вопросы с собеседований: классы и структуры в Swift
•
Getting Started with Xcode Server: A Practical Guide for Simplifying CI/CD for iOS Apps
•
Improve the build times of your SPM Packages and your apps
•
How to Automate Memory Leak Detection in Your Swift Code with XCTest
•
iOS app setup for remote push notifications
•
Adapting an App to visionOS
•
Scrollable lists using Protocol-Oriented Programming and UICollectionViewFlowLayout
•
Swift 6: Preparing your Xcode projects for the future
•
Add Live Activities to your iOS app in 4 steps
•
Elm architecture in iOS
•
Developing Apps for iOS — Stanford course CS193p
•
Learn how to utilize the Scan and Reduce operators in SwiftUI with Combine
•
Xcode Breakpoints 101
•
Mastering iOS Code Quality: 12 Essential Strategies for Developers
•
Use Periphery to find unused code
•
How to set up Gitlab CI/CD with Fastlane for iOS-project on a Mac mini
•
Mastering StoreKit 2. SubscriptionStoreView in SwiftUI
•
Stop prefixing your UserDefaults keys
•
SwiftUI — Circular Loader Animation
•
Beyond Basics: Can SwiftUI Handle the Challenge of Complex macOS Apps?
•
Debugging Macros in Swift with the AST Explorer
•
Accessibility in Swift: Dynamic Colors
•
Creating Bottom Sheets like in the «Find My» app using SwiftUI
•
Parallax Carousel Scroll Animation Using SwiftUI
•
iOS 17 Data Flow with Observation Framework
•
English Pronunciation App: изучение английских слов и их произношения
•
Braze: криптовалюты с SwiftUI и MVVM
Android
• Как тестировщики с помощью пользовательского десктопа и видеокарты инфраструктуру строили
• Миграция приложения на Jetpack Compose
• Ускоряем сборку за счёт миграции с kapt на ksp
• Как узнать кто вызывал функцию? StackTrace стек вызовов в Kotlin & Java
• Универсальные пуши для Android. FCM, HMS и RuStore в одном месте
• Добавляем анимации встряхивания в Composable
•
NetMock: простой подход к тестированию HTTP-запросов в Java, Android и Kotlin Multiplatform
•
Kotlin and Java interoperability: Useful annotations
•
Let Kotlin do the code for you — Part II: Retrofit and Proxy
•
Unleashing Creativity with Custom Modifiers in Android Jetpack Compose
•
Kotlin Exhaustive when
•
Migrate your Android Build from Groovy to Version Catalog
•
Script for auto-build Android applications
•
Solving the mystery of recompositions in Compose’s LazyList
•
Jetpack Compose Tricks: Conditionally Applying Modifiers for Dynamic UIs
•
Ultron — simple, stable, maintainable Android UI tests
•
Walkthrough Kotlin Flows and Channels with Message Bubbles
•
Latest ARTwork on hundreds of millions of devices
•
Introducing Konsist: A Cutting-Edge Kotlin Linter
•
Unleashing Creativity with Custom Modifiers in Android Jetpack Compose
•
Implementing Advanced RecyclerView Techniques for Efficient List Rendering
•
SOLID Design Principles with Kotlin Android
•
Best practices for error handling in Kotlin
•
FloatingActionButton with Sub Floating Items in Jetpack Compose
•
Profile your build
•
Now in Android: 89 — Android 14 Beta 5, Compose for Wear OS, WebGPU, and more!
•
Full Guide to Bottom Sheets — UX With Material3
•
Konsist: тестирование архитектуры и соглашений языка Kotlin
•
JsonTree: красивый Json в Compose
Кроссплатформа
• Одно PWA, чтоб править всеми
• Фишки React Native для реализации личного кабинета
• Под капотом анимаций в React Native. Часть 2/2: Reanimated and JSI
• Flutter 3.13. Что нового?
•
Building Offline-First React Native Apps with React Query and TypeScript
•
How I became a Google Developer Expert in Flutter
•
Demystifying Code Splitting in React: Improving Performance and User Experience
•
A new way of listening to the app lifecycle events in Flutter
•
Building a Chrome Extension with Flutter: A Step-by-Step Guide
•
Creating Custom Dropdowns with OverlayPortal in Flutter
•
Better with bloc
•
Hive Database in Flutter: Building a Simple Movie App
•
3 Flutter Open Source Projects That Improve Your Skills
•
Simplify Your iOS Brownfield Integration with React Native Host
•
Home Automation in Flutter
•
Appyx: навигация + UI компоненты для Compose Multiplatform
Разработка
• Мобильное приложение для сотрудников: спорт, игрушечное казино и собственный Twitter
• Рецепт юзабилити-тестирования
• Как отдать технический долг
• Trunk based development в мобильной разработке
• В Excel появляется Python
•
The Next Next Job, a framework for making big career decisions
•
Fuzz Testing Is the Best Thing To Happen to Our Application Tests
•
Slack’s Migration to a Cellular Architecture
•
The Future is Now: Integrating AI in Software Development
•
Why Scrum Fails
•
Discover the Magic Working Behind our New Mobile App Rebranding
•
Design With Me — Flight Tracker App
•
Fitting AI models in your pocket with quantization
•
How to unblock your mobile app development while the backend isn’t ready
•
The Quest for Reliable Code
•
Text Rendering Hates You
Аналитика, маркетинг и монетизация
• В рамках программы First Run Epic предлагает издателям 100% прибыли
• Нейросети vs дизайнеры: может ли ИИ выполнять работу креативного продакшна?
• Кейс SB-Games: как увеличить APRU 18 приложений на 40%
• Глобальный охват китайских приложений: исследование прибыльных рынков и вертикалей
• Сколько приложений в App Store предлагают подписку?
•
Dynamic Pricing with Multi-Armed Bandit: Learning by Doing
•
How to Fuel Your Startup’s Growth Engine
AI, Устройства, IoT
• Kaggle для футболистов. Разбираем подходы призеров соревнований по детекции столкновений (1 и 2 место)
• Как передать данные с IoT-датчиков и сэкономить на трафике
• $235 млн в Серии D: Hugging Face — ИИ-сообщество и инструменты MLOps
• **** запускает собственный инструмент для написания кода на основе искусственного интеллекта: Code Llama
• IBM предлагает ИИ для перевода кода COBOL в Java
• Разработчики используют ИИ для создания text-to-music приложений
•
Project IDX: Full-stack application development with generative AI
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
В нашем Telegram-канале Mobile Insights, еще больше материалов для мобильных разработчиков, а в IT Insights — об интересном коде и технологиях. Подключайтесь!
![](https://habrastorage.org/webt/8c/9q/4j/8c9q4jgksry43ywj9c7c6zwzfs8.png)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• Swift и Objective-C в одном SDK. Стерпится, слюбится
• Примеры анимации SF-символов в SwiftUI
• Анализ производительности для ускорения сборок в Xcode
• Как не забросить свой пет-проект. Мой кейс запуска приложения в App Store
• Проверяем ваш код на API, использование которых нужно будет объяснять
• Подводные камни тестирования кода в Swift Concurrency
• Эластичная анимация
• Декларативная навигация в iOS-приложении
• История «Сбербанк Онлайн» на iOS
• Вопросы с собеседований: классы и структуры в Swift
•
![](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/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.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)
• Как тестировщики с помощью пользовательского десктопа и видеокарты инфраструктуру строили
• Миграция приложения на Jetpack Compose
• Ускоряем сборку за счёт миграции с kapt на ksp
• Как узнать кто вызывал функцию? StackTrace стек вызовов в Kotlin & Java
• Универсальные пуши для Android. FCM, HMS и RuStore в одном месте
• Добавляем анимации встряхивания в Composable
•
![](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/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.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)
• Одно PWA, чтоб править всеми
• Фишки React Native для реализации личного кабинета
• Под капотом анимаций в React Native. Часть 2/2: Reanimated and JSI
• Flutter 3.13. Что нового?
•
![](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/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• Мобильное приложение для сотрудников: спорт, игрушечное казино и собственный Twitter
• Рецепт юзабилити-тестирования
• Как отдать технический долг
• Trunk based development в мобильной разработке
• В Excel появляется Python
•
![](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/getpro/habr/post_images/509/dc9/bde/509dc9bde69347ecbe0c21ff2973d7e7.jpg)
• В рамках программы First Run Epic предлагает издателям 100% прибыли
• Нейросети vs дизайнеры: может ли ИИ выполнять работу креативного продакшна?
• Кейс SB-Games: как увеличить APRU 18 приложений на 40%
• Глобальный охват китайских приложений: исследование прибыльных рынков и вертикалей
• Сколько приложений в App Store предлагают подписку?
•
![](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)
• Kaggle для футболистов. Разбираем подходы призеров соревнований по детекции столкновений (1 и 2 место)
• Как передать данные с IoT-датчиков и сэкономить на трафике
• $235 млн в Серии D: Hugging Face — ИИ-сообщество и инструменты MLOps
• **** запускает собственный инструмент для написания кода на основе искусственного интеллекта: Code Llama
• IBM предлагает ИИ для перевода кода COBOL в Java
• Разработчики используют ИИ для создания text-to-music приложений
•
![](https://habrastorage.org/webt/rp/yj/af/rpyjafhfrre_w2tf5minfkokt1c.png)
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.