AppFiles - Mobile Development
2.18K subscribers
3.13K photos
41 videos
13 files
4.11K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
LoopScroll - бесконечно прокручиваемая постраничная навигация

LoopScroll - контрол для бесконечной прокрутки в iOS, построенный на основе UICollectionView. Поддерживает горизонтальную и вертикальную прокрутку, автоматическую прокрутку и привычный API делегата/источника данных.

Особенности:

• Бесконечная прокрутка — плавная перемотка элементов в обоих направлениях
• Горизонтальная и вертикальная — переключение направления прокрутки с помощью одного свойства
• Автоматическая прокрутка — настраиваемая автоматическая прокрутка на основе таймера
• Привязка к странице — настраиваемая компоновка обеспечивает точную привязку к странице с учетом скорости нажатия
• Источник данных и делегат — привычные протоколы в стиле UICollectionView
• Совместимость с Objective-C — все публичные API доступны через @objc
• Легковесный — нет внешних зависимостей, ~500 строк кода на Swift

LoopScroll на GitHub: https://github.com/iLiuChang/LoopScroll
Платформа: iOS
⭐️: 183

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
UISlider изнутри: почему setValue не работает во время settle-анимации и как я это обошел

В iOS 26 у UISlider появился liquid-glass-вид и физика доводки (settle) после того, как пользователь отпускает палец. Если честно, я не проверял, как это выглядело в старых версиях и как оно работало, так как до iOS 26 ни в своих проектах, ни в тех, что я писал на работе, я не использовал стандартный компонент, так как его внешний вид никого не устраивал. У такой доводки есть побочный эффект: если в этот момент дернуть setValue(_:animated:) извне, наш слайдер на один кадр едет в новую точку, а потом откатывается туда, куда его тянет settle. removeAllAnimations() не помогает: анимация идёт не через CABasicAnimation, а через property-driver на display link. Дальше про то, как я нашёл рабочий путь это исправить.

Самое неприятное в этом баге было не само дёрганье, а ощущение, что публичный API говорит "значение поставлено”, а визуальный слой через кадр отвечает “нет, я лучше вернусь куда хотел”. Поэтому я отдельно разделю два пути: runtime-фикс для понимания механики и продовый обход (хотя в личном приложении я пошел бы в прод с фиксом).

Статья: https://habr.com/ru/articles/1055466/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Навигация в Jetpack Compose без магии: что на самом деле делают библиотеки навигации

Вы когда-нибудь задумывались, зачем нужны библиотеки для навигации в Jetpack Compose? Почему мы не можем просто взять mutableStateOf со списком экранов и переключаться между ними? Оказывается, если мы попробуем реализовать такой наивный подход, то столкнёмся с рядом проблем: rememberSaveable не работает, ViewModel не очищаются после ухода с экрана, Lifecycle не работает корректно и многое другое.

В статье разберём, как работают библиотеки навигации в Jetpack Compose и какие задачи они решают на примере библиотеки навигации Modo.

Статья: https://habr.com/ru/companies/hh/articles/1052310/
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
У вас осталось всего несколько недель на вайб-кодинг

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

Затем они сжигают эти деньги, так и не достигая реального прогресса, который позволил бы выйти хотя бы в ноль.

Китайские компании, которые заимствуют веса моделей и выпускают открытые решения за долю стоимости, лишь ускоряют общий спад. GLM 5.2 выглядит интересно, но сейчас он лишь примерно вдвое дешевле, а создавшая его компания тоже теряет деньги.

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

Статья: https://apptractor.ru/info/articles/u-vas-ostalos-vsego-neskolko-nedel-na-vayb-koding.html
Платформа: ИИ

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👎21😁1
ShizuCallRecorder - запись телефонных звонков без root-прав

ShizuCallRecorder - первое приложение с открытым исходным кодом для записи звонков на Android 11 и новее, не требующее прав суперпользователя. ShizuCallRecorder использует Shizuku, чтобы предоставить ADB расширенный набор разрешений, доступных системному приложению. Его также можно рассматривать как оболочку для scrcpy-сервера на устройстве.

