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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
💻 Позаботимся о памяти при использовании value-типов

С выходом Swift 5.9 была введена концепция некопируемости для структур и перечислений, что позволяет хранить уникальные ресурсы без необходимости использования кучи и ссылочной семантики. Однако полноценная реализация этого инструмента стала возможной только с поддержкой протоколов и дженериков в Swift 6.0.

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

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

#новость #ios
4
👨‍💻 Как работать с Koin scopes в Jetpack Compose Navigation

При разработке современных Android-приложений важную роль играет удобная навигация между экранами и управление зависимостями. Jetpack Compose Navigation — это библиотека, предоставляющая декларативный способ организации навигации в приложениях, построенных на Jetpack Compose.

Koin — это лёгкий и удобный фреймворк для внедрения зависимостей (DI) в приложениях. Он предлагает декларативный синтаксис для определения модулей, а также поддержку scoping’а, который помогает управлять жизненным циклом зависимостей.

В статье автор рассматривает, как использовать Koin scopes в связке с Jetpack Compose Navigation, чтобы эффективно управлять зависимостями на разных уровнях навигационного графа.

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

#новость #ios
🥰3
⚒️ Как устроен пользовательский интерфейс SwiftUI

iOS‑разработчикам приходится много работать с пользовательскими интерфейсами. Понимание различных аспектов пользовательского интерфейса, таких как жизненный цикл или компоновка, имеет решающее значение для работы с UIKit и SwiftUI.

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

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

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

#новость #ios #swift
🤩4🤔1
💻 Xmtp-ios — клиентский SDK для работы с XMTP

XMTP — крупнейшая и самая безопасная децентрализованная сеть обмена сообщениями. Xmtp-ios представляет собой Swift-реализацию клиента XMTP message API для использования в iOS-приложениях.

Используйте xmtp-ios для для отправки сообщений между блокчейн-аккаунтами, включая DM, уведомлений, анонсов и многого другого.

⚙️ Xmtp-ios на GitHub

#новость #ios
1
📱🧮 Как Android обошел iOS в создании идеального калькулятора

Когда в Google решили написать по-настоящему точный калькулятор для Android, они и не подозревали, что эта задача потребует участия выдающегося эксперта по C/C++ и создания гибридной математической системы.

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

#новость #android #ios
👾7👍4
👨‍💻 Embedded Swift Example Projects — примеры встраиваемого Swift

Embedded Swift Example Projects — этот репозиторий представляет собой набор демонстрационных проектов для встраиваемого Swift. Embedded Swift — это режим компиляции и языка, который позволяет разрабатывать на Swift baremetal, встраиваемые и автономные программы или игры.

⚙️ Embedded Swift Example Projects на GitHub

#новость #ios
3👍1
📱 Осваиваем скроллинг в SwiftUI

Начиная с iOS 17 в SwiftUI появилась функция scrollTargetBehavior, позволяющая разработчикам управлять поведением прокрутки с большей точностью. Будь то выравнивание представлений или реализация пользовательских эффектов пагинации, ScrollTargetBehavior обеспечивает надежную поддержку. Что еще более важно, разработчики могут создавать собственные реализации функции для удовлетворения конкретных потребностей.

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

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

#новость #ios #swift
🥰41
💬 Monal — открытый XMPP-клиент

Monal — кроссплатформенный современный открытый XMPP-клиент для iOS и macOS. Среди фич — отсутствие рекламы и отслеживания личной информации, зашифрованные чаты, работа с корпоративными XMPP-серверами, требующими VPN, поддержка групповых чатов, аудио/видео звонков.

⚙️ Monal на GitHub

#новость #ios
🤩3
📱 Чем полезен Server Driven UI

Автор статьи рассказывает о Server Driven UI по такому плану:

• что это вообще за технология

• из чего она состоит

• рассмотрит подходы к ее реализации

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

#новость #android #ios
🤩3
🍏 Yams — парсер YAML для Swift

Yams — парсер YAML для Swift (YAML — это удобный для человека язык сериализации данных). В Yams есть три группы API преобразований: одна для использования с типами Codable, другая — для типов стандартной библиотеки Swift, а третья — для нативного представления Yams.

⚙️ Yams на GitHub

#новость #ios
🤩5
🫗 Разбираемся в стилях кнопок 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
🦢 Вышла версия Swift 6.2

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

➡️ Читайте дальше, чтобы узнать подробнее об изменениях в языке, библиотеках, рабочих процессах, поддержке платформ и о том, с чего начать работу со Swift 6.2.

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

