AppFiles - Mobile Development
2.13K subscribers
2.76K photos
38 videos
11 files
3.69K links
Библиотеки, обучающие статьи, курсы и видео для (мобильных) разработчиков. Если есть вопросы - пишите @lbogolubov.
Download Telegram
Xcode — худшее профессиональное ПО, с которым я когда-либо работал

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

В статье автор делится ошибками и «особенностями» Xcode, которые больше всего его раздражают. Главный совет: держитесь подальше от этой IDE и всегда ищите альтернативы.

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

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

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

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

Статья: https://apptractor.ru/info/articles/delaem-nerazryvnye-chisla-v-dinamicheskom-tekste.html
Платформа: iOS

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

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

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

Статья: https://apptractor.ru/info/articles/vizualnaya-otladka-s-pomoschyu-swift-charts.html
Платформа: iOS

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

В любом случае, как пользователи библиотеки AndroidX, мы несём общую ответственность за сообщение об ошибках в процессе разработки, чтобы они были исправлены. Нельзя рассчитывать, что их обнаружит кто-то другой. В Cash App у нас очень большая кодовая база, и мы делаем много интересного с помощью этих библиотек. Чтобы максимально эффективно использовать бета-версии, мы планируем продолжать выявлять и сообщать о любых найденных ошибках. Это поможет нам не только поддерживать возможность обновления, но и всем остальным, кто использует эти библиотеки. И, кстати, думаю, вам стоит поступить так же!

Статья: https://apptractor.ru/info/articles/vam-sleduet-ispolzovat-beta-versii-androidx.html
Платформа: Android

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Стэнфордский университет выпускает CS193p ("Разработка приложений для iOS") – версия весны 2025 года

В курсе есть видео и вспомогательные материалы по первым 6 лекциям курса CS193p (Разработка приложений для iOS с использованием SwiftUI) весеннего семестра 2025 года в Стэнфордском университете. Это курс, который студенты Стэнфорда проходят для изучения основ разработки приложений для iOS. Дополнительные лекции из этого семестра будут опубликованы в ближайшее время.

Курс проходил до выпуска iOS 26 и Xcode 26, но код, написанный в ходе курса, в основном совместим с новыми версиями. Конечно, большим изменением в Xcode 26 является встроенная помощь LLM, а в iOS 26 в пользовательском интерфейсе появился Liquid Glass, поэтому, конечно, ни в одном из этих видео этого нет.

Курс: https://cs193p.stanford.edu/
Платформа: iOS

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

Настало самое чудесное время года. Время, которое можно провести, участвуя в увлекательном конкурсе по программированию.

Каждый декабрь Эрик Вастл публикует Advent of Code, увлекательный набор упражнений по программированию. С 1 по 12 декабря каждый день публикуется по одному заданию.

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

Вот сообщества для разработчиков:

Swift
Kotlin

Таблица лидеров будет автоматически обновляться, показывая, кто выполнил задачу, и выставляя оценку в зависимости от того, сколько времени у вас на это ушло. Конечно, вы всегда можете игнорировать оценку — это просто для удовольствия!

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

Jetpack Navigation 3 теперь стабилен, и его использование может помочь вам уменьшить технический долг, обеспечить лучшее разделение задач, ускорить разработку функций и поддерживать новые форм-факторы. Google посвящает целую неделю новой библиотеке и поможет вам узнать о Nav3 и начать интегрировать ее в свое приложение.

Вы узнаете о библиотеке в деталях, о том, как выделить в модули код навигации, а также получите множество рецептов кода для типичных случаев использования. В конце недели присоединяйтесь к сессии «Спроси о чем угодно», чтобы эксперты ответили на все ваши вопросы о Nav3. Вот полное расписание:

• Понедельник: Обзор API
• Вторник: Анимации
• Среда: Глубокие ссылки
• Четверг: Модуляризация
• Пятница: Спросите о чем угодно

Платформа: Android

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

В статье iOS-разработчик CleverPumpkin Даниил Апальков разбирает ограничения SwiftUI при построении сложной навигации, с которыми команда столкнулась на одном из своих проектов. Он рассказывает, в каких сценариях приходилось подключать UIKit, чтобы сохранять стабильность, показывает варианты подходов и делится выводами, какие инструменты выбирать для контролируемой навигации.

Платформа: iOS

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

AnyLanguageModel - пакет Swift, предоставляющий готовую замену фреймворку Apple Foundation Models с поддержкой кастомных моделей. Всё, что вам нужно сделать, — это изменить оператор импорта:

