Telegram Web
🔴 Настройка отправки Push-уведомлений

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

📝 Промпт:

Implement push notifications for a mobile app that includes:

— Set up Firebase Cloud Messaging (FCM) for Android and APNS for iOS
— Configure notification channels and categories
— Handle notification permissions and user opt-in flow
— Implement deep linking from notifications
— Manage notification grouping and summary
— Add analytics for notification engagement
— Handle foreground/background notification delivery


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

— Добавьте Implement rich notifications with images and actions для интерактивных уведомлений
— Добавьте Set up geofencing and trigger-based notifications для персонализированных сообщений
— Добавьте Create notification scheduling system для отложенных уведомлений

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
🔥 Отладка iOS-приложения

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

Старая школа (так не делайте):

func calculateScore() {
print("Начало расчета") // ← Лишний шум
// Код...
print("Результат: \(score)") // ← Забудете удалить
}


Профессиональный подход:

1. Умные точки останова

• Условные: срабатывают только при user.age < 18

• С действиями: логируют без остановки выполнения

• Символьные: ловят все вызовы viewDidLoad в проекте

2. Команды LLDB (в консоли Xcode):

(lldb) po user.name          // Вывести значение
(lldb) expr user.age = 25 // Изменить переменную на лету
(lldb) thread backtrace // Показать весь стек вызовов


3. 3D-отладка интерфейса

Кнопка «Debug View Hierarchy» показывает слои UI в 3D — находите незаметные баги за секунды.

4. Логирование через OSLog (вместо print):

import os.log
let log = Logger(subsystem: "com.youapp", category: "network")
log.debug("Загрузка данных...") // Автоматически скрывается в продакшене


5. Instruments — для сложных багов:

• Allocations: ищет утечки памяти

• Time Profiler: находит тормозящие методы

💡 Главный совет:

Настройте условную компиляцию для отладочного кода:

#if DEBUG
// Этот код исчезнет в продакшене
validateData()
#endif


Итог: Забудьте о print(). Используйте точки останова + LLDB + Instruments. Это в 10 раз быстрее и не засоряет код.

Какой ваш главный инструмент отладки? Делитесь в комментариях 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
👍32
This media is not supported in your browser
VIEW IN TELEGRAM
📅 24 сентября в 19:00 МСК — бесплатный вебинар с Максимом Шаланкиным.

Тема: «ИИ-агенты: новая фаза развития искусственного интеллекта».

🔹 Почему все говорят про ИИ-агентов и куда вливаются миллиарды инвестиций.
🔹 Чем они отличаются от ChatGPT и обычных ботов.
🔹 Как работает цикл агента: восприятие → планирование → действие → обучение.
🔹 Живое демо простого агента.
🔹 Потенциал для бизнеса: автоматизация процессов и ROI до 80%.

Не придёшь — будешь потом рассказывать, что «агенты — это как чат-боты», и ловить косые взгляды от коллег 😏

👉 Регистрируйтесь через форму на лендинге
😁1
Локальная разработка vs Облачная среда — где лучше работать?

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

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

❤️ — локально
👍 
в облаке
🤝гибрид

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

#междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
11🤝4👍2
5 SwiftUI-хаков для более чистых приложений

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

1️⃣ Более безопасный способ развертывания Optional в представлениях

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

extension View {
@ViewBuilder
func ifLet<T, Content: View>(_ value: T?, content: (T) -> Content) -> some View {
if let value {
content(value)
} else {
self
}
}
}


Теперь вы можете просто писать:

Text("Hello")
.ifLet(username) { Text("Welcome, \($0)") }


2️⃣ Условные модификаторы без лишних сложностей

Мы все пишем .padding() или .opacity() с условиями. Вместо того, чтобы заключать целые представления в блоки if, используйте это:

extension View {
@ViewBuilder
func apply(_ condition: Bool, modifier: (Self) -> some View) -> some View {
if condition {
modifier(self)
} else {
self
}
}
}


Использование:

Text("Premium")
.apply(isPro) { $0.foregroundColor(.yellow) }


Одна строка, ничего лишнего.

3️⃣ Многоразовый AsyncImage с плейсхолдером

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

struct RemoteImage: View {
let url: URL
var body: some View {
AsyncImage(url: url) { phase in
switch phase {
case .success(let image): image.resizable().scaledToFit()
case .failure(_): Color.gray
case .empty: ProgressView()
@unknown default: EmptyView()
}
}
}
}


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

4️⃣ Форматирование даты в одну строку

Вместо того, чтобы создавать DateFormatter везде, добавьте расширение:

extension Date {
func formatted(_ style: DateFormatter.Style = .medium) -> String {
let formatter = DateFormatter()
formatter.dateStyle = style
return formatter.string(from: self)
}
}


Использование:

Text(Date().formatted(.long))


Легко читаемый и многоразовый код.

5️⃣ Автоматические вставки SafeArea

