AppFiles - Mobile Development
2.17K subscribers
3.17K photos
42 videos
13 files
4.16K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
Локальные LLM на iPhone: память, Core ML, MLX и ограничения

Поговорим про:

1. Архитектуру Apple Silicon и Unified Memory — почему не можем использовать всю доступную память;
2. Память, квантование и KV Cache — где приложения начинают падать и как это отловить;
3. Core ML и MLX — чем отличаются, где какой быстрее и почему нельзя всё запускать на нейронном процессоре;
4. Температуру и троттлинг — что происходит с телефоном на длинной сессии;
5. Гибридный пайплайн — как взять сильные стороны обоих фреймворков и получить стабильную генерацию. Это практический разбор с примерами кода, замерами на Llama 3 1B и выводами, когда локальная модель оправдана, а когда лучше использовать серверные модели.

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

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

Untold Engine — это XR-движок с открытым исходным кодом на Swift/Metal для высокопроизводительных приложений пространственной визуализации для платформ Apple, предоставляющий разработчикам полный контроль над рендерингом, шейдерами и конвейером обработки данных.

Untold Engine создан для разработчиков и команд, которые:

• Нужен полный контроль над рендерингом, шейдерами и системами движка Metal
• Предпочитают нативную архитектуру Swift + Metal на платформах Apple
• Разрабатывают приложения XR, 3D или пространственной визуализации
• Необходимо обрабатывать большие сцены, потоковые данные или пользовательские конвейеры обработки ресурсов
• Хотят открытый движок, который можно изучать, модифицировать, расширять и встраивать

Untold Engine на GitHub: https://github.com/untoldengine/UntoldEngine
Платформа: iOS
⭐️: 125
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👎1
Одна строчка, которая пожирала нашу память

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

Эта история служит важным напоминанием:

Если contentType формируется из значения, уникального для каждого элемента на протяжении всего срока жизни списка, он засорит хранилище повторного использования Compose.

Статья: https://apptractor.ru/info/articles/odna-strochka-kotoraya-pozhirala-nashu-pamyat.html
Платформа: Android

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

Общий настрой треда: переход из Android в бэкенд реалистичен, но Kotlin сам по себе не делает его простым. Большинство участников считают, что опыт старшего мобильного разработчика переносится частично: архитектурное мышление, Kotlin, корутины, проектирование интерфейсов программирования и опыт промышленной разработки остаются ценными. Однако серверная разработка требует отдельного набора знаний, и на собеседованиях придётся конкурировать с людьми, которые много лет работали с базами данных, распределёнными системами и инфраструктурой.

Статья: https://apptractor.ru/info/articles/14-let-v-android-razrabotke.html
Платформа: Android/карьера

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

Приложение для управления задачами со всеми необходимыми функциями.

Фичи:

• Повторяющиеся задачи — Создавайте задачи, которые повторяются ежедневно, еженедельно или ежемесячно.
• Вложенные подзадачи — Организуйте работу с помощью глубоко вложенных подзадач, без ограничений по глубине.
• Поиск — Быстро находите любую задачу с помощью встроенного поиска.
• Резервное копирование — Автоматическое и ручное резервное копирование; экспорт данных в файл JSON.

Tidy на GitHub: https://github.com/Gauravkr7488/Tidy
Платформа: Android
⭐️: 15

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

Если бы неделю назад мне сказали, что .fixedSize спасёт мне вторую половину рабочего дня, я бы рассмеялся.

Уже одно название словно предупреждает: этот модификатор загонит вас в угол. Кому вообще нужны представления, зафиксированные в статическом размере? Поэтому, как и многие разработчики на SwiftUI, я мысленно отправил его в категорию «модификаторы, которыми я никогда не воспользуюсь».

А затем мне досталась задача по компоновке, которую — вот неожиданность — можно было аккуратно решить только с помощью .fixedSize.

И она преподала мне урок, который стоило усвоить много лет назад: плохих API не существует — бывают лишь интерфейсы, для которых вы ещё не нашли подходящий сценарий. Каждый модификатор SwiftUI появился по определённой причине. Принципиально избегая какого-то из них, вы без всякой пользы сокращаете собственный набор инструментов.

Статья: https://apptractor.ru/info/articles/nakonets-to-ya-nashel-primenenie-dlya-fixedsize.html
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
🤷‍♂1🤣1
Diligence - экраны "О приложении" на SwiftUI

Diligence — это легковесный пакет Swift, содержащий набор UI-элементов для создания About экранов приложений для iOS и macOS.

Diligence на GitHub: https://github.com/inseven/diligence
Платформа: iOS
⭐️: 21
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Picture-in-Picture в iOS: от запуска до переключения контента

С системной функцией Picture-in-Picture (PiP) сталкивались, пожалуй, все владельцы iPhone: кто-то смотрит видео на фоне переписки, кто-то общается по видеосвязи в любимых мессенджерах. Для пользователя это просто удобство, а для разработчика видеосервиса - отдельный механизм со своей инфраструктурой, жизненным циклом и набором ограничений. В этой статье я разберу интеграцию PiP как встроенного плеера: от первого запуска до переключения контента. Поделюсь нюансами, с которыми вы точно столкнётесь на практике, и покажу, как обойти типовые грабли

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

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Погружение в One‑Time Events в Android

Представьте, перед вами задача — после авторизации пользователя навигировать его на главный экран, или показать snackbar, например, об ошибке.

В Android для таких событий есть специальное название — One‑Time Events, или же просто Effects — события, которые мы отправляем UI из ViewModel и хотим, чтобы они обработались ровно один раз.

И они отличаются от состояния экрана! Состояние существует всегда, а effect отправляется и обрабатывается единожды; в состоянии существуют данные, с которыми user взаимодействует, или которые повторно могут отображаться на экране, когда как effect — совершенно противоположное.

Моделировать такой паттерн можно несколькими способами: через состояние, SharedFlow или Channel. В этой статье мы разберем на простом примере каждый подход и обсудим минусы и плюсы, а также обсудим лучшее обходное решение!

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

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

Дело было не в этом. Тот же запрос, та же таблица, тот же код, который мы выпустили три года назад, — только теперь он незаметно перестал работать быстро.

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

Статья: https://apptractor.ru/info/articles/spustya-3-goda-i-200-millionov-strok-ya-nakonets-to-perestal-ispolzovat-uuid-v-kachestve-klyucha.html
Платформа: база данных

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

Debroid (DEBug + AnDROID) — это headless CLI, работающий по протоколу Java Debug Wire (JDWP), позволяющий агентам ИИ — Claude Code, Grok Build, Codex, OpenCode, Cursor, Antigravity или любому другому приложению с терминалом — отлаживать работающее Android-приложение так же, как это делал бы человек в Android Studio: устанавливать точки останова, перехватывать исключения, пошагово выполнять код, проверять и изменять переменные, отслеживать поля — всё без графического интерфейса и в строгом, машиночитаемом формате JSON.

Традиционные среды разработки Android очень визуальны. Хотя помощники ИИ могут писать код, они фактически «слепы», когда дело доходит до отладки, поскольку они не могут щелкать мышью по интерфейсу Android Studio, чтобы проверить память или приостановить выполнение. Debroid устраняет этот пробел. Он действует как слой преобразования между чистым терминалом (который агенты ИИ отлично используют) и виртуальной машиной Android. Предоставляя интерфейс командной строки, который выводит детерминированный JSON, агент ИИ может автономно предположить наличие ошибки, запустить приложение, определить точную строку кода, считать текущее состояние устройства и оценить возможность исправления — предоставляя агентам тот же глубокий анализ ситуации во время выполнения, который ранее был доступен только разработчикам-людям.

Debroid на GitHub: https://github.com/PatilShreyas/debroid
Платформа: Android
⭐️: 70

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

(iOS En) Complex UI: Apple Sports App's Timeline Slider Interaction Using SwiftUI
(iOS En) SwiftUI Image Caching Explained - Faster Lists & Better Performance
(iOS En) iOS 27 Siri Bubble Effect Using SwiftUI
(And Ru) 7 стадий AI в разработке: от скептика к архитектору
(And En) Android AI Tools: Vibe coding, sub-agents, and the Android CLI
(And En) The 8 Golden Rules of Writing Clean Functions - Clean Code In Kotlin
(And En) Crafting Delightful Experiences
(And En) Increasing Quality of AI Generated Kotlin Code
(And En) How Kotlin Powers Functional Design: MCP Edition
(And En) Securing Gradle Builds Full Course
(Crs En) Can Kotlin Swift Interop Ever Be Perfect?
(Crs En) Livecoding Soundscapes with Compose Multiplatform
(Crs En) Hot-Reloading Kotlin/Native
(Crs En) Compose beyond UI : Display and Print!
(Dev Ru) UX-ресерч в эпоху AI — AI в исследованиях, ResearchOps, Muse Group
(Dev En) Introducing Gemini Robotics 2
(Mrk En) Все видео Google Playtime EMEA 2025

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

(iOS Ru) Код, который не тормозит: секреты производительности на iOS
(And Ru) Combine с нуля — реактивщина это просто
(Dev Ru) Тулкиты кодогенерации Android vs iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
От object detection к классическому CV: разрабатываем сканер для слабых смартфонов

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

Внутри продукта эта технология называется MotionCode. Внешне всё выглядит довольно просто: панель воспроизводит последовательность визуальных элементов, камера телефона считывает их, а приложение восстанавливает код.

На практике путь от первого прототипа до стабильной работы оказался гораздо сложнее. Мы успели обучить модель для object detection, столкнуться с ограничениями мобильного железа, отказаться от нейросети и почти без опыта в компьютерном зрении построить собственный real-time-пайплайн обработки кадров.

Статья: https://habr.com/ru/articles/1067188/
Платформа: разработка

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

Wurstfinger — это клавиатура для iOS, вдохновленная MessagEase и написанная на SwiftUI. Она переносит удобные для большого пальца жесты из Thumb-Key и оригинальной раскладки MessagEase на устройства Apple, включая круговые жесты для заглавных букв, жесты возврата для знаков препинания и правила создания символов с диакритическими знаками.

Традиционные клавиатуры QWERTY занимают лишнее место на экране и требуют точного нажатия. Wurstfinger использует сетку 3х3 со свайпами, поэтому ваши большие пальцы меньше перемещаются и чаще нажимают на нужные клавиши — даже на маленьких экранах. После того, как вы освоите эту клавиатуру (несколько дней практики), вы будете печатать быстрее и с меньшим количеством ошибок.

Wurstfinger на GitHub: https://github.com/cl445/wurstfinger
Платформа: iOS
⭐️: 25
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Поддержка нескольких версий iOS в SwiftUI без превращения ваших представлений в хаос

Одно из главных достоинств SwiftUI — это скорость его развития. На каждой конференции WWDC представляются новые API, новые модификаторы и небольшие улучшения, повышающие удобство использования, благодаря которым код пользовательского интерфейса становится чище и выразительнее. Естественно, вам хочется начать их использовать.

А потом компилятор напоминает вам, что ваше приложение по-прежнему поддерживает старые версии iOS.
'sectionIndexLabel' is only available in iOS 26.0 or newer

На первый взгляд, это не кажется большой проблемой. Swift поддерживает проверки доступности уже много лет, поэтому обертывание нового кода в директиву if #available кажется очевидным решением. К сожалению, SwiftUI не всегда так прост.

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

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

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

Статья: https://apptractor.ru/info/articles/podderzhka-neskolkih-versiy-ios-v-swiftui-bez-prevrascheniya-vashih-predstavleniy-v-haos.html
Платформа: iOS

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Как мы построили систему регрессионного UI-тестирования для iOS-приложения: XCUITest, mock backend и XcodeBuildMCP

В этой статье разберём, как эти компоненты соединяются в единый процесс: от сценария, описанного тестировщиком, до воспроизводимого запуска в CI.

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

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Showcase Layout Compose - подсветка UI

Showcase Layout Compose создает красивые анимированные эффекты подсветки для ваших интерфейсов. С поддержкой нескольких платформ и двумя различными вариантами для демонстрации:

• ShowcaseLayout: Классическое полноэкранное наложение с вырезами
• TargetShowcaseLayout: Современная целевая подсветка с настраиваемыми формами

Showcase Layout Compose на GitHub: https://github.com/tahaak67/ShowcaseLayoutCompose
Платформа: Android/кроссплатформа
⭐️: 124

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

Что будет, если запустить тяжелую фоновую обработку данных, а пользователь закроет экран? Если мы не контролируем этот процесс, потоки продолжат работу, сжигая батарею, процессорное время и создавая утечки памяти. Для решения этой проблемы в Kotlin Coroutines применяется концепция Structured Concurrency.

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

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
Концентрические кнопки с использованием нового API SwiftUI в iOS 27

SwiftUI для iOS, iPadOS и macOS 27 (далее я буду сокращать до *OS 27) приносит множество новых дополнений. Одно из таких дополнений, которое меня особенно заинтересовало, — это возможность считывать значение свойства concentricCornerRadii для GeometryProxy. Я чувствовал, что это может стать способом создания действительно концентрической формы кнопки. С момента появления концентричности углов я с нетерпением ждал появления специального ButtonBorderShape, учитывающего углы. До сих пор каждое обновление меня разочаровывало. Даже в *OS 27 SwiftUI по-прежнему не хватает полноценной формы, но теперь у нас есть возможность создать собственное решение, которое интегрируется в стандартные API SwiftUI, максимально скрывая нашу собственную реализацию.

Статья: https://apptractor.ru/info/articles/kontsentricheskie-knopki-s-ispolzovaniem-novogo-api-swiftui-v-ios-27.html
Платформа: iOS

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

Neon Vision Editor - нативный редактор для Markdown, заметок и кода на macOS, iPhone, iPad и Apple Vision Pro. Минималистичный дизайн. Быстрое редактирование, быстрый доступ к файлам, отсутствие лишних компонентов IDE.

Элементы архитектуры:

EditorViewModel — единая точка оркестрации, с которой взаимодействует интерфейс для каждого окна или сцены.
• Сериализованные команды вкладок отделяют вкладку интерфейса от ресурса документа, который она представляет, сохраняя для каждого документа положение курсора и состояние области просмотра при асинхронной загрузке и обновлениях.
• Открытые локальные документы используют события NSFilePresenter, а также ограниченные проверки метаданных и содержимого. Неизменённые буферы обновляются на месте; для изменённых предлагаются варианты Keep Local, Reload from Disk или Compare.
• Нативные бриджи редактора управляют созданием объектов TextKit/UIKit и прокруткой. SwiftUI отвечает за размещение областей интерфейса, включая обёрнутый вариант разделения исходного текста и предпросмотра в macOS.
• Доступ к файлам, разбор, сравнение различий, структурированные снепшоты и другая тяжёлая работа выполняются вне главного актора; изменения состояния интерфейса возвращаются в @MainActor.
• Оболочки для отдельных платформ остаются минимальными. visionOS использует тот же редактор семейства UIKit, адаптируя только представление под пространственные интерфейсы.
• Удалённые сеансы включаются только по желанию пользователя; macOS отвечает за SSH и размещение посредника соединений, а iPhone, iPad и Apple Vision Pro подключаются в качестве клиентов.
• Сборки для App Store не содержат механизма автоматического обновления. Отдельная версия для прямого распространения на macOS подключает Sparkle и использует подписанный канал обновлений, размещённый на GitHub Pages.
• Конфиденциальные учётные данные и закладки SSH-ключей хранятся в Keychain через SecureTokenStore, а не в обычных настройках.

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