#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3👍2
💻 Пишем видеоплеер под iOS с нуля

Приложения с видео далеко ушли вперед за последнее время. AVPlayer не развивался и пригоден для кинотеатров с DRM. С ним сложно делать prefetch, контролировать загрузку и поддерживать кастомные форматы. В open source нет работоспособных решений, а написать плеер с нуля сложно.

➡️ В докладе поговорили про:

🔵 архитектуру простого видеоплеера;
🔵 устройство контейнера MP4, научимся парсить треки и собирать CMFormatDescription;
🔵 декодирование семплов с использованием медиа фреймворков Apple;
🔵 синхронизацию отображения видео и проигрывамого аудио;
🔵 перемотку, задержки и как объединить слои в единую архитектуру;
🔵 какие оптимизации открывает полный контроль над работой видеоплеера.

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

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

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

#свежак #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
4
🔍 Неочевидные возможности отладчика в Xcode

Большинство iOS-разработчиков используют Xcode Debugger только для банальных breakpoint и просмотра переменных. Но в нём есть куда больше фишек, которые реально экономят время.

🔹 Conditional breakpoints

Можно остановить выполнение не всегда, а только при выполнении условия.
Например, поставить брейкпоинт на метод и задать условие userId == 42. Тогда дебаггер не будет дёргать вас на каждом вызове.

🔹 Exception Breakpoint

Очень полезно для поиска падений — Xcode сразу остановит выполнение в момент выброса исключения, до того как приложение упадёт. Настраивается через вкладку Breakpoints Navigator → + Exception Breakpoint.

🔹 Symbolic breakpoints

Позволяют ловить вызовы по имени метода или функции, даже если кода у вас нет (например, методы UIKit). Можно отследить момент, когда система вызывает viewDidAppear: или layoutSubviews.

🔹 Debug view hierarchy

Через кнопку "Debug View Hierarchy" можно визуально исследовать всю иерархию вьюх, включая невидимые и перекрытые элементы. Отличный способ поймать «невидимую кнопку», которая блокирует тап.

🔹 LLDB команды прямо в консоли

🔘 po object — печатает объект с вызовом description.
🔘 expr — позволяет выполнять произвольный Swift/ObjC код прямо во время остановки.
🔘 watchpoint set variable foo — можно следить за изменением конкретной переменной.

🔹 Runtime Issues

Xcode сам подсказывает баги вроде «UI update вне main thread» или «дважды добавили constraint». Не игнорируйте эти подсказки — они часто спасают кучу времени.

Что из этого вы используете? 💬

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

#буст #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
4
📱 UITableView с различными типами ячеек

Создание таблицы с различными типами ячеек достаточно стандартная задача. Конечно, можно использовать различное ветвление при помощи if, else или switch, но лучше и практичнее использовать Дженерики.

👀 Смотреть видео

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

#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
4
🔴 Как правильно показывать Alerts в SwiftUI

В SwiftUI alert — это способ показать критически важную информацию или запросить решение у пользователя.

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

🧠 Основы

Самый простой способ — через isPresented (булево значение):

@State var isPresented = false

VStack {
// UI
}
.alert("Alert Title", isPresented: $isPresented) {
Button("OK") { /* action */ }
Button("Cancel") { }
}


Алёрт появляется, когда isPresented = true, и автоматически закрывается после действия пользователя.

💬 Дополнительное сообщение

Можно добавить поясняющий текст:

.alert("Alert Title", isPresented: $isPresented) {
Button("OK") { }
} message: {
Text("Подробнее о проблеме")
}


Это помогает пользователю понять контекст и принять осознанное решение.

📦 Работа с данными

Для подтверждения действий над конкретными объектами есть параметр presenting:

.alert("Delete Document", isPresented: $isPresented, presenting: document) { document in
Button("Delete", role: .destructive) { delete(document) }
Button("Cancel", role: .cancel) { }
} message: { document in
Text("Удалить '\(document.name)'? Это действие нельзя отменить.")
}


Так SwiftUI сохраняет корректные данные на время отображения диалога.

❗️ Работа с ошибками

Если твои ошибки реализуют LocalizedError, SwiftUI умеет красиво показывать их в алёртах:

.alert(isPresented: $isPresented, error: error) {
Button("Retry") { }
Button("Cancel") { }
} message: { error in
Text(error.recoverySuggestion ?? "Попробуй позже.")
}


Рекомендации

Используй краткие заголовки и ясные действия.
Помечай кнопки ролями: .cancel, .destructive.
Не перегружай интерфейс — если это не критично, лучше показать баннер или inline-сообщение.

💬 А как вы показываете ошибки пользователю — через alert, banner или sheet?

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

#АрхитектурныйКод #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
2
⚙️ SQLiteData — быстрая и легкая замена SwiftData с SQL и CloudKit

SQLiteData — это быстрая и лёгкая замена SwiftData от Point-Free, включающая SQL и синхронизацию с CloudKit (и даже шаринг CloudKit), построенная на основе популярной библиотеки GRDB.

Пример:

@FetchAll
var items: [Item]

@Table
struct Item {
let id: UUID
var title = ""
var isInStock = true
var notes = ""
}


Этот пример извлекают элементы из внешнего хранилища данных с использованием типов данных Swift, и автоматически отслеживается SwiftUI, поэтому представления пересчитываются при изменении внешних данных. При этом SQLiteData работает непосредственно с SQLite и может использоваться откуда угодно, включая UIKit, модели @Observable и многое другое.

💻 SQLiteData на GitHub

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

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3
📌 Что такое OptionSet

OptionSet — это протокол, который представляет параметры в виде битов (битовой маски). Он также предоставляет вашему типу операции, подобные операциям с множествами, такие как объединение и пересечение. OptionSet позволяет объединять несколько значений.

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

Давайте напишем код:

struct TasksListOptions: OptionSet {
let rawValue: Int

static let showFilter = TasksListOptions(rawValue: 1 << 0)
static let showSearch = TasksListOptions(rawValue: 1 << 1)
static let showSort = TasksListOptions(rawValue: 1 << 2)
static let showLayoutSelector = TasksListOptions(rawValue: 1 << 3)
}


Каждый вариант rawValue представляет собой один бит в одном и том же целом числе: 1 << 0 — это  0001, 1 << 1 — это  0010, 1 << 2 — это  0100 и так далее. При объединении вариантов Swift объединяет их биты с помощью оператора побитового ИЛИ (|), поэтому showFilter + showSort становится 0101. Таким образом, несколько вариантов объединяются в одно компактное число, в котором каждый бит чётко обозначает отдельный вариант.

Как уже упоминалось, замечательной особенностью OptionSet является возможность комбинировать параметры. Один из распространённых сценариев — объявление предустановок по умолчанию с комбинированными значениями. Например, можно создать all параметр для представления всех параметров. В нашем примере мы можем создать предустановки для разных типов списков:

struct TasksListOptions: OptionSet {
...

static let today: TasksListOptions = [.showFilter, .showSearch]
static let allTasks: TasksListOptions = [.showFilter, .showSearch, .showSort, .showLayoutSelector]
}


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

@Observable
final class TasksListViewModel {
private let options: TasksListOptions
}


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

#буст #MiddlePath #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3
🗂 Derived Data: 5 ошибок iOS-разработчиков

Папка Derived Data (производные данные) — один из важнейших каталогов, используемых iOS-разработчиком. Хотя вы не работаете с ней напрямую, Xcode активно использует её для кэширования информации и оптимизации разработки.

Тем не менее, у iOS-разработчиков есть множество возможностей максимально эффективно использовать Derived Data. Будь то удаление файлов для оптимизации сборки или просмотр информации о каталоге, все эти действия могут улучшить работу разработчиков.

➡️ В статье автор рассмотрит 5 ошибок, которые совершают iOS-разработчики

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

#свежак #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
3
⚙️ PostgresNIO — клиент PostgreSQL для Swift

PostgresNIO — неблокирующий event-driven клиент Swift для PostgreSQL, построенный на SwiftNIO.

Фичи:


🔘 PostgresConnection, позволяющий подключаться к серверу PostgreSQL, авторизоваться, отправлять запросы и получать результаты
🔘 PostgresClient, объединяющий и управляющий соединениями
🔘 Интерфейс async/await с поддержкой backpressure
🔘 Автоматическое преобразование примитивных типов Swift в формат Postgres
🔘 Интеграция с экосистемой серверов Swift, включая использование SwiftLog и ServiceLifecycle
🔘 Разработан для эффективной работы на всех поддерживаемых платформах (протестировано в системах Linux и Darwin)
🔘 Поддержка Network.framework (при наличии) (например, на платформах Apple)

💻 PostgresNIO на GitHub

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

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