- import FoundationModels
+ import AnyLanguageModel

struct WeatherTool: Tool {
let name = "getWeather"
let description = "Retrieve the latest weather information for a city"

@Generable
struct Arguments {
@Guide(description: "The city to fetch the weather for")
var city: String
}

func call(arguments: Arguments) async throws -> String {
"The weather in \(arguments.city) is sunny and 72°F / 23°C"
}
}

let model = SystemLanguageModel.default
let session = LanguageModelSession(model: model, tools: [WeatherTool()])

let response = try await session.respond {
Prompt("How's the weather in Cupertino?")
}
print(response.content)


Поддерживаемые провайдеры:

• Apple Foundation Models
• Core ML models
• MLX models
• llama.cpp (GGUF models)
• Ollama HTTP API
• Anthropic Messages API
• Google Gemini API
• OpenAI Chat Completions API
• OpenAI Responses API

AnyLanguageModel на GitHub: https://github.com/mattt/AnyLanguageModel
Платформа: iOS
⭐️: 572
👍1
Реверс-инжиниринг приложений на Android: знакомство с Frida

Frida — это инструмент, который позволяет вживлять небольшой кусок JavaScript-кода прямо в запущенное приложение и менять его поведение. В статье рассказывается, как работать с Frida, исследовать приложения на телефоне без root-доступа и создавать свои моды.

Статья: https://habr.com/ru/companies/selectel/articles/973526/
Платформа: Android
👍1
5.webm
169.5 KB
Создание анимированных полос в Jetpack Compose

Если мы хотим нарисовать и анимировать полоски в Jetpack Compose, мы можем использовать градиент с его параметрами.

Статья: https://apptractor.ru/info/articles/stripes-jetpack-compose.html
Платформа: Android
MaterialKolor - динамическая цветовая схема Material3 из исходного цвета

MaterialKolor - библиотека Compose Multiplatform для создания динамических цветовых палитр Material Design 3 из любого цвета. Доступные платформы: Android, iOS, JVM (Desktop) и JavaScript/wasm (браузер). Основу этой библиотеки составляет репозиторий material-color-utilities. В настоящее время это библиотека доступна только на Java, и автор хотел сделать её доступной для проектов Kotlin Multiplatform. Исходный код был взят и преобразован в библиотеку Kotlin Multiplatform.

MaterialKolor на GitHub: https://github.com/jordond/MaterialKolor
Платформа: Android/кроссплатформа
⭐️: 755
👍1
Перетаскивание и буфер обмена с помощью Transferable

Используя Transferable, вы не только упрощаете реализацию, но и делаете своё приложение совместимым с современными формами взаимодействия, от буфера обмена до перетаскивания, используя единую модель данных.

Статья: https://apptractor.ru/info/articles/peretaskivanie-i-bufer-obmena-s-pomoschyu-transferable.html
Платформа: iOS

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

Vercel делится тем, как они создавали iOS-версию своего AI-генератора интерфейсов v0. Спойлер: это не Swift и не Flutter. Это мощная демонстрация того, куда движется экосистема React.

Ключевые моменты из статьи:

• React Native + Expo: Основа приложения. Они использовали Expo (с Continuous Native Generation), что позволило веб-разработчикам писать нативный код, практически не выходя из привычной среды.
• React Server Components (RSC) на мобилке: Это самое интересное. Приложение v0 использует ту же архитектуру, что и веб-версия. Сервер стримит компоненты прямо на устройство. Это позволяет переиспользовать огромные куски логики.
• Общий код: Благодаря монорепозиторию (Turborepo), они делят типы, утилиты и даже UI-компоненты между Next.js (веб) и Expo (iOS).
• Стриминг: Ощущение "магии", когда код пишется у вас на глазах, реализовано через потоковую передачу данных. Это не просто запрос-ответ, это живой поток токенов от LLM, который рендерится в реальном времени.
• Производительность: Чтобы скролл и анимации были плавными (60fps), тяжелые вычисления вынесены в отдельные потоки или обрабатываются на сервере.

Vercel доказывает, что граница между вебом и нативом стирается. Если у вас уже есть крутая команда React-разработчиков, вам не обязательно нанимать отдельный штат iOS-инженеров, чтобы сделать продукт мирового уровня.

