Библиотека мобильного разработчика | Android, iOS, Swift, Retrofit, Moshi, Chuck
9.83K subscribers
1.46K photos
70 videos
52 files
4.22K links
Все самое полезное для мобильного разработчика в одном канале.

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
ФП vs ООП

Достоинства функционального программирования (ФП) и объектно-ориентированного программирования (ООП) — предмет нескончаемых дебатов на любом техническом онлайн форуме.

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

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

Что предпочитаете вы? Голосуйте и пишите своё мнение в комментариях 💬

❤️ 
— ФП
👍 
ООП
🤝
ФП + ООП

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝26👍43
🤫 Как продвинуть резюме на hh

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

➡️ Подробнее в статье

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2🔥1
🔥 Вы ещё можете застать старый добрый Proglib — с вечным доступом к курсам.

С 1 августа всё меняется: навсегда — останутся только те, кто успел купить сейчас.

-40% на все курсы. Включая обновлённый Python (кроме курса по AI-агентам)

Это не просто распродажа. Это — последняя точка входа в Proglib Academy по старым правилам.

📚 Выбрать и забрать свой курс навсегда → https://clc.to/TBtqYA
🖥 Топ вакансий для мобильных разработчиков за неделю

Senior Java/Kotlin Developer — от 4 000 до 5 000 $, удалёнка

Flutter Developer — от 100 000 до 300 000₽, удалёнка

Разработчик программного обеспечения (iOS) — гибрид (Москва)

iOS Developer — от 4 000 до‍ 5 500 $, гибрид (Москва)

Junior iOS Developer — удалёнка

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
1
Torrent Search — поиск торрентов в Material 3

Torrent Search — современное приложение для Android с дизайном Material 3 для поиска и загрузки торрентов с нескольких трекеров.

Фичи: дизайн Material 3, разные категории поиска, управление скачиванием (самого торрент-клиента нет, направляет к другим приложениям),  включение или выключение NSFW контента.

💻 Torrent Search на GitHub

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2
👾 Переходишь на Compose? Не спеши!

Вас влечет мир Jetpack Compose или вы уже на пороге перехода с View на этот фреймворк? Может, вы уже в процессе миграции или просто исследуете новые горизонты Android? Если да, то доклад Максима о переходе проекта с View на Compose сможет вас заинтересовать.

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

• Работа с вложенными скроллами и свайпами.

• Использование Compose в RecyclerView.

• И наиболее значимая задача — решение проблемы медленного первого запуска, вызванной особенностью Compose как unbundled library.

👀 Смотреть доклад

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
4
📎 Мастер Dependency Injection в мобильной разработке

Запутались в подходах внедрения зависимостей? Этот промпт поможет разобраться с DI раз и навсегда.

Промпт:

Сравни подходы Dependency Injection (Dagger/Hilt, Koin, Swinject) для мобильной разработки:
1. Плюсы и минусы каждого решения
2. Кривая обучения для новичков
3. Производительность в runtime
4. Поддержка мультимодульности
5. Интеграция с ViewModel и Compose/SwiftUI
Приведи примеры настройки для типового приложения на Kotlin/Swift


📌 Варианты уточнений:

Как мигрировать с ручного DI на Hilt/Koin?
Лучшие практики тестирования с DI
DI для кроссплатформенной разработки (KMM)
Оптимизация времени сборки с DI

💡 Лайфхак: Добавьте Show common mistakes and how to avoid them для разбора типовых ошибок

Пример запроса:

// Нужно:
// - Простое приложение с 2 экранами
// - Сетевой слой и локальная БД
// - Легкая замена зависимостей в тестах
// - Поддержка мультимодульности


Какой DI-фреймворк вы предпочитаете и почему? 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
3
👀 Мотив (или мотивированный трафик) — сложная для рынка тема. Среди нескольких основных факторов для выведения приложения на $10k MRR посмотрим на два:

1. Приживаемость мотива

Если следили, то знаете, что 3 этих месяца рынку ASO было несладко. В среднем сервисе мотивированного трафика процент засчитываемого коннектом трафика не превышал 50%. Те, кто работает с китайцами, считал нормой для этих времен — 30%. Но есть и рекордсмены, кому удавалось удержать высокие планки в 80—90%, тот же @Fourasobot

2. Стоимость трафика

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

Математика примерно такая:
➡️ Приложение в районе $3—10k суммарно
➡️ Затраты на мотивированный трафик (зависит от стратегии залива, может быть абсолютно разной).
➡️ После создания приложения и пролива трафика командам удается собрать MRR $1—10k в зависимости от скилла (средние результаты по рынку, бывают больше и меньше, но медиана такая).

Краеугольным камнем является цена мотивированного трафика. По 20 центов 100k установок обойдутся в $20k, по 10 центов — $10k, а по 5 центов - $5k.

