AppFiles - Mobile Development
2.18K subscribers
3.17K photos
42 videos
13 files
4.16K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
DarkGram: как мы делаем power‑user Telegram‑клиент для iOS — и почему его нет в App Store

Мы небольшой командой развиваем DarkGram — неофициальный Telegram‑клиент для iOS на базе Swiftgram и Telegram‑iOS. Вдохновлялись мы прежде всего философией AyuGram: дать пользователю больше контроля над клиентом, приватностью и локальной историей. Но DarkGram не является попыткой буквально перенести AyuGram на iPhone. Проект постепенно развивается в самостоятельный клиент со своими функциями, интерфейсом и техническими решениями.

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

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

Diagnostics серьёзно меняет подход к поддержке пользователей внутри приложений. HTML-отчёт сразу отвечает на типичные вопросы и уменьшает количество лишней переписки.

Статья: https://apptractor.ru/info/articles/otchety-polzovateley-s-diagnostics-bolee-bystroe-ustranenie-oshibok-s-pomoschyu-ii.html
Платформа: iOS

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

Simslim позволяет запускать гораздо больше iOS-симуляторов на одном Mac, отключая фоновые процессы, которые симулятору не нужны.

Вновь запущенный iOS-симулятор запускает около 180 фоновых служб: Siri, индексирование Spotlight, анализ фотографий, новости, постановка обоев, синхронизация iCloud и так далее. Ничто из этого не имеет значения, когда вы используете симулятор для разработки, тестирования или CI. Simslim отключает эти службы, что сокращает объем памяти, потребляемой каждым симулятором, примерно в 4 раза. 

Что вы теряете

Отключение служб подходит для большинства задач разработки, автоматизации UI и CI, но некоторые функции действительно перестают работать. Вот некоторые из них, о которых стоит знать:

• Spotlight и поиск в настройках ничего не выдают
• Для push-уведомлений нужен apsd, для тестирования StoreKit нужен storekitd
• Для универсальных ссылок нужен swcd
• Средство выбора контактов, фотографий и календаря может работать некорректно без категорий

simslim profiles отображает все категории, поэтому вы можете сохранить категорию с помощью --except или отдельные демоны с помощью --keep.

Simslim на GitHub: https://github.com/MobAI-App/simslim
Платформа: iOS
⭐️: 98
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Интеллектуальные приложения для Android: введение в Jetpacker

В этой серии публикаций Google поможет пройти через все эти варианты выбора. Мы начнём с базового мобильного приложения и постепенно превратим его в персонализированный, интеллектуальный и агентный пользовательский опыт.

Статья: https://apptractor.ru/info/articles/vvedenie-v-jetpacker.html
Платформа: Android

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

Несколько недель назад у меня Wi-Fi просел прямо посреди серии. Картинка стала мыльной примерно на десять секунд, а затем тихо снова стала чёткой. Без индикатора загрузки. Без остановки.

Этот маленький момент находится в конце длинной цепочки, и почти ни одна её часть не запускается в тот момент, когда вы нажимаете Play. В начале 2024 года Netflix превысил отметку в 260 миллионов домохозяйств с подпиской, а с тех пор вырос уже более чем до 300 миллионов. В один вечер ноября 2024 года 65 миллионов потоков одновременно смотрели один боксёрский матч.

То, как Netflix справляется с такой нагрузкой в 2026 году, в основном решается за часы до того, как запрос вообще покидает ваш дом. В этом вся суть, и это изменило мой взгляд на кэширование. Давайте разберёмся.

Статья: https://apptractor.ru/info/articles/kak-netflix-spravlyaetsya-s-260-millionami-odnovremennyh-potokov-bez-buferizatsii.html
Платформа: разработка

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
AI-centric архитектура Flutter-приложения (и не только) для небольших стартапов

Мысли о масштабируемой архитектуре приложений через кодовую структуру и философии «developer as a user»; подходит для indie-разработчиков и стартапов на ранних стадиях.

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

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

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

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

Представьте: вы проходите собеседование на позицию Staff Android Engineer, и интервьюер наклоняется вперёд и говорит:

«Расскажите, как бы вы спроектировали систему автоматической синхронизации, похожую на Google Photos. Меня интересует всё: обнаружение новых фотографий, загрузка, работа без сети, влияние на батарею и серверная часть».

Это один из лучших вопросов по системному дизайну для Staff Android Engineer, потому что он затрагивает каждый уровень системы. Здесь недостаточно просто написать фоновый сервис — нужно одновременно учитывать постоянно меняющиеся ограничения Android, надёжность распределённых систем, особенности энергопотребления и доверие пользователей.