Статья: https://vercel.com/blog/how-we-built-the-v0-ios-app
Платформа: кроссплатформа
👍1
TakeoffKit - современный механизм синхронизации через CloudKit для любой локальной базы данных

TakeoffKit - это библиотека Swift, упрощающая синхронизацию локальных данных с использованием CloudKit, абстрагируясь от его многочисленных сложностей, таких как преобразование CKRecord, ограничение скорости запросов, обработка ошибок и многое другое. Она предоставляет механизм синхронизации, аналогичный CKSyncEngine от Apple, но с более точным контролем и лучшей обратной совместимостью. Механизм синхронизации разработан для работы с любой локальной средой хранения данных — CoreData, SwiftData, Realm и т.д.

TakeoffKit на GitHub: https://github.com/orloff-n/TakeoffKit
Платформа: iOS
⭐️: 25

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Создание кастомного Toolbar с Jetpack Compose. Подробный разбор всех попыток и решений

Сегодня предлагаю разобрать путь создания кастомного тулбара от первой кривой реализации до оптимизированного решения.

И главная проблема, которую надо решить при создании этого компонента это центрирование title и subtitle. Эта проблема возникает потому что у нас может быть тулбар с разным количеством иконок по обе стороны от заголовка, текстом и иконками или только с title. И если ширина иконок у нас стандартна (44 dp), и достаточно просто умножить эту ширину на количество иконок справа, чтобы понять свободное пространство для title и subtitle, то с текстом с одной или с двух сторон всё намного сложнее, так как мы не можем заранее вычислить ширину этого текста, а значит не можем правильно центрировать и задать ширину title и subtitle.

В этой статье я расскажу, как я решил этот вопрос.

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

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

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

Спойлер: меня не взяли. Но я кое-чему научился в области алгоритмов Swift и тому, как подходить к техническим собеседованиям.

Статья: https://apptractor.ru/info/articles/uroki-izvlechennye-iz-sobesedovaniya-po-swift.html
Платформа: iOS

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

Awesome Jetpack Compose Animations - организованная коллекция (24 штуки) классных анимаций для кнопок, карточек, изображений и многого другого — идеально подходит для улучшения ваших приложений и проектов.

Awesome Jetpack Compose Animations на GitHub: https://github.com/Swapnil-J-Patil/Delightful_Animations
Платформа: Android
⭐️: 13

👨‍🦯‍➡️ AppFiles: код, инструменты, практики, производительность
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Flutter MethodChannel: как подружить Dart с нативным Android (и iOS)

Сегодня поговорим о том, как Flutter-приложению выйти за пределы чисто Dart-мирка и воспользоваться возможностями родной платформы, например, вызвать API Android или iOS напрямую. Например, есть какая-нибудь классная фича в Android SDK, а в Flutter её нет. Как быть? Ответ — писать собственный плагин и использовать MethodChannel.

Статья: https://habr.com/ru/companies/otus/articles/970094/
Платформа: кроссплатформа

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

RemoteCompose всё ещё находится в разработке AndroidX и официально пока не опубликован, однако концепция очень многообещающая.

Сервер перехватывает (capture) любой макет Jetpack Compose и выдает его в компактном сериализованном формате. Это своего рода «скриншот» вашего пользовательского интерфейса, только вместо пикселей вы захватываете фактические инструкции отрисовки. Этот полученный документ содержит всё необходимое для воссоздания пользовательского интерфейса: фигуры, цвета, текст, изображения, анимацию и даже интерактивные области касания. На стороне сервера пишется стандартный код Compose. Не нужно изучать новый DSL (Domain-Specific Language), поддерживать схему JSON или осваивать язык шаблонов. Если вы можете написать это на Compose, вы можете захватить это с помощью RemoteCompose.

В приложении работает простой (платформенный) плеер, который управляет показом и взаимодействием с этим ByteArray. Клиентскому устройству не нужны ваши композабл функции, ваши модели представления или ваша бизнес-логика — ему нужны только байты документа и проигрыватель.

Таким образом, преобразуя макеты Compose в переносимый формат документа, RemoteCompose обеспечивает управляемый сервером пользовательский интерфейс, а значит мгновенное A/B-тестирование, обновление контента в реальном времени и кроссплатформенную согласованность, сохраняя при этом производительность нативного рендеринга. Фреймворк справляется со сложностью сериализации, передачи и рендеринга, позволяя вам сосредоточиться на проектировании превосходного пользовательского опыта.

Статья: https://apptractor.ru/info/news/remotecompose.html
Платформа: Android

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