В результате, если вы сделали приложение за $5k и потратили на трафик $20k, собрав MRR в $2k — выглядит так себе. Если же общий кост — $10k , а MRR $2k, то уже лучше.

Что интересно, у того же @Fourasobot, как у поставщика мотивированного трафика, себестоимость производства зависит от объема, именно потому делают сетку. В этой сетке большие команды имеют хорошие цены, а мелкие — не очень. Ребята, которые забирают миллионы установок могут окупаться до полугода, а те, которые берут точечно — годами. К сожалению, или к счастью — так работает рынок.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔗 Реализуем deep links в мобильных приложениях

Пользователи ожидают:

• Плавных переходов из писем/сообщений в приложение
• Сохранения контекста при открытии ссылок
• Рабочих ссылок даже когда приложение не установлено

Базовые концепции:

Deep Links - открывают конкретный экран в приложении
Deferred Deep Links - работают даже без установленного приложения
App Links (Android) / Universal Links (iOS) - веб-ссылки, открывающие приложение

Реализация на Android

1. Добавьте intent-filter в манифест:

<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW"/>
<category android:name="android.intent.category.DEFAULT"/>
<category android:name="android.intent.category.BROWSABLE"/>
<data android:scheme="https" android:host="yourdomain.com"/>
</intent-filter>


2. Обработка ссылки в Activity:

override fun onCreate(savedInstanceState: Bundle?) {
if (intent?.action == Intent.ACTION_VIEW) {
val data = intent.data
// Анализ URL и навигация
}
}


Реализация на iOS

1. Настройка Associated Domains:

<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:yourdomain.com</string>
</array>


2. Обработка в AppDelegate:

func application(_ application: UIApplication, 
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let url = userActivity.webpageURL else {
return false
}
// Обработка URL
return true
}


Продвинутые сценарии

1. Аналитика переходов:

• Добавьте UTM-метки к ссылкам
• Отслеживайте источник установки

2. Совместная работа с бэкендом:

{
"url": "https://app.com/product/123",
"ios_store_id": "123456789",
"android_package": "com.yourapp"
}


3. Тестирование:

# Android
adb shell am start -W -a android.intent.action.VIEW -d "https://yourdomain.com/product/123"

# iOS
xcrun simctl openurl booted "https://yourdomain.com/product/123"



Лучшие практики:

• Используйте Firebase Dynamic Links для кроссплатформенного решения
• Поддерживайте веб-версии всех deep link-страниц
• Документируйте все схемы URL для команды

Какие библиотеки для deep links вы используете? Делитесь опытом в комментариях 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
3
⚠️ 5 ловушек Swift, которые вы не заметите, пока не станет слишком поздно

1️⃣ Сильные циклы ссылок в замыканиях

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

class ProfileViewModel {
var onUpdate: (() -> Void)?

func setup() {
onUpdate = {
self.doSomething() // ⚠️ This captures self strongly
}
}
}


Исправление:

onUpdate = { [weak self] in
self?.doSomething()
}


2️⃣ Принудительное развертывание Optional

Это очевидно, но все еще часто встречается это в коде:

let name: String? = getName()
print(name!) // Crashes if nil


Даже «безопасные» места могут подвести вас — например, повторное использование ячеек в UITableView.

Вместо этого используйте guard let или if let. Никогда не доверяйте данным слепо.

3️⃣ Неявно разворачиваемые Optional (String!)

Они кажутся удобными. Но они вызывают сбой, как и !, если не настроены правильно.

var token: String!
print(token.count) // If token is nil, boom.


По умолчанию используется ?. Используйте ! только в том случае, если вы абсолютно уверены, что он инициализирован перед использованием (например, инжектирован через сториборд).

4️⃣ Не помеченные как final классы

По умолчанию каждый класс в Swift может быть подклассом. Это может привести к снижению производительности из-за динамической диспетчеризации.

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

final class UserManager {
// Now faster method calls, no subclassing allowed
}


5️⃣ Отсутствие weak у делегатов

Классическая ошибка в конфигурациях MVC или MVVM.

protocol MyDelegate: AnyObject {
func didUpdate()
}

class MyController {
var delegate: MyDelegate? // Should be weak
}


Всегда объявляйте свойства делегатов как weak, чтобы избежать циклов удержания:

weak var delegate: MyDelegate?


Какие ошибки чаще вам встречаются? Пишите в комментариях 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍3🔥1😁1
🏦 Интеграция платежных систем на уровне банковской инфраструктуры

Конкурентоспособность банков и финтех-компаний все больше зависит от скорости и надежности платежей. Сегодня интеграция с национальными системами быстрых платежей вроде SEPA Instant — необходимость для выживания, а не просто полезная надстройка.

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

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
3