Фичи:

• Записывает входящие и исходящие разговоры
• Должно работать даже при использовании Bluetooth или удаленной гарнитуры
• Переключатели безопасности для управления состоянием включения/выключения Shizuku
• Функция автоматической записи звонков с базовыми правилами исключения
• Сохраняет записи с кодеками Opus или AAC
• Приложение работает только при изменении событий на телефоне, не имеет постоянных фоновых процессов и уведомлений

ShizuCallRecorder на GitHub: https://github.com/kitsumed/ShizuCallRecorder
Платформа: Android
⭐️: 794

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Как сломать Swift Concurrency

Нужно выполнять асинхронные операции, поддерживать многозадачность в приложении? Async/await к вашим услугам - просто и приятно. Кооперативный пул эффективно переключает потоки между задачами, а компилятор проверяет типы на потокобезопасность. И даже можно подсоединять старые части кода, написанные ещё на GCD! Вот только приложение на проде почему-то начало виснуть…

Статья: https://habr.com/ru/articles/1055810/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Relux - UDF архитектура на основе Swift 6 Concurrency

Relux — это пакет Swift, который переосмысливает популярный шаблон Redux, используя Swift Concurrency. Библиотека использует стиль однонаправленного потока данных (UDF), одновременно задействуя акторы и структурированный параллелизм для обеспечения безопасного и предсказуемого управления состоянием. Её можно постепенно внедрять в существующие проекты, она бесперебойно работает со SwiftUI и масштабируется от простых приложений до сложных модульных архитектур.

Relux на GitHub: https://github.com/relux-works/swift-relux
Платформа: iOS
⭐️: 19
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Swift 6.2 против вашего оптимизатора: разбираемся с InlineArray, Span и strict memory safety на замерах

Я взял три «памятных» нововведения Swift 6.2, написал на них бенчмарки, прогнал на релизном тулчейне и полез в сгенерированный ассемблер. Вопрос меня занимал не «что это делает», а куда более практичный: дают ли эти фичи реальный выигрыш в цифрах - и в каких случаях оптимизатор Swift давно делает то же самое за вас, бесплатно и молча. Ответ оказался менее очевидным, чем их маркетинг.

Статью я старался написать так, чтобы её читал не только стафф. Поэтому по ходу я коротко объясняю базовые вещи - стек и кучу, ARC, copy-on-write. Если вы это и так знаете, просто пролистывайте врезки «на полях».

Статья: https://habr.com/ru/articles/1056552/
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
10 советов, как получить максимум от Claude Code в iOS-разработке

Claude Code не заменяет знание Swift и глубокое понимание UIKit и SwiftUI. На самом деле всё наоборот: чем лучше вы понимаете платформу, тем точнее можете направлять Claude Code и тем быстрее он работает. 

Думайте о нём не как о junior-разработчике, который пишет код за вас, а скорее как о senior-разработчике, который уже познал весь Apple SDK и ждёт, когда сможет помочь вам продумать задачу.

Эта статья о том, как действительно эффективно использовать Claude Code в iOS-разработке.

Статья: https://apptractor.ru/info/articles/10-sovetov-kak-poluchit-maksimum-ot-claude-code-v-ios-razrabotke.html
Платформа: iOS/ИИ

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
📺 Видео и подкасты за неделю

(iOS En) Deploying to iOS 27: Here are the 3 Major Requirements
(iOS En) SwiftUI Adaptable Sheet's - Landscape Pinned Sheet's
(iOS En) Reorder Lists & Grids in SwiftUI and Save with SwiftData
(iOS En) Complex Scroll Interaction: Infinite Scrollable Calendar
(And En) Create agent skills for on-device generative AI (I/O Connect ‘26)
(And En) Dynamic Callbacks on Android for Google Pay
(And En) Build creative apps with the GenMedia suite (I/O Connect ‘26)
(And En) TestBalloon: Kotlin testing is easier (and more fun) than you think
(And En) Deconstructing OkHttp
(And En) A First Look at the Kotlin Ecosystem Plugin for Declarative Gradle
(Dev Ru) System Design на собеседовании: ошибки, которые тебя топят
(Dev Ru) Электрические автомобили: на пороге технологической сингулярности
(Dev En) Bootiful Kotlin

Прошлогодние видео:

(iOS Ru) Перерисовки в SwiftUI
(And Ru) Мок-собеседование Android-разработчика: middle и выше (+ все собеседования)
(And Ru) Как обойти множественное наследование в Kotlin и Java. Агрегация и композиция
(Dev Ru) Как сделать любую задачу интересной
(Dev Ru) System Design-интервью для практиков

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Renetik Android - Kotlin-фреймворк для реактивных Android-приложений в MVC-стиле

Renetik Android - практичная библиотека Kotlin для разработки Android-приложений: реактивные события и свойства, JSON, постоянные хранилища и пресеты, слой контроллера представления поверх одной Activity, а также набор виджетов и расширений пользовательского интерфейса.

Renetik Android на GitHub: https://github.com/renetik/renetik-android
Платформа: Android
⭐️: 7

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Мне надоело писать один и тот же код. Поэтому я сделал Featuregen

Я уже не тот беззаботный парнишка, что собирал 486-й компьютер. Время бежит, я скуф успел поработать с C++, C#, Java и Kotlin, последние 10 лет занимаюсь мобильной разработкой. Программирование я до сих пор люблю потому что больше ничего не умею. Но чем дольше работаешь, тем чаще ловишь себя на мысли, что от некоторых вещей начинает подгорать. Сегодня я расскажу, как я попытался избавиться хотя бы от части таких вещей.

Статья: https://habr.com/ru/articles/1056776/
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
50 вопросов о System Design, ответы на которые должен знать каждый Senior iOS-разработчик: часть 1

Эта статья открывает серию из пятидесяти вопросов по системному проектированию и архитектуре, которые часто встречаются на собеседованиях Senior iOS-разработчиков. Вместо заучивания готовых ответов вы узнаете, как опытные инженеры рассуждают при решении таких задач.

Статья: https://apptractor.ru/info/articles/50-ios-system-design-1.html
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
AppFiles - Mobile Development
50 вопросов о System Design, ответы на которые должен знать каждый Senior iOS-разработчик: часть 1 Эта статья открывает серию из пятидесяти вопросов по системному проектированию и архитектуре, которые часто встречаются на собеседованиях Senior iOS-разработчиков.…
SVG to SwiftUI Converter - конвертер SVG в SwiftUI Shape

SVG to SwiftUI Converter - инструмент для преобразования SVG в нативные фигуры SwiftUI. Многоцветные SVG-изображения генерируются как многослойные представления SwiftUI, поэтому их исходные цвета сохраняются.

SVG to SwiftUI Converter на GitHub: https://github.com/bring-shrubbery/SVG-to-SwiftUI
Платформа: iOS
⭐️: 1.1K
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Использование mise для установки зависимостей при андроид-разработке

Есть большая и сложная система сборки Gradle и андроид-плагин AGP для установки большей части компонентов Android SDK, необходимых для вашего приложения. Но что, если вам не хочется руками устанавливать Android Studio, Android SDK, cmake, scrcpy и прочие нужные вещи? Здесь на помощь приходит инструмент mise — при кажущейся простоте он умеет все, что нам нужно.

Статья: Есть большая и сложная система сборки Gradle и андроид-плагин AGP для установки большей части компонентов Android SDK, необходимых для вашего приложения. Но что, если вам не хочется руками устанавливать Android Studio, Android SDK, cmake, scrcpy и прочие нужные вещи? Здесь на помощь приходит инструмент mise — при кажущейся простоте он умеет все, что нам нужно.

