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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
📎 Внедрение локализации и мультиязычной поддержки

Хотите выйти на международный рынок? Этот промпт поможет правильно реализовать локализацию и поддержку нескольких языков.

📝 Промпт:

Implement comprehensive localization system for a mobile app that includes:

— Set up string resource files for different languages
— Implement RTL (Right-to-Left) layout support
— Handle dynamic language switching without app restart
— Format dates, numbers, and currencies according to locale
— Manage pluralization and gender-specific translations
— Support regional variants (en-US vs en-UK)
— Add accessibility for translated content


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

— Добавьте Implement in-context translation preview для удобства тестирования
— Добавьте Add fallback strategies for missing translations чтобы избежать пустых экранов
— Добавьте Support dynamic content from CMS для переводимого контента с бэкенда

🤌 Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👨‍💻 Исследуем информационную экосистему

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

Напишите в комментариях:

➡️ Какие каналы, блоги или сайты по мобильной разработке вы читаете постоянно и считаете действительно полезными?

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Хочешь строить свои AI-модели, а не просто запускать чужие?

Proglib.academy открывает курс «Математика для разработки AI-моделей» — программу, которая превращает понимание ML из «черного ящика» в осознанную инженерную работу.

📌 Почему без математики в AI никуда:

→ Чтобы пройти собеседование. Это первый фильтр: линал, матстат, оптимизация — спрашивают везде.
→ Чтобы понимать процесс изнутри. Инженер AI должен понимать, почему и как работает модель, а не просто жать fit().

🎓 Что будет на курсе:

→ 3 практических задания на Python + финальный проект с разбором от специалистов;
→ программа обновлена в ноябре 2025;
→ за 2 месяца пройдёшь весь фундамент, нужный для работы с моделями;
→ преподаватели — гуру математики, методисты и исследователи из ВШЭ и индустрии.

🎁 Бонусы ноября:

— 40% скидка;
— получаешь курс «Школьная математика» в подарок;
— короткий тест и узнать свой уровень.

🔗 Подробнее о курсе
🤝 Как самому выходить на фаундеров и получать офферы

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

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

👍 Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

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

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
1
🗓 Новости недели

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

🔵 Proxyman + HAR = mock-данные для iOS-тестов

В этой статье автор расскажет, как использует связку Proxyman + HAR, чтобы готовить mock‑данные сетевых запросов для интеграционных UI‑тестов одного из iOS‑приложений. Такой подход выручает, когда для тестов нет возможности поднять сервер с нужным наполнением или сервер не предоставляет дополнительных методов API для имитации определенного сценария — например, переписка в чате с собеседником, обновление статуса заказа.

🔵 Почему ваш кастомный emoji будет ломать TextField (и как это починить)

Разрабатывая приложение под Android — команда встроила в продукт свой мессенджер и решила, что стандартные андроидные смайлики — это преступление против дизайна. Telegram и другие популярные мессенджеры давно показали, как должны выглядеть эмоции в чате, а Google всё ещё живёт в 2015-м с Noto Color Emoji.

🔵 Работа с RTSP-плеером во Flutter: выбор библиотеки и снижение задержки

В данной статье автор рассмотрит основные библиотеки для работы с RTSP во Flutter — flutter_vlc_player, fijkplayer и media_kit, сравним их особенности, достоинства и влияние на задержку воспроизведения. Отдельное внимание уделит настройкам, которые позволяют минимизировать latency, прежде всего в решениях на базе FFmpeg. Также разберёт доступные параметры оптимизации в flutter_vlc_player.

👍 Бонусы для подписчиков:
Скидка 40% на все курсы Академии
Розыгрыш Apple MacBook
Бесплатный тест на знание математики

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Перегрузка функций в Swift

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

func sum(_ x: Int, _ y : Int){
print(x+y)
}
func sum(_ x: Double, _ y: Double){
print(x+y)
}

func sum(_ x: Int, _ y: Int, _ z: Int ){
print(x + y + z)
}

sum(1, 2) // 3
sum(1.2, 2.3) // 3.5
sum(2, 3, 4) // 9


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

Также перегруженные версии одной функции могут отличаться по типу возвращаемого значения:

func sum(_ x: Int, _ y : Int) -> Int{
return x + y
}
func sum(_ x: Int, _ y : Int) -> Double{
return 2 * Double(x + y) // преобразует результат в Double
}

let a : Int = sum(1, 2) // 3
let b : Double = sum(1, 2) // 6.0

print(a) // 3
print(b) // 6.0


В данном случае определены две версии функции sum, которые совпадают по типу и количеству параметров, но различаются по типу возвращаемого значения.

Константа a представляет тип Int, поэтому в выражении let a : Int = sum(1, 2) компилятор увидит, что необходима версия, которая возвращает значение Int, и будет использовать эту версию. Аналогично в выражении let b : Double = sum(1, 2) константа b представляет тип Double, поэтому здесь будет применяться версия функции sum, которая возвращает значение Double. То есть в данном случае у нас ошибок не возникнет.

Однако теперь рассмотрим другую ситуацию:

func sum(_ x: Int, _ y : Int) -> Int{
return x + y
}
func sum(_ x: Int, _ y : Int) -> Double{
return 2 * Double(x + y) // преобразует результат в Double
}

let a = sum(1, 2) // Ошибка
let b = sum(1, 2) // Ошибка


Здесь явным образом не указано, какой тип представляют константы a и b, поэтому их тип будет выводиться изрезультата вызова sum(1, 2). Но теперь компилятор не знает, какую именно версию функции sum использовать, так как тип констант неизвестен. В итоге в данном случае мы столкнемся с ошибкой.

🔹 Курс «Основы IT для непрограммистов»
🔹 Получить консультацию менеджера
🔹 Сайт Академии 🔹 Сайт Proglib

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

#буст #JuniorKit #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
📘 4 декабря стартует набор на курс «Математика для разработки AI-моделей»

Если вы работаете с моделями или хотите перейти в DS/ML, декабрь — идеальный момент закрыть фундаментальные пробелы.

На курсе вы разберёте ключевые разделы, которые лежат в основе современных AI-моделей: линейная алгебра, анализ, оптимизация, математический анализ, вероятности, статистика. Всё через практику в Python.

В программе живые занятия с экспертами AI-индустрии (SberAI, ВШЭ, WB&Russ), разбор реальных задач, квизы и финальный проект.

🌐 Формат: онлайн + доступ к записям

🎁 Бонусы: курс «Школьная математика» в подарок, бесплатный тест по математике

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

👉 Записаться на курс
🎮 Локализация пакетов Swift в приложении для iOS

Современные архитектуры iOS часто основаны на модульности, а Swift Package Manager стал предпочтительным способом структурирования повторно используемых компонентов. Каждый модуль может содержать собственные ресурсы, в том числе локализованные строки, изображения и другие материалы. На бумаге это позволяет разрабатывать и выпускать каждую функцию независимо от других. Однако на практике локализация в Swift Packages не всегда работает так, как ожидают разработчики, после интеграции этих модулей в приложение.

Часто возникает одна и та же проблема: локализованные строки в пакете Swift работают во время разработки, но как только пакет используется в реальном приложении, все строки возвращаются к английскому варианту. Даже если пакет настроен правильно, локализованные .lproj папки игнорируются во время выполнения. Такое поведение может сбивать с толку, если вы ожидаете, что локализация будет работать автоматически во всех пакетах.

🔹 Почему игнорируются локализации в пакетах Swift

Пакеты Swift создаются в виде собственных наборов ресурсов, отдельных от основного набора ресурсов приложения. Несмотря на то, что .strings файлы хранятся в этих наборах и доступ к ним осуществляется через Bundle.module, система по-прежнему полагается на то, что хост-приложение объявляет, какие локализации оно поддерживает.

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

Это ожидаемое поведение системы локализации Apple, а не ошибка. Только основной пакет определяет языковые возможности приложения.

🔹 Необходимое исправление: объявление локализаций в основном приложении

Чтобы локализация Swift Package работала стабильно, в основном приложении необходимо объявить все поддерживаемые языки в Info.plist под ключом CFBundleLocalizations. После добавления этого списка система будет корректно обрабатывать локализованные строки из всех пакетов ресурсов, в том числе созданных с помощью Swift Package.

Минимальная конфигурация может выглядеть следующим образом:

<key>CFBundleLocalizations</key>
<array>
<string>en</string>
<string>fr</string>
</array>


После добавления этой записи ранее игнорируемые .lproj папки внутри пакетов Swift Package начинают работать сразу.

🔹 Заключение

Локализация пакетов Swift Package не представляет сложности, если вы понимаете, как система определяет языки в пакетах. Даже если модули содержат собственные .lproj папки, основное приложение должно явно указывать все поддерживаемые локализации. Добавление CFBundleLocalizations в Info.plist решает проблему возврата к английскому языку и обеспечивает правильное поведение локализованных ресурсов из пакетов Swift Package.

🔸 Курс «Архитектуры и шаблоны проектирования»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

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

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

Android Developer (Middle+ / Senior) — от 250 000 до 350 000 ₽, удалёнка

Программист (разработчик) flutter — от 100 000 до 220 000 ₽, удалёнка

Мобильный разработчик (React Native) — от 180 000 до 250 000 ₽, удалёнка

Android-разработчик Middle+ — до 250 000 ₽, удалёнка

IOS-разработчик (middle) — от 180 000 до 250 000 ₽, гибрид (Москва)

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

🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Добавление цветов в иерархию представлений SwiftUI

В SwiftUI одним из наиболее элегантных способов настройки визуальных элементов является внедрение стилей. Вместо того чтобы вручную передавать явные цвета или параметры стиля по дереву представлений, SwiftUI позволяет внедрять информацию о стиле на более высоком уровне с помощью таких модификаторов, как .foregroundStyle(), .backgroundStyle(), и .tint(). Эти внедренные стили могут использоваться любым дочерним представлением, которое ссылается на соответствующие динамические значения.

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

Внедрение стилей в подпредставления

Вот простой пример, демонстрирующий, как стили могут неявно передаваться по иерархии представлений:

struct DemoView: View {
var body: some View {
DetailView()
.foregroundStyle(.blue)
.backgroundStyle(.pink)
.tint(.yellow)
}
}


В этом примере DemoView применяет три модификатора стиля:

🔘 .foregroundStyle(.blue) определяет стиль переднего плана, который будет наследоваться дочерними элементами, ссылающимися на .foreground.
🔘 .backgroundStyle(.pink) добавляет стиль фона.
🔘 .tint(.yellow) устанавливает глобальный оттенок, который влияет на элементы, использующие .tint.

Ни один из этих модификаторов не ссылается явно на внутреннюю реализацию DetailView, что делает код модульным и слабосвязанным.

Использование внедренных стилей

Теперь давайте посмотрим, как DetailView использует эти стили:

struct DetailView: View {
var body: some View {
Text("Primary text")
.foregroundStyle(.background)
.background(.foreground)

Text("Secondary text")
.foregroundStyle(.tint)
}
}


Здесь:

🔘 .foregroundStyle(.background) указывает тексту использовать заданный стиль фона (в данном случае .pink).
🔘 .background(.foreground) устанавливает для фона текста стиль переднего плана (в данном случае .blue).
🔘 Во второй текстовой метке используется .foregroundStyle(.tint), которое соответствует .yellow в родительском представлении.

Такой подход позволяет создавать многократно используемые представления с учётом темы. Представлениям не нужно знать, какие конкретные цвета они будут отображать — им нужно лишь обращаться к динамическим стилям, определяемым средой, таким как .foreground, .background, или .tint.

Заключительные мысли

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

🔸 Курс «Основы IT для непрограммистов»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

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

#PixelPerfect #MiddlePath #Swift
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Validator — элегантная и типобезопасная валидация входных данных

Validator — это современный лёгкий фреймворк Swift, обеспечивающий элегантную и типобезопасную валидацию входных данных. Созданный на основе мощной системы типов Swift, он легко интегрируется с UIKit и SwiftUI, что упрощает валидацию форм на всех платформах Apple.

Возможности:

🔘 Типобезопасная валидация — использует систему типов Swift для обеспечения безопасности во время компиляции
🔘 Богатый набор правил — встроенные валидаторы для распространённых случаев использования
🔘 Расширяемость — простота создания собственных правил валидации
🔘 Интеграция с UIKit — первоклассная поддержка UITextField и других компонентов UIKit
🔘 SwiftUI Native — обёртки свойств и модификаторы представлений для декларативной валидации
🔘 Управление формами — валидация нескольких полей с централизованным управлением состоянием
🔘 Легковесность — минимальный размер и отсутствие зависимостей
🔘 Протестировано — полное покрытие тестами

💻 Validator на GitHub

🔸 Курс «Специалист по ИИ»
🔸 Получить консультацию менеджера
🔸 Сайт Академии 🔸 Сайт Proglib

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

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM