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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
🔴 Как распознать нажатие на произвольную фигуру в Jetpack Compose

В Android-разработке определение нажатия на сложную нестандартную фигуру — нетривиальная задача. Класс Path не предоставляет готового API, а распространённые решения с проверкой пересечения маленького прямоугольника и фигуры — медленные и не всегда точные.

В Jetpack Compose есть простое и эффективное решение: PathHitTester.

🔹 Как это работает

1. Создайте хит-тестер, передав ему ваш Path:

val hitTester = PathHitTester(imagePath)


2. Проверяйте координаты нажатия с помощью метода contains(). Важно привести координаты касания к той же системе координат, что и путь:

val tap = down.position - imagePosition // Применяем обратное преобразование
val isTapped = tap in hitTester // Вызывает hitTester.contains(tap)


🔹 Ключевые особенности и преимущества

🔘 Точность: Определяет нажатие с точностью до пикселя.

🔘 Производительность: Использует специальную структуру данных для быстрой проверки, что позволяет использовать PathHitTester даже для обработки событий перетаскивания (drag) с высокой частотой.

🔘 Переиспользование: Чтобы обновить тестируемый путь, используйте метод update(newPath) вместо создания нового объекта.

🔹 Получение пути из изображения

В демонстрационном видео используется библиотека pathway. Её основная функция — генерация Path из Bitmap:

val contour = bitmap.toPath().asComposePath()


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

🔹 Итог

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

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

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

#PixelPerfect #MiddlePath #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Snowdrop — простая работа с сетью

Snowdrop — типобезопасный, простой в использовании фреймворк на основе Swift Macros, созданный для того, чтобы вы могли с легкостью создавать и поддерживать сложные сетевые запросы.

Функции:

🔘 Создание типобезопасных сервисов с помощью макроса @Service
🔘 Поддержка различных типов методов запроса (например, @GET, @POST, @PUT, @DELETE, @PATCH, @CONNECT, @HEAD, @OPTIONS и т.п.)
🔘 Пиннинг SSL/сертификатов
🔘 Перехватчики
🔘 Возможность создания мок-объектов

💻 Snowdrop на GitHub

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

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

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
🎮 Как избежать циклов сохранения при работе с задачами в Swift

Всякий раз, когда мы создаем задачу, например с помощью Task {}, Swift фиксирует все значения, на которые мы ссылаемся в теле задачи. По умолчанию эти фиксации являются сильными.

Это означает:

• Задача сохраняет захваченные значения до завершения задачи.
• Если мы захватываем self сильным захватом, а self также содержит ссылку на задачу, мы создаём цикл сохранения.
• Но важно отметить, что этот цикл длится только в течение времени существования задачи.

Давайте рассмотрим конкретный пример:

класс ImageLoader {
приватное поле task: Задача<Пустота, Никогда>?

func load() {
задача = Задача {
ожидание загрузка изображения()
}
}

func loadImage() async {
// ...
}
}


То, что здесь происходит, это:

• экземпляр ImageLoader строго удерживает задачу (поскольку задача является сохранённым свойством)
• задача строго удерживает своё замыкание
• замыкание строго удерживает self (поскольку мы вызываем downloadImages())

Таким образом, пока задача выполняется, у нас есть цикл сохранения:

ImageLoaderTaskImageLoader

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

Это означает:

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

Если мы хотим избежать даже этого временного цикла, мы можем использовать слабую ссылку на self с помощью [weak self], но для краткосрочных задач это обычно необязательно.

🔹 Там, где циклы сохранения приводят к утечкам памяти

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

1. Мы сохраняем задачу (как свойство).
2. Замыкание задачи сильно привязывает себя к ней.
3. Задача никогда не завершается или завершается намного позже, чем мы ожидаем.

Это может происходить в длительных циклах или при потоковой обработке:

класс MessageListener {
приватное поле task: Задача<Пустота, Никогда>?

func start() {
задача = Задача { [слабый я] в
for await сообщение in await сообщения .stream() {
guard let self else { return }
self.handle(message)
}
}
}

функция обработчик(_ сообщение: Сообщение) { }
}


В этом примере цикл может выполняться бесконечно. Без [weak self] задача сохраняет self в живых, а self сохраняет задачу в живых, образуя классический цикл сохранения.

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

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

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

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

Middle iOS Developer — от 2 400 до 3 500 $, удалёнка

Android Developer — от $2 000 - $3 500, удалёнка

Senior iOS Developer — от 450 000 ₽, удалёнка

Kotlin Multiplatform/ Android разработчик — от 200 000 до 450 000 ₽, удалёнка/гибрид (Москва)

Senior iOS Developer — от 160 000 до 320 000₽, удалёнка

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
1
👨‍💻 Снепшот-тестирование SwiftUI View в legacy-проекте

Снепшот-тестирование — один из немногих надёжных способов контролировать визуальную целостность SwiftUI-компонентов. Но что делать, если ваш проект ограничен Xcode 13.3 и Swift 5.6, а большинство компонентов дизайн-системы обёрнуты в UIViewRepresentable?

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

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

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

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

#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
🎅 Секретный Санта для айтишников от Proglib.academy

Весь этот год команда Академии запускала курсы для айтишников. А под Новый год мы запускаем новый курс по ИИ-агентам и ставим под ёлку самый свежий стек 2025 года и обучение проектированию автономных нейросетевых экосистем — от LLM и ReAct-циклов до мультиагентных систем, LangGraph, AutoGen и продакшн-практик.

🎁 Хотим дарить подарки и приглашаем вас поучаствовать в конкурсе:

1️⃣ Упомяните курс Академии у себя в блоге.
2️⃣ Пришлите скрин сюда.
3️⃣ Получите секретный промокод на 10 000 ₽ при оплате любого курса.

Подходит всё — соцсети, блоги, Telegram-каналы от 300 подписчиков и более.

🎄 Акция действует до Нового года.

Win-win, всё как мы любим!
1
📱 Работа с камерой и медиа в мобильном приложении

Хотите добавить съёмку фото и видео в своё приложение? Этот промпт поможет реализовать работу с камерой и медиафайлами правильно и эффективно.

📝 Промпт:

Implement camera and media handling for a mobile app that includes:

— Set up camera permissions and runtime requests
— Implement photo and video capture with device camera
— Add image/video picker from gallery
— Implement image cropping and basic editing
— Handle file compression and format conversion
— Manage storage permissions and file system access
— Add preview and playback functionality


💡 Расширения:

— Добавьте Implement custom camera UI with filters and effects для улучшенного UX
— Добавьте Add batch media upload with progress trackin для множественных файлов
— Добавьте Support advanced editing (rotate, adjust, watermark) для профессиональной обработки

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

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

#буст #MiddlePath
Please open Telegram to view this post
VIEW IN TELEGRAM
WANTED: MOBILE MASTERMIND

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

Приметы:

— уверенно пишет под iOS/Android и понимает взаимодействие с backend на Java или Go;
— прошёл через десятки релизов и тысячи баг-репортов;
— способен внятно объяснить принципы мобильной архитектуры;
— нацелен на развитие своего бренда в большой IT-среде.

Суть предложения:

— участие в создании курсов и контента;
— медийный вес и признание коллег;
— вознаграждение за переданный опыт.

Явка с повинной

P.S. Знаешь мобайл-гения? Пришли ему эту ориентировку.
🤖 Топ профессий в IT, которые появились благодаря ИИ

В карточках рассмотрели, какие «экзотические» профессии уже входят в IT, благодаря искусственному интеллекту.

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

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

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Вопрос с собеседования по Kotlin

Назовите подтип всех типов в Kotlin

👇 Правильный ответ:

Nothing в Kotlin — это т.н. bottom type, то есть он является подтипом любого другого типа. Наличие Nothing в системе типов позволяет типизировано выражать то, что без него принципиально невозможно.

Bottom type — это тип, который не имеет значений и предназначен для обозначения невыполнимых ситуаций в программе.


➡️ Щелкаешь такие задачи как орешки? Найди проект с достойной зарплатой тут

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM