Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck – Telegram
Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
9.45K subscribers
1.77K photos
86 videos
52 files
4.61K links
Все самое полезное для мобильного разработчика в одном канале.

По рекламе: @proglib_adv

Учиться у нас: https://proglib.io/w/b60af5a4

Для обратной связи: @proglibrary_feeedback_bot

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
🔈 Работа с аудио в Android

DAF - это метод, при котором человек слышит собственную речь с небольшой задержкой (обычно 50-200 мс) через наушники. Такая обратная связь замедляет речь, снижает автоматизм, при котором возникают судорожные повторы, усиливает контроль над артикуляцией и помогает синхронизировать дыхание с речью.

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

👉 Читать статью

🐸 Библиотека мобильного разработчика

#свежак #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
«Этот манёвр будет стоить нам 51 год...»

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

До 19 января у вас есть шанс забрать любой курс Proglib Academy по старым ценам:

— Разработка ИИ-агентов
— Математика для разработки AI-моделей
— ML для старта в Data Science
— Математика для Data Science
— Специалист по ИИ
— Алгоритмы и структуры данных
— Программирование на Python
— Основы IT для непрограммистов
— Архитектуры и шаблоны проектирования

Успеть до повышения цен

⚠️ Дедлайн — понедельник, 19 января
👨‍💻 Compose Hot Reload стал стабильным

Compose Hot Reload только что получил статус стабильной версии — 1.0.0. Разработчики усердно работали над созданием технологии, которая проста в использовании и хорошо интегрирована в существующие инструменты, а также не требует от пользователей никакой настройки. Инструмент входит в состав Compose Multiplatform, начиная с версии 1.10.

Compose Multiplatform — это декларативный фреймворк для совместного использования пользовательских интерфейсов на разных платформах. Как правило, для запуска приложения Compose во время разработки необходимо вызвать соответствующие задачи сборки Gradle или запустить его непосредственно из IDE. То же самое относится и к Compose Hot Reload. Запуск приложения можно осуществить, вызвав задачу ./gradlew :myApp:hotRunJvm или нажав кнопку «Запустить с Compose Hot Reload» в IntelliJ IDEA (при условии, что плагин Kotlin Multiplatform уже установлен).

После запуска приложения в режиме горячей перезагрузки рядом с окном приложения появится плавающая панель инструментов. Изменение кода в IntelliJ IDEA и нажатие кнопки «Сохранить» (Cmd+S/Ctrl+S) перекомпилирует соответствующий код, выполнит горячую перезагрузку и обновит пользовательский интерфейс, сохранив при этом все части состояния, которые считаются действительными.

Помимо простого изменения графических ресурсов, Compose Hot Reload позволяет вносить практически произвольные изменения в код, включая, помимо прочего, добавление и удаление функций, классов и параметров — короче говоря, все те изменения, которые вы обычно вносите в процессе обычной разработки.

Плавающая панель инструментов рядом с вашим приложением предлагает дополнительные функции, такие как просмотр логов, ручной запуск перезагрузки и сброс состояния пользовательского интерфейса, а также индикацию статуса и многое другое. Однако одним из наиболее важных аспектов любой функции горячей перезагрузки является информирование о возникновении ошибки. Как разработчик, вы всегда должны быть в курсе, когда перезагрузка не удалась, из-за чего ваши текущие изменения кода не отразились в приложении. Это может произойти, например, если вы попытаетесь перезагрузить, но код не скомпилируется и потребует вашего внимания. В таких случаях Compose Hot Reload отобразит ошибку прямо в окне целевого приложения.

Compose Hot Reload — это очень сложный технический проект. В этой статье его авторы постарались выделить наиболее интересные аспекты Compose Hot Reload. Но если вы хотите узнать больше о проекте, посетите репозиторий на GitHub.

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🌚2
🗓 Новости недели

Приготовили для вас дайджест по актуальному из мира iOS, Android.

🔵 Как укротить SwiftLint в масштабах компании

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

🔵 Как подружить Android и ICMP: заметки разработчика

В статье автор поговорит о поддержке протокола ICMP в контексте разработки приложений под Android.

🔵 Navigation3 + Koin в Compose Multiplatform

Автор поделиться своими наработками по тому, как можно удобно совмещать библиотеку Navigation3 и Koin в Compose Multiplatform проекте и какие подводные камни есть на текущий момент.

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Объект-выражение (анонимный объект/object expression)

Объект-выражение — это выражение, которое "на ходу" создает анонимный объект.

Для объекта-выражения не указывается имя!
Если же объекту всё-таки требуется имя, то его можно сохранить в переменной:

val tom = object {
val name = "Tom"
var age = 37
fun sayHello() {
println("Hi, my name is $name")
}
}
println("Name: ${tom.name} Age: ${tom.age}")
tom.sayHello()


Анонимные объекты не являются синглтонами!
Каждый раз при выполнении объекта-выражения создаётся новый объект.

Анонимный объект является заменой анонимным внутренним классам в Java.

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Build failed: price_increment

Чтобы не переплачивать завтра, оформите подписку на профессиональный рост сегодня. После 20 января стоимость всех программ в Proglib.academy пойдёт вверх.

Собрать свой идеальный грейд
Отображаем Markdown в SwiftUI

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

В статье рассматривается использование класса NSAttributedString из UIKit для преобразования Markdown в отформатированный текст и его отображения в SwiftUI через UIViewRepresentable.

🔹 Как это работает: ключевые компоненты

1. Преобразование Markdown в NSAttributedString

Основная "магия" происходит с помощью класса NSAttributedString. Для обработки Markdown можно использовать встроенный парсер iOS (начиная с iOS 15) или сторонние библиотеки, такие как Down или SwiftyMarkdown. Пример с NSAttributedString:

import UIKit
let markdownString = "**Hello**, *SwiftUI*!"
let options: [NSAttributedString.DocumentReadingOptionKey: Any] = [
.documentType: NSAttributedString.DocumentType.html
]
// Преобразуем Markdown через HTML (один из подходов)
if let data = markdownString.data(using: .utf8),
let attributedString = try? NSAttributedString(data: data,
options: options,
documentAttributes: nil) {
// Используем полученный attributedString
}


2. Отображение в SwiftUI через UIViewRepresentable

Чтобы показать NSAttributedString в SwiftUI, создаём обёртку UIViewRepresentable для UITextView или UILabel:

import SwiftUI
struct MarkdownView: UIViewRepresentable {
let attributedString: NSAttributedString

func makeUIView(context: Context) -> UITextView {
let textView = UITextView()
textView.isEditable = false
textView.attributedText = attributedString
textView.backgroundColor = .clear
return textView
}

func updateUIView(_ uiView: UITextView, context: Context) {
uiView.attributedText = attributedString
}
}


3. Использование в SwiftUI-интерфейсе

Теперь можно использовать MarkdownView как обычный SwiftUI элемент:

struct ContentView: View {
let markdownText = "## Заголовок\nЭто **жирный** текст."
var body: some View {
MarkdownView(attributedString: parseMarkdown(markdownText))
.padding()
}
}


🔹 Альтернативные подходы

🔘 SwiftUI Text с ограниченной поддержкой Markdown (iOS 15+): В SwiftUI 3 появилась базовая поддержка Markdown внутри Text. Работает для простых случаев:

Text("**Жирный** и *курсив*")


🔘 Сторонние библиотеки: Down, SwiftyMarkdown или MarkdownUI предоставляют более полную и гибкую поддержку Markdown, часто с более простым API.

🔹 Важные нюансы

🔘 Производительность: Для очень больших Markdown-документов преобразование в NSAttributedString может потребовать оптимизации.

🔘 Кастомизация: Если нужен нестандартный вид Markdown (например, синтаксис из другой системы), потребуется дополнительная обработка.

🔘 Версия iOS: Некоторые методы (как встроенный парсер) требуют iOS 15+.

🔹 Итог

Отображение Markdown в SwiftUI — задача, которая решается с помощью связки NSAttributedString и UIViewRepresentable. Для более простых случаев можно использовать встроенную в SwiftUI 3 поддержку Markdown, а для максимальной гибкости и функциональности — сторонние библиотеки. Это открывает двери для создания приложений с богатым текстовым контентом прямо внутри ваших SwiftUI-интерфейсов.

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📱 Топ вакансий для мобильных разработчиков за неделю

KMP Developer — от 185 000 до 310 000 ₽, удалёнка

Middle+ / Senior iOS Developer — удалёнка

KMP - Kotlin Multiplatform (Android / iOS) разработчик — от 2 000 $, удалёнка

Flutter-разработчик — удалёнка

iOS разработчик — офис (Москва)

➡️ Еще больше топовых вакансий —‍ в нашем канале Mobile jobs

🐸 Библиотека мобильного разработчика

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🎮 Модульность в iOS

С ростом кодовой базы iOS-приложения перед командой встаёт ключевой вопрос: внедрять ли модульную архитектуру? Это мощный инструмент для управления сложностью, но не серебряная пуля для всех проектов.

🔹 Что такое модульность?

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

🔹 Когда она оправдана, а когда — нет?

🔘 Не нужно: для небольших проектов, прототипов или приложений с неясным будущим. На этом этапе модульность создаст лишние накладные расходы.

🔘 Нужно: когда бизнес-направление определено и проект обречён на рост. Модульность помогает установить границы ответственности и предотвратить превращение системы в монолит.

🔹 Три столпа модульной кодовой базы

1. Базовый слой (Foundation): фундамент приложения. Содержит общие модели данных, сетевой стек и техническую инфраструктуру. Должен быть максимально универсальным и не зависеть от модулей выше.

2. Сервисные модули (Services): общие возможности, используемые несколькими фичами (например, кэширование, аналитика). Они зависят только от Foundation.

3. Функциональные модули (Features): пользовательские сценарии с началом и концом (например, "оформление заказа", "лента новостей"). Они зависят от Foundation и Services, но не должны зависеть друг от друга.

🔹 Типичные ошибки

Многие команды внедряют модульность, следуя тренду, но не проектируют связи. Результат:

🔘 Паутина взаимозависимых модулей

🔘 "Божественные" сервисы, которые знают обо всём

🔘 Скрытые циклические зависимости

🔘 Иллюзия разделения через мосты на протоколах, которые только усложняют отладку

🔹 Ключевые принципы успеха

🔘 Чёткие контракты: Думайте о публичном API модуля, как будто вы публикуете библиотеку на GitHub.

🔘 Контроль навигации: Переходы между фичами должны управляться внешним координатором (например, координатором приложения), а не происходить напрямую.

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

🔘 Протоколы с умом: Используйте протоколы для конкретных целей (изоляция зависимостей, тестирование), а не ради "гибкости".

🔹 Итог

Модульность — это осознанная практика, а не механический рефакторинг. Её успех зависит не столько от инструментов (Tuist, Swift Package Manager), сколько от архитектурного мышления и командной дисциплины. Правильно реализованная, она превращает код в долгосрочный актив, а не в обузу.

Согласны, что проектировать связи важнее, чем просто резать код на модули? Делитесь опытом в комментариях 💬

📌 Лучшие вакансии для мобильных разработчиков

🐸 Библиотека мобильного разработчика

#АрхитектурныйКод #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ SwiftDataTables — показ таблиц в iOS

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

Основные возможности включают:

🔘 Сортировка — Нажмите на заголовки столбцов для сортировки по любому столбцу
🔘 Поиск — Встроенная строка поиска фильтрует по всем полям
🔘 Фиксированные столбцы — Заморозьте столбцы с левой или правой сторон
🔘 Гибкий размер — Автоматически рассчитываемая или пользовательская ширина столбцов и высота строк
🔘 Настраиваемый — Настройте заголовки, нижние колонтитулы, цвета и многое другое через делегат или объект конфигурации
🔘 Шаблон источника данных — Статические данные или динамический контент по протоколу

💻 SwiftDataTables на GitHub

🐸 Библиотека мобильного разработчика

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
ИИ в кармане: работа с контекстом через RAG

23 января в 19:00 обсудим архитектуры работы LLM с локальными данными на открытом уроке к курсу «Разработка ИИ агентов». Узнаем, как научить ассистента отвечать по документам пользователя без лишних затрат ресурсов.

Занятие ведёт Игорь Стурейко, тимлид в «Газпроме» и AI-архитектор на Kubernetes. В своём видеосообщении Игорь рассказывает о проектировании автономных агентов и практическом опыте в ML, накопленном за 20 лет.

На вебинаре разберём:

— использование RAG для контекстного поиска в приложениях;
— интеграцию векторных баз данных (FAISS, Chroma);
— фреймворки для связи интерфейса с логикой ИИ-агентов.

📅 Когда: 23.01 в 19:00 МСК

Узнать подробности