AppFiles - Mobile Development
2.13K subscribers
2.76K photos
38 videos
11 files
3.69K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
SSZipArchive - простая библиотека для архивации и разархивации файлов на iOS, macOS, tvOS, watchOS и visionOS. Умеет распаковывать zip-файлы, в том числе защищенные паролем или зашифрованных AES, создавать архивы такие же архивы - с паролями и шифрованием (в том числе и прямо из NSData).

SSZipArchive на GitHub: https://github.com/ZipArchive/ZipArchive
Платформа: iOS
⭐️: 5.5K
Стиль программирования в крупномасштабных кодовых базах - на примере SwiftUI

Как поддерживать чистоту и единообразие кода в больших проектах на SwiftUI? Команда Fiverr делится своим подходом в статье на Medium. Они рассказывают, как создавали и внедряли гайд по стилю кодирования, который помогает масштабировать кодовую базу и облегчает командную разработку.

В статье подробно разбирается, почему важно придерживаться единой структуры файлов, как правильно использовать // MARK: для навигации, и почему архитектурная последовательность вроде MVVM становится критичной при росте проекта. Также затрагиваются вопросы форматирования кода, модульности и повторного использования компонентов — всё ради того, чтобы в любой момент новый разработчик мог быстро погрузиться в проект без хаоса и лишних вопросов.

Эта статья — отличный пример того, как инженерная культура напрямую влияет на качество продукта.

Статья: https://medium.com/fiverr-engineering/mastering-coding-style-guides-for-large-scale-codebases-with-a-swiftui-case-study-29619450bc79
Платформа: iOS
👏: 617
👍1
Линтер уходит: ускорение сборки APK-файлов для Android

Автор делится опытом оптимизации сборки APK-файлов в Android-проектах. Он обнаружил, что задача lintVitalAnalyzeRelease, выполняемая по умолчанию при сборке релизных APK, может занимать значительное время, особенно в проектах с множеством модулей.​

Используя Gradle Build Scan, он проанализировал временные затраты на различные задачи сборки и выяснил, что отключение выполнения lint-задач в CI-среде может существенно сократить общее время сборки. Это особенно актуально для автоматизированных систем сборки, где каждый запуск происходит в чистом окружении, и кэширование Gradle не используется.​

Если вы не используете отчеты lint в своих CI-процессах, рассмотрите возможность их отключения, чтобы ускорить сборку и сэкономить ресурсы. Однако помните, что lint-проверки важны для обеспечения качества кода, поэтому полностью отказываться от них не рекомендуется.

Статья: https://proandroiddev.com/lint-be-gone-speed-up-your-android-release-apk-builds-aafb7cf430a7
Платформа: Android
👏: 83
Реактивное управление состоянием в Compose - MVI архитектура

​В статье рассматривается применение архитектурного паттерна MVI (Model-View-Intent) в Jetpack Compose для управления состоянием пользовательского интерфейса.​

MVI предлагает четкую структуру с односторонним потоком данных: пользовательские действия (Intents) обрабатываются ViewModel, которая обновляет Model, а изменения в Model автоматически отражаются в View. Это обеспечивает предсказуемость и упрощает отладку.​

В Jetpack Compose реактивность реализуется с помощью StateFlow. ViewModel содержит MutableStateFlow, представляющий текущее состояние UI. View подписывается на StateFlow и автоматически обновляется при изменении состояния, без необходимости вручную вызывать методы обновления.​

Интенты реализуются как функции в ViewModel, которые изменяют состояние. Это упрощает архитектуру и делает код более читаемым.​

Таким образом, MVI в сочетании с Jetpack Compose и StateFlow позволяет создавать масштабируемые, тестируемые и легко поддерживаемые приложения с четким разделением ответственности между компонентами.

Статья: https://proandroiddev.com/reactive-state-management-in-compose-mvi-architecture-71546c9f1b52
Платформа: Android
👏: 103
Мастерство фокусов на Compose

Среди прочего у нас есть приложение для Android TV. Работая над ним, я столкнулся с тем, что система фокусов в Jetpack Compose устроена сложнее, чем кажется на первый взгляд. Поскольку для ТВ-приложений и устройств без сенсорного управления работа с фокусом играет ключевую роль в навигации, мне понадобилось детально разобраться в теме. Результатами делюсь в статье.

Статья: https://habr.com/ru/companies/habr_rutube/articles/902310/
Платформа: Android
Почему ваше приложение SwiftUI работает медленнее, чем вы думаете

В статье автор делится опытом оптимизации производительности приложений на SwiftUI, основываясь на реальных примерах и анализе с помощью инструмента Instruments.​

Автор начинает с демонстрации проблем, возникающих при использовании избыточных модификаторов и неэффективного управления состоянием в SwiftUI. На примере списка туров группы Metallica он показывает, как чрезмерное количество модификаторов и неправильное использование @State могут привести к значительным просадкам FPS при прокрутке списка.​

Используя Instruments, он выявляет, что каждый элемент списка пересоздается и перерисовывается при каждом изменении состояния, что приводит к снижению производительности. Он предлагает решение: вынести каждый элемент списка в отдельный компонент TourDateRow, который реализует протокол Equatable. Это позволяет SwiftUI эффективно отслеживать изменения и избегать ненужных перерисовок.​

Кроме того, автор подчеркивает важность правильного использования property wrappers. Он рекомендует использовать @State для локального состояния, @ObservedObject и @EnvironmentObject для совместного использования состояния между представлениями, а @StateObject для объектов, которые должны сохраняться на протяжении всего жизненного цикла представления.​

Также обращается внимание на оптимизацию анимаций. Советуют ограничивать область применения анимаций, контролировать их продолжительность и избегать ненужных анимаций, которые могут привести к снижению производительности.​

В заключение, автор подчеркивает, что оптимизация производительности в SwiftUI требует внимательного подхода к управлению состоянием, структуре представлений и использованию модификаторов. Применение этих практик позволяет создавать более отзывчивые и эффективные приложения.

Статья: https://medium.com/@wesleymatlock/why-your-swiftui-app-is-slower-than-you-think-c3e9bb46174b
Платформа: iOS
👏: 130
Night Clock - минимальные, не отвлекающие от работы часы, которые сохраняют экран постоянно включенным. Идеальное решение для прикроватной тумбочки или рабочего стола. Простые, чистые, созданные для того, чтобы светить всю ночь, не обжигая глаза.

Night Clock на GitHub: https://github.com/amitmerchant1990/night-clock
Платформа: Android
⭐️: 31
👍1
Prefire - библиотека для легкой автоматической генерации каталогов интерактивных компонентов (Playbook) и тестов с использованием Preview

Может использоваться для снепшот-тестирования и обнаружения UI регрессий, улучшения превью в SwiftUI состояниями и пользовательскими историями, работы в CI, вроде GitHub Actions, интеграции с Xcode и CLI-инструментами.

Prefire на GitHub: https://github.com/BarredEwe/Prefire
Платформа: iOS
⭐️: 346
🤡1
Что нового в Swift 6.2

Обновление включает множество улучшений, направленных на повышение удобства и безопасности разработки.

Одним из ключевых нововведений является улучшение поддержки параллелизма, что делает работу с асинхронным кодом более надёжной. Также были добавлены новые возможности в строковую интерполяцию, включая поддержку значений по умолчанию, что упрощает форматирование строк. Кроме того, метод enumerated() теперь соответствует протоколу Sequence, что расширяет его применение в различных сценариях.

Swift 6.2 также включает множество мелких, но полезных изменений, таких как добавление raw идентификаторов и улучшения в области безопасности типов. Эти обновления направлены на повышение стабильности и предсказуемости языка.

В целом, Swift 6.2 представляет собой шаг вперёд в развитии языка, предлагая разработчикам более мощные инструменты для создания надёжных и эффективных приложений.

Статья: https://www.hackingwithswift.com/articles/277/whats-new-in-swift-6-2
Платформа: iOS
3
Как я создал плагин для решения самой раздражающей меня проблемы в KMP

В статье разработчик делится опытом создания плагина OpenInTools, призванного упростить работу с KMP проектами. Он столкнулся с проблемой постоянного переключения между различными средами разработки, такими как IntelliJ IDEA для общего кода, Xcode для iOS-компонентов и Cursor для шаблонного кода. Эти частые переключения отвлекали его от основной работы и снижали продуктивность.

Чтобы решить эту проблему, он разработал плагин OpenInTools для JetBrains IDE, который добавляет кнопки на панель инструментов, позволяя быстро открывать проекты в VS Code, Cursor и Xcode. Плагин автоматически определяет рабочие пространства Xcode и предоставляет их в выпадающем меню, избавляя от необходимости вручную искать нужные файлы. Он также предлагает возможность настройки путей для нестандартных конфигураций.

Плагин доступен в JetBrains Marketplace и сопровождается репозиторием для обратной связи и предложений по улучшению. Автор отмечает, что устранение мелких, но постоянных раздражающих факторов в рабочем процессе может значительно повысить продуктивность. Он призывает других разработчиков решать подобные проблемы, создавая собственные инструменты, которые могут быть полезны не только им, но и сообществу в целом.

Статья: https://medium.com/@abd3lraouf/how-i-built-a-plugin-to-solve-my-most-annoying-kmm-dev-problem-91acf3ab2c60
Платформа: Android/кроссплатформа
👏: 53
👍2
Архитектурный линтинг для Swift: часть 4

В этой серии статей мы рассказываем о трудностях написания правил архитектурной проверки в SwiftLint и представляем Harmonize, новый архитектурный линтер с открытым исходным кодом для Swift. В предыдущем посте мы поделились некоторыми лучшими практиками для команд, которые хотят использовать Harmonize.

В этом, заключительном, посте мы объясним разработчикам, как начать использовать Harmonize в своем собственном iOS-проекте.

Статьи:

Архитектурный линтинг для Swift: часть 4
Архитектурный линтинг для Swift: часть 3
Архитектурный линтинг для Swift: часть 2
Расширенные архитектурные правила в SwiftLint: часть 1

Платформа: iOS
This media is not supported in your browser
VIEW IN TELEGRAM
Haze - это библиотека, обеспечивающая размытие в стиле Глассморфизма для Compose. Haze создан на базе Compose Multiplatform и поддерживает все его платформы - Android, iOS, JS и пр.

Haze на GitHub: https://github.com/chrisbanes/haze
Платформа: Android
⭐️: 1.6K
Когда JavaScript недостаточно: Практика разработки нативных модулей для React Native

Эта статья для React Native-разработчиков, которым не хватает возможностей JavaScript. Вы научитесь писать нативные модули на Kotlin, чтобы работать с NFC, Bluetooth, системными API и другими «закрытыми» для RN функциями. Готовый пример + объяснение каждой строки кода.

Статья: https://habr.com/ru/articles/908690/
Платформа: кроссплатформа
GPT, DeepSeek и Qwen: идеальные unit-тесты в эхо-камере

Появление unit- и UI-тестов неизбежно в крупных мобильных приложениях: появляется новая функциональность, старая расширяется, изменяются существующие элементы. Для стабильной работы команда вынуждена внедрять автотесты, что требует инфраструктуры, инструментов, а также времени и внимания для их реализации.

Размышляя над этим, пришла идея использовать LLM для автоматической генерации тестов. Это могло бы снизить нагрузку на разработчиков и минимизировать влияние автотестов на time to market новых фич. Меня зовут Марк, я iOS-разработчик Lamoda Tech. Ранее я рассказывал о своем опыте поиска решений с использованием GPT и Copilot в UI-тестах.

Со временем на AI-арене появились новые заметные игроки — DeepSeek и Qwen. В это же время передо мной как разработчиком возникла задача обеспечить покрытие новой функциональности unit-тестами. Похоже, настал момент для очередного эксперимента: мы протестируем возможности GPT, DeepSeek и Qwen в генерации unit-тестов для iOS-приложения.

Статья: https://habr.com/ru/companies/lamoda/articles/902038/
Платформа: iOS/тестирование/ИИ
Как правильно загружать данные в Kotlin-проектах

Я создал 15 с лишним приложений и прочитал тысячи статей по Kotlin, и я видел так много неправильных способов загрузки данных для отображения в пользовательском интерфейсе, что я беспокоюсь за всех людей, которые неосознанно используют их.

Хуже всего то, что такие статьи продолжают появляться! Каждый месяц я вижу очередную статью / видео / пример кода с несовершенной реализацией событий или стратегий загрузки данных, которые приводят к скрытым ошибкам, которые, скорее всего, проявятся только в продакшене.

Хотите узнать, используете ли вы одну из них? Исправить проблемы? Тогда эта статья для вас, потому что это окончательное руководство, которое вам нужно для правильной загрузки данных в приложениях на Kotlin.

Статья: https://proandroiddev.com/how-to-load-data-kotlin-898f9add9c6f
Платформа: Android
👏: 308
1
This media is not supported in your browser
VIEW IN TELEGRAM
Используем Core Motion в SwiftUI-приложении

Чтобы получить доступ к акселерометру, гироскопам и, при наличии, шагомеру, магнитометру и барометру устройства, будь то iOS, iPadOS, watchOS или visionOS, используйте фреймворк Core Motion. Этот фреймворк сообщает данные о движении и окружающей среде, полученные от встроенных аппаратных датчиков. Использовать его в приложении, созданном с помощью SwiftUI, для создания визуального взаимодействия на основе собранных данных довольно просто.

В следующем примере мы имитируем динамическую глубину, используя данные гироскопа для поворота элементов пользовательского интерфейса и перемещения их тени.

Статья: https://apptractor.ru/info/articles/ispolzuem-core-motion-v-swiftui-prilozhenii.html
Платформа: iOS
Создавайте восхитительные возможности и опыт с камерой и мультимедиа в Android

Команда Android поделилась свежими разработками в области камер и медиавозможностей — с фокусом на Jetpack Media3, CameraX и AI-интеграции. Вот что важно:

🎬 Многооконный видеомонтаж с Media3
Jetpack Media3 теперь позволяет легко собирать клипы в единую композицию с адаптивным UI (например, 2×2 сетка или picture-in-picture). Причём всё это — с поддержкой Jetpack Compose и даже Android XR.

📸 CameraX 1.4: кастомизация без боли
Новый API поддерживает эффекты из Media3. Например, добавить ч/б-фильтр — это буквально три строки. Есть и поддержка собственного OpenGL-рендеринга.

🧠 AI + видео: краткие итоги, перевод, теги
С помощью Gemini и Firebase можно анализировать видео, извлекать ключевые кадры, генерировать описания и аудиоверсии. В демо показаны фичи вроде видео-конспектов и HDR-превью.

🔊 Аудио с заботой о батарее
Android 16 и NDK добавляют PCM Offload — воспроизведение аудио через DSP, минуя CPU. Это экономит энергию и идеально для подкастов и музыки.

Все примеры уже доступны: AI Samples, Composition Demo, PowerPlay и другие.

Статья: https://android-developers.googleblog.com/2025/05/building-delightful-android-camera-media-experiences.html
Платформа: Android
Местное вдохновение, мировое влияние: знакомимся с четырьмя победителями конкурса Swift Student Challenge этого года

В статье рассказывается о Swift Student Challenge, ежегодном мероприятии Apple, которое приглашает студентов со всего мира продемонстрировать свой творческий потенциал с помощью Swift. В этом году было отобрано 350 победителей из 38 стран, а 50 выдающихся победителей были приглашены на Всемирную конференцию разработчиков (WWDC) в Apple Park.

В статье рассказывается о четырех из этих победителей: Тайки Хамамото, который создал Hanafuda Tactics, чтобы сохранить традиционную японскую карточную игру; Марина Ли, разработавшая EvacuMate, чтобы помочь людям во время стихийных бедствий; Лусиана Ортис Ноласко, разработавшая BreakDownCosmic, чтобы сделать астрономию более доступной; и Нахом Ворку, который создал AccessEd, чтобы предоставить образовательные ресурсы для студентов с Wi-Fi или без него. Эти студенты использовали свои навыки программирования для решения реальных проблем и создания инновационных решений, демонстрируя силу технологий для стимулирования позитивных изменений. Apple поддерживает этих молодых разработчиков и их усилия по формированию будущего с помощью технологий.

Статья: https://www.apple.com/newsroom/2025/05/meet-four-of-this-years-swift-student-challenge-winners/
Платформа: разработка
This media is not supported in your browser
VIEW IN TELEGRAM
ProgressUI - это пакет SwiftUI, который реализует легко настраиваемый круговой индикатор прогресса. Он поддерживает динамическое окрашивание в зависимости от самого прогресса, несколько вариантов размеров и плавную анимацию, что делает его идеальным для отображения процессов, состояний загрузки или индикаторов состояния в приложениях для iOS, macOS, watchOS, visionOS и tvOS.

ProgressUI на GitHub: https://github.com/PierreJanineh-com/ProgressUI
Платформа: iOS
⭐️: 14
👍1
Apple опубликовала FastVLM — визуальный энкодер, которая позволяет улучшить работу с большими мультимодальными языковыми моделями.

Visual Language Model (VLM) — это модель искусственного интеллекта, которая сочетает в себе обработку изображений (визуальных данных) и текста (языковых данных). Такие модели умеют одновременно анализировать и понимать как картинки, так и текст, что позволяет им выполнять мультиформатные задачи.

VLM использует два типа нейросетей:

• Визуальный энкодер — преобразует изображение в векторное представление.
• Языковая модель — обрабатывает текст и встраивает его в общий векторный контекст вместе с визуальными данными.

FastVLM как раз является новым визуальным энкодером, разработанным для вывода меньшего количества токенов и значительного сокращения времени энкодинга изображений высокого разрешения.

Модель доступна в конфигурациях с параметрами 0,5B, 1,5B и 3B.

Apple также предоставила демонстрационное приложение для запуска модели на устройствах Apple и распознавания изображения.

FastVLM на GitHub: https://github.com/apple/ml-fastvlm
Платформа: iOS
⭐️: 1.9K
👍2