Статья: https://habr.com/ru/articles/1058494/
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Mirage: как Cloudy превращается из библиотеки размытия в библиотеку эффектов

В этой статье мы разберём архитектуру Mirage: как план объявляется один раз и привязывается при каждой отрисовке, чем различаются типы Optic и почему вместо одного универсального типа используется несколько отдельных, а также как внутренние компоненты — компилятор, общий для всего процесса кэш программ и цепочка фильтров для последовательной обработки слоёв — превращают план в готовое изображение.

Статья: https://apptractor.ru/info/articles/mirage-kak-cloudy-prevraschaetsya-iz-biblioteki-razmytiya-v-biblioteku-effektov.html
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
💅1
System Design: как бы вы отправили 1 миллион уведомлений?

Чёрная пятница. Маркетинговая команда подготовила рекламную кампанию. Ровно в полночь она хочет отправить уведомления одному миллиону пользователей. Задача кажется простой.
Пока вы не понимаете, что мгновенная отправка миллиона уведомлений может перегрузить серверы приложения, поставщиков уведомлений, базы данных и даже внешние API.
Большинство инженеров сразу скажут:
Используйте Kafka.

Это хорошая отправная точка.

Но что произойдёт, если:

• потребители Kafka не будут успевать обрабатывать сообщения;
• Firebase начнёт ограничивать частоту запросов;
• рабочий процесс завершится с ошибкой посреди обработки;
• уведомления нужно персонализировать;
• следующая кампания будет рассчитана не на миллион, а на 100 миллионов пользователей;
• маркетингу внезапно понадобится отслеживание статусов доставки.

Разберём собеседование по системному проектированию, в ходе которого рассматриваются все эти вопросы.

Статья: https://apptractor.ru/info/articles/system-design-kak-by-vy-otpravili-1-million-uvedomleniy.html
Платформа: архитектура

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Аннотации в Kotlin: от @Deprecated до своего KSP-процессора

Аннотации легко воспринимать как декоративную часть языка. Поставили @Deprecated, добавили @Suppress, пометили DTO через @JsonClass - и пошли дальше. Но в большом Android-проекте аннотации быстро перестают быть просто подсказками для IDE. Они становятся контрактом между кодом и инструментами: компилятором, статическим анализатором, генератором кода, DI-фреймворком, сериализатором или внутренней платформенной инфраструктурой.

В этой статье разберем, что на самом деле происходит вокруг аннотаций в Kotlin, чем отличаются SOURCEBINARY и RUNTIME, почему @Composable - это не просто красивая метка, чем kapt отличается от KSP, и на каких практических задачах annotation processing может быть полезен в Android-разработке.

Статья: https://habr.com/ru/companies/uzum/articles/1056652/
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Gradle под капотом: как перестать мучиться и заставить свой компьютер работать на полную мощность?

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

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

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

Давайте заглянем под капот, чтобы настройка сборки перестала быть проблемой.

Статья: https://habr.com/ru/articles/1058260/
Платформа: архитектура

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Cosmos Music Player - премиальный музыкальный плеер для iOS

Cosmos Music Player — это высококачественный музыкальный плеер, поддерживающий синхронизацию с iCloud Drive и локальное хранилище, что обеспечивает пользователям гибкость в управлении музыкой. Приложение разработано для экосистемы iOS и Apple с полной интеграцией с CarPlay.

Премиальный аудиофильский музыкальный плеер для iOS, поддерживающий форматы FLAC, WAV, M4A, MP3, Opus, OGG, DSD и DSF, с расширенными функциями, включая Apple CarPlay, воспроизведение DSD (преобразование DoP и PCM), двойное хранилище (iCloud/локальное), управление плейлистами, интеграцию информации об исполнителях, графический эквалайзер и многоязычную поддержку.

Cosmos Music Player на GitHub: https://github.com/clquwu/Cosmos-Music-Player
Платформа: iOS
⭐️: 113
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM