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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
🌛 Как сделать ваше веб-приложение доступным в офлайн-режиме

В этом материале автор разберёт, как работают PWA и WebView в офлайн-режиме, посмотрит на инструменты, которые помогают реализовать такую функциональность, и в завершении поделиться примером: какую технологию он выбрал для календаря и как внедрил офлайн-режим на практике.

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🔥2
🔔 Настройка push-уведомлений в мобильных приложениях

👾 Firebase Cloud Messaging (Android)

1. Добавьте зависимости:

implementation 'com.google.firebase:firebase-messaging:23.1.0'


2. Регистрация токена:

FirebaseMessaging.getInstance().token.addOnCompleteListener { task ->
if (task.isSuccessful) {
val token = task.result
// Отправьте токен на ваш сервер
}
}


3. Обработка входящих сообщений:

class MyFirebaseService : FirebaseMessagingService() {
override fun onMessageReceived(message: RemoteMessage) {
// Создайте и отобразите уведомление
}
}


👨‍💻 Apple Push Notification Service (iOS)

1. Настройка в Xcode:

• Включите Push Notifications в Capabilities
• Зарегистрируйте сертификаты в Developer Center

2. Запрос разрешений:

UNUserNotificationCenter.current().requestAuthorization(
options: [.alert, .sound, .badge]) { granted, error in
if granted {
DispatchQueue.main.async {
UIApplication.shared.registerForRemoteNotifications()
}
}
}


3. Обработка токена устройства:

func application(_ application: UIApplication, 
didRegisterForRemoteNotificationsWithDeviceToken deviceToken: Data) {
let token = deviceToken.map { String(format: "%02.2hhx", $0) }.joined()
// Отправьте токен на сервер
}


🚀 Продвинутые функции

1. Группировка уведомлений (Android):

NotificationCompat.Builder(context, CHANNEL_ID)
.setGroup("news_group")
.setGroupSummary(true)


2. Действия в уведомлениях (iOS):

let action = UNNotificationAction(
identifier: "replyAction",
title: "Ответить",
options: [.foreground])


3. Глубокая навигация:

val pendingIntent = NavDeepLinkBuilder(context)
.setGraph(R.navigation.main_nav)
.setDestination(R.id.detailsFragment)
.createPendingIntent()


Какие лучшие практики по push-уведомлениям используете вы? Делитесь в комментариях 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2🥱2
✏️ Чек-лист: полный контроль качества

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

✔️ Основные проверки

Тестирование на 5+ реальных устройствах (включая старые модели)
Проверка работы приложения при плохом интернет-соединении
Анализ потребления батареи в фоне
Тестирование на "ломанных" прошивках (для Android)

✔️ Технический аудит

Проверка крэш-репортов (Firebase/Sentry)
Оптимизация размера APK/IPA (<100MB для Google Play, <200MB для App Store)
Проверка скорости загрузки контента (Lottie-анимации, тяжелые изображения)
Тестирование deep links и универсальных ссылок

✔️ UI/UX валидация

Соответствие гайдлайнам Material Design/Human Interface
Проверка адаптивности на экранах от 4.7" до 7.9"
Тестирование темной/светлой темы
Валидация тач-зоны всех интерактивных элементов

✔️ Процесс публикации

Подготовка release notes на 3+ языках
Проверка возрастного рейтинга и контент-фильтров
Включение всех необходимых разрешений в манифест
План отката на предыдущую версию

Какие важные пункты мы забыли? Пишите в комментариях 💬

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

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

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

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2
Docker vs Server

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

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

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

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

❤️ — Docker
👍 
традиционные серверы
🤝 гибрид

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2🥱1🤝1
Когда нужно использовать crossinline, а когда noinline в Kotlin

Модификаторы crossinline и noinline используются для управления поведением лямбда-выражений, переданных в качестве параметров функций. Они позволяют указывать, может ли лямбда-выражение содержать операторы return.

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

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

ВЫВОД: crossinline должен использоваться только тогда, когда вы уверены в том, что оператор return не будет использоваться внутри лямбда-выражения. Если лямбда-выражение должно содержать оператор return, то следует использовать ключевое слово noinline вместо crossinline.

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

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

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

iOS-разработчик — от 200 000 ₽, удалёнка

Junior iOS Developer — от 100 000 до 150 000 ₽, удалёнка

Android-разработчик (Карты) — от 230 000 до 450 000 ₽, гибрид (Москва)

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

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🤫 5 лучших шаблонов Jetpack Compose

Рассмотрим 5 самых важных шаблонов, которые помогут сделать ваш код Compose чище, удобнее в поддержке и масштабируемее.

1️⃣ Подъем состояния

Шаблон: перемещение состояния вверх к родительскому composable и передача его вниз.

@Composable
fun Counter(count: Int, onIncrement: () -> Unit) {
Button(onClick = onIncrement) {
Text("Clicked $count times")
}
}


Зачем: делает ваш пользовательский интерфейс stateless и упрощает тестирование. Меньше побочных эффектов = меньше отладки = больше сна.

2️⃣ Однонаправленный поток данных (UDF)

Паттерн: данные текут вниз, события текут вверх.

• ViewModel предоставляет состояние
• Композабл объекты отслеживают состояние
• События пользовательского интерфейса всплывают через колбеки

Думайте об этом как о родительском контроле: вы даёте инструкции, и хаос (то есть события) находит путь обратно.

3️⃣ Слотовые API

Паттерн: принимает содержимое в качестве параметров (как дочерние элементы в React).

@Composable
fun FancyCard(content: @Composable () -> Unit) {
Card {
content()
}
}


Способствует повторному использованию. Ваши проекты будут вам благодарны, и ваши коллеги тоже, возможно, тоже.

4️⃣ Интеграция ViewModel + StateFlow

Предоставьте доступ к состоянию с помощью StateFlow и соберите его в Composable.

val uiState by viewModel.stateFlow.collectAsState()


Избегайте LiveData, если только вы не создаёте музей Compose.

5️⃣ Stateless vs Stateful композабл

Разделите ваши композабл:

• Stateless: только пользовательский интерфейс
• Stateful: управление логикой

@Composable
fun PasswordInputField(password: String, onChange: (String) -> Unit) { /*...*/ }


Более чёткое разделение, более удобный предварительный просмотр и меньше сюрпризов.

Что бы вы добавили в этот список? Пишите в комментариях 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4🔥2🌚1
🤖💻😎 Вайб-кодинг: что это и как к нему относятся IT-специалисты и работодатели

97% программистов уже пробовали ИИ для написания кода. Но где грань между продуктивной помощью и потерей контроля над продуктом? Упрощает ли вайб-кодинг жизнь джунам или затрудняет их развитие? И главное — как к такому подходу относятся айтишники и их работодатели?

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🥱1
📺 Работа с телевизионными каналами на Android TV

При создании приложения под Android TV у вас наверняка могут возникнуть вопросы: как получить доступ к списку телевизионных каналов и как организовать у себя трансляцию?

В этом материале автор ответит на них и расскажет про взаимодействие с телевизором с помощью Android TV Input Framework (TIF), а также получение через него списка доступных каналов. По сути это первый шаг к созданию полноценного TV-приложения.

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

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

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