В этой статье я приведу ответ, который дал бы сам. Разберём систему уровень за уровнем.

Статья: https://apptractor.ru/info/articles/razrabotka-sistemy-avtomaticheskoy-sinhronizatsii-fotografiy-android-system-design.html
Платформа: Android/архитектура

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

Serve-avd транслирует Android Emulator на веб-страницу. Он захватывает экран эмулятора через adb screenrecord, предоставляет его в виде потока H.264 WebCodecs (с резервным вариантом MJPEG) плюс канал управления WebSocket и отображает в браузере. Он работает с любым запущенным эмулятором Android (и большинством физических устройств через adb) — без root-прав, без плагинов, без инструментов в вашем приложении.

Фичи:

• Плавный видеопоток H.264 в браузере (WebCodecs) с мгновенной отрисовкой при подключении — без ожидания следующего кадра
• Полное взаимодействие: касание, перетаскивание и перемещение мышью, прокрутка колесиком
• Навигация Android из браузера: Назад, Домой, Недавние, питание, громкость, переключение тем, скриншот
• Переадресация клавиатуры — ввод текста непосредственно в эмулятор, клавиша Escape — «Назад», ⌘⇧H — «Домой»
• logcat перенаправляется в браузер (и отображается в консоли браузера для чтения инструментами MCP, используемыми в браузере)
• Недавние действия доступны на панели инструментов браузера и в журнале событий serve-avd
• Вывод иерархии пользовательского интерфейса для агентов: serve-avd ax (uiautomator → JSON)
• Несколько эмуляторов одновременно — загрузка и подключение AVD прямо с панели «Устройства»
• Работает в headless режиме через тот же HTTP API, если браузер не подключен

Размещенные эмуляторы сложно тестировать. serve-avd позволяет сначала протестировать размещенную инфраструктуру локально для более быстрой итерации. Когда вы будете готовы разместить эмулятор удаленно, просто туннелируйте обслуживаемый URL-адрес, и пользователи смогут взаимодействовать с эмулятором, как если бы он работал локально на их устройстве. Это также отличный способ передать эмулятор агенту ИИ: всё управляется по протоколу HTTP + WebSocket, скриншоты и дампы пользовательского интерфейса создаются одной командой, а журнал событий показывает, что сделал агент.

Serve-avd на GitHub: https://github.com/hsandhu/serve-avd
Платформа: Android
⭐️: 4

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

Вопрос 11. Когда вы бы использовали Core Data?
Вопрос 12. Когда вы бы выбрали SQLite вместо Core Data?
Вопрос 13. Как спроектировать Offline First iOS-приложение?
Вопрос 14. Как синхронизировать локальные и серверные данные?
Вопрос 15. Как разрешать конфликты синхронизации?

Первая часть, про архитектуру приложения. Вторая про сетевой слой.

Статья: https://apptractor.ru/info/articles/50-voprosov-o-system-design-otvety-na-kotorye-dolzhen-znat-kazhdyy-senior-ios-razrabotchik-chast-3.html
Платформа: iOS

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

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

В результате компании удаётся выжать из времени запуска очередное двукратное ускорение, постепенно уменьшающиеся до 1,3 раза или, что более вероятно, зафиксированные мной 1,2 раза.

Это хорошо. Однако ответственность за архитектуру критического пути запуска по-прежнему лежит на разработчике.

Статья: https://apptractor.ru/info/articles/kak-apple-v-ios-27-udalos-sokratit-vremya-zapuska-na-30.html
Платформа: iOS

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

LNPopupController — это фреймворк для отображения контроллеров представлений в виде всплывающих окон для других контроллеров представлений, аналогично мини-плеерам Apple Music и Podcasts.
Фреймворк спроектирован как универсальное решение, подходящее для большинства сценариев, поэтому он реализован в виде категории для UIViewController. Каждый контроллер представления может отображать всплывающую панель, закреплённую относительно нижнего элемента интерфейса.

Для UITabBarController и его подклассов панель по умолчанию закрепляется над панелью вкладок. Для UINavigationController и его подклассов — над панелью инструментов. В остальных контроллерах всплывающая панель отображается в нижней части экрана. Подклассы контроллеров представления также могут предоставлять собственные элементы для закрепления панели.
Фичи:

• Поддержка стеклянного дизайна iOS 26 с сохранением подходящего внешнего вида на предыдущих версиях iOS.
• Поддержка iOS 13 и новее.
• Распространение в виде Swift Package Manager-пакета для проектов на Swift и Objective-C.
• Корректная интеграция с современным UIKit.
• Есть реализация SwiftUI

LNPopupController на GitHub: https://github.com/LeoNatan/LNPopupController
Платформа: iOS
⭐️: 3.1K
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
📺 Видео и подкасты за неделю

(iOS En) Complex UI: Recreating iOS Lock Screen UI Animations Using SwiftUI
(iOS En) SwiftUI Network Reachability with NWPathMonitor and Observation
(iOS En) Elastic Custom Segmented Control - SwiftUI
(And En) Android XR fireside talk: Building the future of spatial experiences
(And En) Beginner's Guide to Analytics Logging on Android With Firebase Analytics
(And En) Tiny Models, Big Impact: On-Device AI for Real Apps 
(And En) The State of Amper
(And En) Run, Kotlin, Run!
(Crs En) How You Get the REAL Liquid Glass Effect In Compose Multiplatform
(Crs En) Full-Stack Kotlin AI: Powering Compose Multiplatform apps with Koog & MCP
(Crs En) What Nobody Told Us About Shipping Kotlin to iOS
(Dev Ru) Spec-Driven Development: теория, инструменты, практика
(Dev Ru) Как за три дня собрать прототип продукта и сократить месяцы согласований
(Dev Ru) Зачем учить Kotlin, если есть ИИ?
(Dev Ru) Spec-Driven Development на практике — SDD, BMAD, OpenSpec, вайб кодинг

🧳 Прошлые видео:

(iOS Ru) Инструменты для мониторинга производительности iOS-приложений
(iOS Ru) Разбор SwiftUI проекта стартапа с AI на борту
(iOS Ru) Вам не нужно хранилище в приложении
(And Ru) Navigation 3 для Compose: что нового и зачем это нужно?
(And Ru) Роман Елизаров про Kotlin, корутины и работу в Jetbrains

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

Этой статьёй я открываю цикл материалов, в которых будут собраны мысли, советы и инструкции о том, как сделать приложение и процессы его разработки измеримыми, как находить «узкие места», диагностировать проблемы и причины их возникновения, а также фиксировать их наличие. Минимум кода, сложных терминов и «rocket science» — только практический опыт и наработки по различным метрикам.

Эта тема далеко не новая, и многие моменты могут показаться очевидными. Однако, чтобы разобраться в нюансах, необходимо начать с базы. Вовсе не обязательно делать именно так. Буду рад узнать, как вы работаете с теми или иными метриками.

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

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

Flighty KMP - трекер полетов в стиле Flighty, созданный с помощью Compose Multiplatform, ориентирован на Android, iOS, десктопы (JVM) и веб-версии (Kotlin/Wasm) из единой кодовой базы. Все данные имитируются — замороженный снепшот "Пн, 20 июля" с одним рейсом в воздухе.

Есть демонстрация: luca992.github.io/flighty-cmp — веб-версия (Kotlin/Wasm), которая загружается прямо из папки docs/ этого репозитория через GitHub Pages (scripts/publish-web.sh генерирует её заново).

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

Flighty KMP на GitHub: https://github.com/luca992/flighty-cmp
Платформа: Android/кроссплатформа
⭐️: 20

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

Андрей Карпати недавно написал в X о своём новом любимом способе работы с LLM — «хорошей длинной сессии бесцельного проговаривания мыслей», как он сам это назвал.

Мы с моим кофаундером занимаемся этим уже несколько месяцев. По сравнению с обычным текстовым вайб-кодингом это настолько большой шаг вперёд, что я уже не помню, когда в последний раз использовал клавиатуру, чтобы написать промпт агенту. На нас тревожно смотрели люди за соседними столиками в кофейнях. Соседи закрывали окна, пытаясь уснуть, пока мы в час ночи вслух излагали свои мысли Codex. Было и множество других неловких ситуаций, о которых мне лучше не вспоминать.

Но дело в том, что это чертовски хорошо работает. Мы просто не можем остановиться.

Сначала я постараюсь объяснить, почему считаю такой подход будущим взаимодействия с агентами. Затем поделюсь несколькими советами, которые помогут получить максимум пользы от подобных монологов. Прошу только об одном: попробуйте. Обещаю, возвращаться к прежнему способу вам уже не захочется.

Статья: https://apptractor.ru/info/articles/10x-ramble-coder.html
Платформа: разработка

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

Flare — это современный и легковесный фреймворк на Swift, упрощающий работу со встроенными покупками и подписками. Построенный на базе StoreKit и StoreKit 2, он предоставляет чистый унифицированный API с поддержкой async/await и включает готовые UI-компоненты для бесшовной интеграции на всех платформах Apple.

Фичи:

