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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
⚠️ 5 незаметных ловушек Swift

Вот 10 ловушек Swift, которые кажутся безобидными — пока не настигнут вас.

1️⃣ Бездумное использование DispatchQueue.main.async

Да, вам нужно обновлять пользовательский интерфейс в основном потоке. Но если вы слепо обернете все в DispatchQueue.main.async, вы рискуете столкнуться с условиями гонки или задержками обновлений.

DispatchQueue.main.async {
self.label.text = "Updated"
}


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

2️⃣ Путаница между типами значений и ссылок

Структуры (такие как User) копируются при присваивании. Классы совместно используются по ссылке.

struct User {
var name: String
}

var a = User(name: "Abhinav")
var b = a
b.name = "Singh"

print(a.name) // Still "Abhinav"


Знайте, когда вам нужна неизменяемость (структура) и когда — общее состояние (класс). Их смешивание приводит к неприятным ошибкам.

3️⃣ Неправильное использование Codable

Codable в Swift — это замечательно… до тех пор, пока не изменится структура JSON и декодирование без предупреждения не завершится с ошибкой.

struct User: Codable {
let id: Int
let name: String
}


Если бэкэнд отправит user_id вместо id, декодирование завершится сбоем.

Используйте CodingKeys явно, когда поля различаются:

enum CodingKeys: String, CodingKey {
case id = "user_id"
case name
}


4️⃣ Неправильное использование @Published в SwiftUI/Combine

Простое добавление @Published не вызывает обновление пользовательского интерфейса вне основного потока или если обновление происходит косвенно.

@Published var name: String = ""

DispatchQueue.global().async {
self.name = "New" // No UI update
}
Всегда обновляйте свойства @Published в главном потоке:

DispatchQueue.main.async {
self.name = "New"
}


5️⃣ Путаница между Any и AnyObject

Они кажутся похожими, но на самом деле это не так. Any означает любой тип. AnyObject означает любой тип класса.

func handle(data: Any) { ... }         // Can be Int, String, Class, etc.
func handleObject(data: AnyObject) { ... } // Only class instances


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

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

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1
💰 Сколько ты стоишь как разработчик? 3 способа не прогадать с зарплатой

Представь: приходишь на собес, называешь зарплату, а HR сразу соглашается без торгов. Поздравляю — ты только что продешевил. Чтобы таких ляпов не было, рассказываем, как правильно определить свою стоимость на рынке труда.

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

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

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

iOS разработчик — удалёнка

Senior Android Developer — от 270 000 ₽, удалёнка

Middle/Middle+ iOS Developer — 160 000 —‍ 250 000 ₽, удалёнка

Flutter-разработчик (Умные бьюти-решения) — от 250 000 ₽, гибрид (Москва)

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

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

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
2
🫆 Реализация биометрии в мобильных приложениях

Традиционные методы аутентификации уступают биометрии по:

• Удобству (не нужно запоминать пароли)
• Безопасности (уникальные биометрические данные)
• Скорости входа в приложение

🔐 Android Implementation (Biometric API)

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

implementation 'androidx.biometric:biometric:1.1.0'


2. Проверка доступности:

val biometricManager = BiometricManager.from(context)
when (biometricManager.canAuthenticate()) {
BiometricManager.BIOMETRIC_SUCCESS -> // Доступно
BiometricManager.BIOMETRIC_ERROR_NO_HARDWARE -> // Нет сканера
BiometricManager.BIOMETRIC_ERROR_HW_UNAVAILABLE -> // Сканер занят
}


3. Запуск аутентификации:

val promptInfo = BiometricPrompt.PromptInfo.Builder()
.setTitle("Вход в приложение")
.setSubtitle("Приложите палец к сканеру")
.setNegativeButtonText("Отмена")
.build()

val biometricPrompt = BiometricPrompt(activity, executor, object : BiometricPrompt.AuthenticationCallback() {
override fun onAuthenticationSucceeded(result: BiometricPrompt.AuthenticationResult) {
// Успешная аутентификация
}
})

biometricPrompt.authenticate(promptInfo)


👨‍💻 iOS Implementation (LocalAuthentication)

1. Проверка доступности:

let context = LAContext()
var error: NSError?

if context.canEvaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, error: &error) {
// Биометрия доступна
}


2. Запрос аутентификации:

context.evaluatePolicy(.deviceOwnerAuthenticationWithBiometrics, 
localizedReason: "Для входа в приложение") { success, error in
DispatchQueue.main.async {
if success {
// Успешная аутентификация
}
}
}


🛡 Безопасность и лучшие практики

1. Fallback механизмы:

• Предусмотрите резервный PIN-код
• Не храните биометрические данные

2. UX рекомендации:

• Четко объясняйте зачем нужна биометрия
• Предлагайте альтернативные методы входа

3. Обработка ошибок:

• Многочисленные неудачные попытки
• Изменение биометрических данных

Как вы реализуете биометрию? Делитесь кейсами в комментариях 💬

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍2😁2
🤖 Всё о вайб-кодинге

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

➡️ Читать статью

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

#свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🥱43👍1
Open SwiftUI Animations — коллекция анимаций SwiftUI

Open SwiftUI Animations — библиотека готовых эффектов и анимаций для SwiftUI. Этот репозиторий вдохновит вас на добавление полезных и выразительных анимаций SwiftU в ваг проект.

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

💻 Open SwiftUI Animations на GitHub

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2
🔥 Успей поднять квалификацию по выгодной цене!

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

🔹 Математика для Data Science:

— Базовый: (сейчас) 26 399₽(будет) 33 900₽
— Ультра: 35 199₽44 900₽
— VIP: 59 829₽75 900₽ (выгода больше 16 000₽!)

🔹 Программирование на Python: 24 990₽32 900₽
🔹 Алгоритмы и структуры данных: 31 669₽39 900₽
🔹 Архитектуры и шаблоны проектирования: 24 890₽32 900₽
🔹 AI-агенты для DS специалистов: 54 000₽59 000₽
🔹 Основы IT для непрограммистов: 14 994₽19 900₽
🔹 Базовые модели ML: 6 990₽9 900₽

Важно: Курсы из линейки Frontend Basic полностью снимаются с продажи. 17 августа — буквально последний день, когда их можно будет приобрести.

Успей купить до повышения — осталось 4 дня!

👉 Зафиксировать цену и начать учиться
🎙 Подкасты и видео о мобильной разработке

Собрали лучшее о мобильной разработке. Включаем и смотрим по пути на работу.

Код, который не тормозит:
секреты производительности на iOS


Нюансы работы Android Runtime в сравнении с
HotSpot VM


Запись Avito Mobile Meetup

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

#буст
Please open Telegram to view this post
VIEW IN TELEGRAM
2
👨‍💻 Опыт перехода на Swift Package Manager

На Хабре уже опубликовано немало статей о переходе на Swift Package Manager — как успешных, так и не очень. В случае автора миграция прошла удачно, однако на каждом этапе возникали проблемы, которые было сложно нагуглить или вообще найти решения.

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

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

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

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