Не любите бороться с .ignoresSafeArea()? Добавьте небольшой вспомогательный метод:

extension View {
func fillScreen() -> some View {
self.frame(maxWidth: .infinity, maxHeight: .infinity)
.ignoresSafeArea()
}
}


Теперь для каждого полноэкранного представления требуется всего один модификатор.

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
4🥱3👍2👏1🤔1
👾 Визуализация рекомпозиций в Jetpack Compose

Представьте, вы открываете пул‑реквест и взгляд цепляется за знакомые паттерны: нестабильный параметр в Composable‑функции, remember без ключа, применение трансформаций на Layout‑фазе. Сразу хочется написать комментарий‑лекцию о том, почему это ударит по производительности и почему лучше так не делать.

Вот только объяснения отнимают время и не всегда наглядно доносят суть проблемы. Особенно это актуально для новичков, которым сложно сопоставить абстракции с реальным поведением UI.

В этой статье автор расскажет о разработке собственного приложения, которое в реальном времени визуализирует рекомпозиции. Чтобы заставить его работать, пришлось залезть под капот компилятора Kotlin и подружиться с его внутренними API: FIR и IR.

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
⚡️ Бесплатный вебинар — ИИ-агенты: новая фаза развития AI

24 сентября в 19:00 МСК состоится бесплатный вебинар с Максимом Шаланкиным — Data Science Team Lead в финтех-команде MWS, а познакомиться с ним ближе можно в его тг-канале.

Тема:
«ИИ-агенты: новая фаза развития искусственного интеллекта».


На вебинаре разберёмся, почему агенты — это следующий шаг после ChatGPT, чем они отличаются от обычных моделей и как уже приносят бизнесу ROI до 80%. А дальше я покажу, как эта тема ложится в наш курс по ИИ-агентам, который разработан под руководством Никиты Зелинского.

Подробности рассказываем в гс выше — включай, чтобы не пропустить.
Какая версия Swift представила concurrency (async/await)?
Anonymous Quiz
24%
Swift 4
65%
Swift 5.5
8%
Swift 3
3%
Swift 2
🗓 Новости недели

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

🔵 Как Swift Runtime влияет на производительность iOS-приложений

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

🔵Строки в Swift

Каждый, кто писал или пишет приложения на этом языке, так или иначе работает со строками. Но задумывались ли вы когда-нибудь, как они устроены внутри? В этой статье автор приоткроет завесу и расскажет, какие тайны скрывают строки в Swift.

🔵 Вопрос на 16 КБ: почему так важны изменения в памяти Android и как подготовить приложение

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

🔵 Разбор кода: пиксельная погода на Kotlin

Арсений Носов, Android-разработчик в команде Алисы и Умных устройств, тщательно разбирает код и делится полезными советами по работе с ним.

🔵 Как создать собственный RenderObject

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🎮 Свойства, методы get и set

Свойства класса — это переменные, которые хранят состояние объекта класса. Как и любая переменная, свойство может иметь тип, имя и значение.

В классе можно объявить свойства с помощью ключевого слова var или val. Свойства, объявленные с var, могут быть изменены после их инициализации, а свойства, объявленные с val, только для чтения.

class Person {
var name: String = ""
val age: Int = 0
}


При создании своего класса мы хотим сами управлять его свойствами, контролируя то, какие данные могут быть предоставлены или перезаписаны. С этой целью создаются get и set методы (геттеры и сеттеры). Цель get-метода — вернуть значение, а set-метода — записать полученное значение в свойство класса.

var name: String = ""
get() = field.toUpperCase()
set(value) {
field = "Name: $value"
}


В данном примере свойство name имеет тип String и начальное значение пустой строки. Геттер возвращает значение свойства, преобразованное к верхнему регистру. Сеттер устанавливает значение свойства с добавлением префикса "Name: " перед переданным значением. Слово field используется для обращения к текущему значению свойства.

Если get и set методы не были созданы вручную, то для таких свойств Kotlin незаметно сам их генерирует. При этом для свойства, объявленного с val, генерируется get-метод, а для свойства, объявленного с varи get, и set методы.

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

#буст #JuniorKit #Kotlin
Please open Telegram to view this post
VIEW IN TELEGRAM
👍21
🫗 Разбираемся в стилях кнопок SwiftUI с эффектом «жидкого стекла»

В iOS 18 в SwiftUI появились liquid glass-стили — полупрозрачные, «стеклянные» кнопки и элементы.

Обычная кнопка:

Button("Add", action: addItem)


— рисуется в стандартном системном стиле.

Если применить .glass:

Button("Add", action: addItem)
.buttonStyle(.glass)


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

Есть вариант .glassProminent для основных действий, но пока он не работает в Xcode 26.0 beta.

Отдельно существует модификатор .glassEffect(), который можно применить к любому виду:

Text("Hello")
.padding()
.glassEffect()


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

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

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

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

А вы уже использовали .glass или .glassEffect()? Делитесь впечатлениями в комментариях 💬

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