• Полная поддержка покупок — расходуемые (consumable) и нерасходуемые (non-consumable) товары, а также подписки
• Промоакции — поддержка промо-предложений и вводных (introductory) предложений
• Современный Swift — использование async/await для чистого и читабельного кода
• StoreKit 1 и 2 — унифицированный API, поддерживающий обе версии StoreKit
• UI-компоненты — готовые представления на SwiftUI и UIKit для отображения продуктов
• Кроссплатформенность — совместимость с iOS, tvOS, watchOS, macOS и visionOS
• Тщательное тестирование — полное покрытие модульными (unit), интеграционными и snapshot-тестами

Flare на GitHub: https://github.com/space-code/flare
Платформа: iOS
⭐️: 68
 
👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
Как R8 в два раза ускорил работу корутин Kotlin на Android

Когда команда Compose начала исследовать производительность, выяснилось, что корутины являются узким местом для многих операций, выполняемых вне композиции. Например, 80% времени, затрачиваемого на создание и обновление Modifier.clickable, уходило на запуск и отмену внутренних корутин, обрабатывающих обновления InteractionSource. На основании этих наблюдений значительная часть первых работ по оптимизации была направлена на исключение корутин из стандартного пути выполнения и откладывание инициализации до момента, когда она действительно понадобится.

Статья: https://apptractor.ru/info/articles/kak-r8-v-dva-raza-uskoril-rabotu-korutin-kotlin-na-android.html
Платформа: Android

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

TextKit — это редактор форматированного текста с поддержкой таблиц и верстки, предназначенный для многоплатформенной работы с Compose (Android, iOS, Desktop/JVM и Web — Wasm и JS). В комплект входят контейнер состояния TextKitState, готовые композабл редактора, панель форматирования, всплывающие окна для ссылок, выравнивание абзацев по левому краю, по центру, по правому краю и по ширине, а также универсальная система триггеров для упоминаний, хэштегов и команд через косую черту. TextKit также поддерживает встроенные блоки: изображения и другое содержимое, которое нельзя отрисовать напрямую, отображаются как кликабельные заполнители, а таблицы остаются полностью редактируемыми. Кроме того, движок предоставляет полноценную отмену и повтор действий с объединением последовательных операций, сериализацию и десериализацию без потери данных в документ JSON, похожий по структуре на формат ProseMirror, а также экспорт в HTML и Markdown в варианте GitHub.

В отличие от редакторов, которые обрабатывают HTML или Markdown, TextKit сохраняет структурированный JSON-документ (тип: "doc" → блочные узлы → встроенные блоки с метками), поэтому стили, списки, ссылки и встроенные токены (упоминания, хэштеги) сохраняются в течение всего цикла загрузки → редактирования → экспорта. Когда вам нужно поделиться контентом, функции toHtml() и toMarkdown() генерируют эти форматы по запросу.

TextKit на GitHub: https://github.com/jjrodcast/TextKit
Платформа: Android/кроссплатформа
⭐️: 60

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

Собрать и опубликовать iOS-приложение без macOS нельзя — точка. Xcode, подпись, нотарификация, выгрузка в App Store Connect — всё это живёт только на маке. Флаттерщики и React Native-разработчики упираются в это на последнем шаге: код пишется где угодно, а .ipa собирается только на технике Apple.

Для разработчика из РФ/СНГ к этому добавляются два специфических барьера:

Железо. Apple официально ушла, Mac — параллельный импорт. Гарантии Apple нет (гарантию обязан обеспечить продавец по закону о защите прав потребителей), цены зависят от того, где смотреть — подробнее в варианте 1.

Оплата. Российские карты не работают в зарубежных сервисах. MacStadium, MacinCloud, Codemagic, да и сам Apple Developer Program ($99/год) — всё требует работающую международную карту.
Разберём варианты по-честному, с ценами.

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

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

Первая часть, про архитектуру приложения. Вторая про сетевой слой. Третья — локальное хранилище и Offline-First архитектура.

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

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

Именно поэтому оптимизация производительности — одна из любимых тем на собеседованиях senior iOS-разработчиков.

Интервьюеры не ожидают, что вы выучите Instruments наизусть или дословно перескажете документацию Apple. Им нужны инженеры, способные находить узкие места, правильно расставлять приоритеты при оптимизации и принимать обоснованные компромиссные решения на основе реальных производственных сценариев.

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

Статья: https://apptractor.ru/info/articles/50-voprosov-o-system-design-otvety-na-kotorye-dolzhen-znat-kazhdyy-senior-ios-razrabotchik-chast-4.html
Платформа: iOS

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