В нашем новом дайджесте устройство протокола iMessage и новое приложение Beeper Mini (которое уже не работает), бесплатный Xcode Cloud, новый ИИ от Google в Android, создание простого калькулятора, интернационализация от i до n, конец плоского дизайна и многое другое.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/zk/ku/mf/zkkumfobmyhxaqt6ldff-pyuune.png)
iOS
• Использование on-demand ресурсов для безопасного хранения ключей API в iOS-приложениях
• Как устроен протокол iMessage
• Swift Utilities — Интеграция SwiftUI в UIKit
• Идеальный REST клиент iOS
• Swift Utilities — Работа со SwiftData в Background
• Разработчики будут бесплатно получать 25 часов Xcode Cloud в месяц
• Поваренная книга SwiftUI: создание кастомного модификатора представления + создание сетки представлений
•
Building Robust iOS Applications: The Art of Modularization
•
Apple’s use of AppKit, Catalyst, Swift and SwiftUI in macOS Sonoma
•
Using on-demand resources for securely storing API keys in iOS apps
•
Observable Architecture Beta
•
Easy app walkthroughs with MarkWalkthrough
•
AsyncStream in the real world: wrapping an Apple Photos callback
•
From viewWillAppear to viewIsAppearing — Perfecting Your iOS View Transitions
•
Testing private functions in Swift
•
Future-Proofing Your Projects for Swift 6: A Comprehensive Guide
•
SwiftUI for Jetpack Compose developers — State
•
Easily Change the Language of the Simulator to Test Your App
•
Swift: Simulating Inheritance in structs with the Power of enums
•
Are You Truly Adopting MVVM? Or Just a Badly Shaped MVP?
•
SFSafariViewController in SwiftUI: Open webpages in-app
•
Mastering MapKit in SwiftUI. Customizations.
•
7 Steps to Add Chat to a SwiftUI App Using Firebase
•
Handling new Enum cases in Swift. UnknownCaseDecodable protocol
•
Distributing a Swift Macro using CocoaPods
•
GPT’s specifically for Apple Frameworks
•
Mastering in SwiftUI
•
Stop abusing value type
•
How To Create A Tic Tac Toe Game in Xcode 15 (SwiftUI)
•
Interactive Widgets – Intents
•
SwiftUI Complex Hero Animation With Synchronized ScrollViews
•
Create your first app with SwiftUI and SwiftData
•
Swift Data Many to Many relationships
•
How To Create And Use A Card View in Xcode 15 (SwiftUI)
•
ColorfulX: градиенты с Metal
•
IMSwitch: графические переключатели для SwiftUI
Android
• Gemini — новая основа для искусственного интеллекта в Android
• Готовим конфигурацию Android-приложения с помощью Dynamic Proxy и рефлексии
• Создание простого калькулятора в Android Studio
• Улучшение производительности Android-приложения NordVPN с помощью плагина Compose Compiler
• Переход на Gradle 8 Android проекта
• Как интегрировать Dynamic Features в Android-приложение
• Вопросы с собеседований: для чего нужны сервисы в Android-приложении
•
Idiomatic Kotlin: Merge Two Strings Alternately + Benchmarks
•
Implementing an animated column section header using Jetpack Compose
•
Improving NordVPN’s Android performance using the Compose Compiler plugin
•
Koin, Ktor & Paging in KMM
•
Global Google Developer Experts Share Their Favorite Tools and Advice for New Developers
•
Custom Pull to Refresh in Jetpack Compose
•
First look at AndroidX Bluetooth
•
Better Previews in Jetpack Compose, Tips and Tricks
•
Kotlin Delegation: A Powerful Code Organization Technique for Reusability and Maintainability
•
Mastery on Invoke Kotlin
•
Clean Architecture for Android MVI
•
Stealing API keys — Security in Android
•
Android Interview Cheat Sheet
•
Live Mosaic at Droidcon London 2023
•
100% Flakiness-free UI test automation with Kaspresso and Allure Testops
•
KSP2 Preview: Kotlin K2 and Standalone Source Generator
•
Improve Your Android App Performance With Baseline Profiles
•
Kotlin under the hood: The nuances of using annotations in Kotlin
•
Enhancing Jetpack Compose app performance
•
Latest Updates to Google Play, New APIs in Jetpack Compose, and more dev news!
•
mutableStateOf() VS. mutableIntStateOf() — Auto-Boxing Explained
•
Is it okay to use runBlocking?
•
Tusky: Android-клиент для Mastodon
•
CountryCP: выбор страны в Compose
Кроссплатформа
• Flutter Web умер. Да здравствует Flutter Web
• Инструкция: как быстро настроить GitLab CI/CD на Flutter-проекте
• Как я стал Google Developer Expert по Flutter
• PWA vs. нативные приложения: когда и как выбрать?
•
Welcome Fleet with Kotlin Multiplatform Tooling
•
Kotlin Multiplatform Development Roadmap for 2024
•
Flutter GameDev with Casual Games Toolkit & Flame
•
Handling Asynchronous Data in Flutter with Generic Classes
•
Building a Spreadsheet Interface in Flutter: A Quick Guide
•
Why Flutter is “NOT” the Best Mobile App Development Tool
•
How to implement push notifications in Kotlin Multiplatform
•
Calling Platform-Specific Dependencies in Kotlin Multiplatform
•
Safeguarding Your Flutter Apps
•
Flutter GameDev with Casual Games Toolkit & Flame
•
Practical Functional Programming in Dart and Flutter
•
FreeToGame: KMP-проект для Android, iOS, Desktop и Wear OS
Разработка
• Интернационализация от i до n: как мы переводим интерфейсы в Фантехе Яндекса
• Мода на плоский дизайн наконец-то прошла?
• 10 тёмных паттернов в UX-дизайне и как их избежать
• 9 советов, которые облегчат путь до мидла
• Операционные системы — Как это работает
• Как зарабатывать на обучении в IT?
• TypeScript убил JavaScript?
• Microsoft открыла Terminal Chat
•
UI/UX Design: The Fastest Way to Make Your Designs More Interesting
•
How Google takes the pain out of code reviews, with 97% dev satisfaction
•
How Uber Computes ETA at Half a Million Requests per Second
•
How psychology design products that win customers
•
Data Quality Score: The next chapter of data quality at Airbnb
•
Are your engineering “best practices” just developer dogmas?
•
Your GitHub pull request workflow is slowing everyone down
•
How to Build a Personal Brand as a Developer
•
How the first gen iPod was reverse engineered to run Rockbox
Аналитика, маркетинг и монетизация
• Как продвигать приложение детской одежды в VK Рекламе и Яндекс Директе — кейс Gulliver Market и Rocket10
• Дизайн А/Б-тестов
• 5 прогнозов для мобильных приложений 2024
• Discord провел редизайн мобильного приложений с акцентом на сообщения
• Beeper Mini — новое приложение для переписки в iMessage с Android (и уже не работает)
• Bumble For Friends использует ИИ для написания первого сообщения
• Animate Anyone приближает создание видео-дипфейков
• Самые скачиваемые и зарабатывающие приложения в России в ноябре 2023
• Маркетологи в мобайле: Александра Мареева («Спортмастер»)
• Capsule: новости на основе ИИ и человеческих редакторов
• Threads обгоняет X
•
France in three charts: Installs, sessions, and retention rates
•
How to implement gamification and enhance your app’s user experience
AI, Устройства, IoT
• О троице, которая хакнула настоящий поезд. Даже целых 30 поездов
• Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266
• Создаём сортировщик деталей Lego Technic, распознающий объекты в реальном времени
• Pimento использует ИИ для превращения брифов в креативные мудборды
• Apple выпустила библиотеки машинного обучения для Apple Silicon
• Google выпустил AlphaCode 2 на основе Gemini
• Amazon выпустил Q, своего помощника с искусственным интеллектом
• Рынок смарт-часов восстанавливается
•
MLOps Course – Build Machine Learning Production Grade Projects
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.
Подписывайтесь на на наш Telegram-канал Mobile Insights, где еще больше материалов для мобильных разработчиков. А в IT Insights — много об интересном коде и технологиях.
![](https://habrastorage.org/webt/zk/ku/mf/zkkumfobmyhxaqt6ldff-pyuune.png)
![](https://habrastorage.org/getpro/habr/post_images/f19/30a/c49/f1930ac4945596eb9707bc7a01bc5bdc.png)
• Использование on-demand ресурсов для безопасного хранения ключей API в iOS-приложениях
• Как устроен протокол iMessage
• Swift Utilities — Интеграция SwiftUI в UIKit
• Идеальный REST клиент iOS
• Swift Utilities — Работа со SwiftData в Background
• Разработчики будут бесплатно получать 25 часов Xcode Cloud в месяц
• Поваренная книга 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/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/getpro/habr/post_images/e1a/3cf/2a8/e1a3cf2a8b65a0da69bbdd5c0ad040fe.png)
• Gemini — новая основа для искусственного интеллекта в Android
• Готовим конфигурацию Android-приложения с помощью Dynamic Proxy и рефлексии
• Создание простого калькулятора в Android Studio
• Улучшение производительности Android-приложения NordVPN с помощью плагина Compose Compiler
• Переход на Gradle 8 Android проекта
• Как интегрировать Dynamic Features в Android-приложение
• Вопросы с собеседований: для чего нужны сервисы в 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/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 Web умер. Да здравствует Flutter Web
• Инструкция: как быстро настроить GitLab CI/CD на Flutter-проекте
• Как я стал Google Developer Expert по Flutter
• PWA vs. нативные приложения: когда и как выбрать?
•
![](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/files/967/16b/cb9/96716bcb926741e79bb1c284a88083ca.png)
![](https://habrastorage.org/getpro/habr/post_images/708/1c6/34e/7081c634ec176ab6b953d9d19e82a09a.png)
• Интернационализация от i до n: как мы переводим интерфейсы в Фантехе Яндекса
• Мода на плоский дизайн наконец-то прошла?
• 10 тёмных паттернов в UX-дизайне и как их избежать
• 9 советов, которые облегчат путь до мидла
• Операционные системы — Как это работает
• Как зарабатывать на обучении в IT?
• TypeScript убил JavaScript?
• Microsoft открыла Terminal Chat
•
![](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)
• Как продвигать приложение детской одежды в VK Рекламе и Яндекс Директе — кейс Gulliver Market и Rocket10
• Дизайн А/Б-тестов
• 5 прогнозов для мобильных приложений 2024
• Discord провел редизайн мобильного приложений с акцентом на сообщения
• Beeper Mini — новое приложение для переписки в iMessage с Android (и уже не работает)
• Bumble For Friends использует ИИ для написания первого сообщения
• Animate Anyone приближает создание видео-дипфейков
• Самые скачиваемые и зарабатывающие приложения в России в ноябре 2023
• Маркетологи в мобайле: Александра Мареева («Спортмастер»)
• Capsule: новости на основе ИИ и человеческих редакторов
• Threads обгоняет X
•
![](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)
• О троице, которая хакнула настоящий поезд. Даже целых 30 поездов
• Технологии прошлого и настоящего: как я сделал Nixie Clock с самодельным драйвером на ESP8266
• Создаём сортировщик деталей Lego Technic, распознающий объекты в реальном времени
• Pimento использует ИИ для превращения брифов в креативные мудборды
• Apple выпустила библиотеки машинного обучения для Apple Silicon
• Google выпустил AlphaCode 2 на основе Gemini
• Amazon выпустил Q, своего помощника с искусственным интеллектом
• Рынок смарт-часов восстанавливается
•
![](https://habrastorage.org/webt/gt/u1/ia/gtu1iaz0-ajkbqpeq8n6dmql4zq.png)
← Предыдущий дайджест. Если у вас есть другие интересные материалы или вы нашли ошибку — пришлите, пожалуйста, в почту.