#MiddlePath #SwiftUI #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍1
🌛 Тёмная тема: обязательна или необязательная фича

Тёмная тема стала массовым трендом в 2018–2020 годах, когда её начали добавлять все крупные приложения. Тогда это выглядело как свежий и технологичный ход, который отличал продукт на фоне конкурентов. К тому же производители смартфонов активно продвигали OLED-дисплеи, для которых тёмный режим реально экономил заряд.

Тёмная тема стала частью пользовательского ожидания. Даже те, кто ею не пользовался, считали её обязательной опцией для современного сервиса. UX-дизайнеры включали её в брифы «по умолчанию», а маркетологи записали в «признак заботы о пользователе».

А как считаете вы, обязательна ли тёмная тема в приложении? Голосуйте и пишите своё мнение в комментариях 💬

❤️ — обязательна
👍 
необязательна

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

#междусобойчик #AllLevels
Please open Telegram to view this post
VIEW IN TELEGRAM
22👍7😁2
🔥 Не пропустите событие осени для AI-комьюнити

24 сентября, 19:00 Мск — бесплатный вебинар с Максимом Шаланкиным «ИИ-агенты: новая фаза развития искусственного интеллекта»

😤 Пока все спорят, «боты это или нет», мы покажем, как работают настоящие агенты: с планированием, инструментами и памятью. За час Максим разберёт:
— почему ИИ-агенты сейчас на пике инвестиций
— чем они отличаются от ChatGPT и обычных моделей
— цикл агента: восприятие → планирование → действие → обучение
— живое демо простого агента
— как бизнес уже получает ROI до 80%

⚡️ Хотите спросить у Максима всё, что обычно остаётся «за кадром»? Ловите шанс — только в прямом эфире.

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

Мобильный разработчик (React Native/другие) —‍ от 150 000 до 350 000 ₽, удалёнка

Senior iOS Developer (Swift) —‍ удалёнка

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

iOS Developer —‍ до 2 000 $, удалёнка

Мобильный разработчик (Flutter) —‍ от 90 000 до 120 000 ₽, удалёнка

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🔍 Шаблон архитектуры MVC (Model View Controller)

Шаблон MVC предполагает разделение кода на 3 компонента. При создании класса/файла приложения разработчик должен отнести его к одному из следующих трёх уровней:

🔹 Модель:

Этот компонент хранит данные приложения. Он ничего не знает об интерфейсе. Модель отвечает за обработку логики предметной области (реальных бизнес-правил) и взаимодействие с базой данных и сетевыми уровнями.

🔹 Представление:

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

🔹 Контроллер:

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

Несмотря на применение схемы MVC для модульного проектирования приложения, уровни кода зависят друг от друга. В этом шаблоне Представление и Контроллер зависят от Модели. Для применения шаблона MVC в проекте можно использовать несколько подходов:

➡️ Подход 1: Действия и фрагменты могут выполнять роль контроллера и отвечать за обновление представления.

➡️ Подход 2: Используйте активность или фрагменты в качестве представлений и контроллера, а модель будет отдельным классом, который не наследуется от какого-либо класса Android.

В MVC данные обновляет контроллер, а представление их только отображает. Модель отделена и тестируется независимо от UI. Если представление соблюдает принцип единой ответственности — лишь передаёт действия контроллеру и показывает данные без бизнес-логики — то его достаточно проверять UI-тестами.

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

#буст #SeniorView #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
👏31
⚡️Команда дня: adb logcat

Хотите быстро отследить, что происходит в приложении на устройстве или эмуляторе?
На помощь приходит простая команда:

adb logcat | grep "MyTag"


📌 Что делает:

— Подключается к логам Android-устройства или эмулятора
— Фильтрует вывод по тегу (например, MyTag, который вы используете в Log.d(...))
— Показывает только нужные строки, чтобы не тонуть в море системных логов

👀 Полезно, когда:

— Нужно быстро найти крэш или баг прямо на реальном устройстве
— Хотите дебажить только свою часть логов, а не весь Android-спам
— Проверяете работу логирования перед релизом

💡 Совет:

Добавьте уровни логов для фильтрации:

adb logcat *:E   # только ошибки  
adb logcat *:W # предупреждения и выше


👉 А вы часто используете adb logcat в работе?

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

#буст #JuniorKit #Android
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍2
🧗 Кто такие Unit-лид и Technical Owner — и почему эти роли нужны в IT-командах

Когда компания переходит от «сделать и забыть» к «развивать и совершенствовать», старые роли перестают работать. Нужны люди, которые будут жить продуктом, а не просто выполнять задачи. Unit-лид и Technical Owner — именно такие специалисты. Объясняем, что они делают и почему без них продуктовый подход обречен на провал.

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

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

#MadeInProglib
Please open Telegram to view this post
VIEW IN TELEGRAM
3
2025/10/12 17:31:01
Back to Top
HTML Embed Code: