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

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

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

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

РКН: https://gosuslugi.ru/snet/67a4adec1b17b35b6c0d8389
Download Telegram
👨‍💻 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
⚙️ Kinetics — настраиваемые примитивы физического движения для SwiftUI

Kinetics привносит естественное ощущение реальной физики в ваши анимации SwiftUI. Разработанный на основе Swift 6 с строгим соблюдением принципов многопоточности, он предоставляет современную и безопасную основу для создания анимаций, которая реагируют на действия пользователя, учитывают границы и выглядят реалистично.

💻 Kinetics на GitHub

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

#буст #iOS
Please open Telegram to view this post
VIEW IN TELEGRAM
4
🔥 Вышла библиотека Any Language Model

Разработчик Мэтт Тиссен (Matt Thiessen) выпустил библиотеку Any Language Model для Swift. Она полностью совместима со стандартной Foundation Models, и с ней можно использовать любые LLM, а не только решения от Apple.

В 2025 году Apple представила библиотеку Foundation Models. С её помощью в приложения можно интегрировать модели от Apple: локальную LLM с 3 млрд параметров или облачную VLM. Разработчики в сообществе оценили удобный синтаксис адаптера и оптимизацию под устройства экосистемы, но привязка к определённым нейросетями разрушила потенциальную универсальность.

Проблему решил Мэтт Тиссен. В его API-совместимой библиотеке Any Language Model разработчики могут сами выбирать бэкенд для запуска моделей. Например, можно использовать Apple Foundation Models, CoreML, MLX, llama.cpp (GGUF), OpenAI API, Anthropic API или Google Gemini API. При этом не надо создавать отдельный адаптер для каждого LLM-провайдера.

Для установки Any Language Model в файле Package.swift надо указать следующую зависимость:

dependencies: [
.package(url: "https://github.com/mattt/AnyLanguageModel.git", from: "0.3.0")
]


Для снижения размера готового приложения можно импортировать только нужные провайдеры. Например, код импорта адаптеров для CoreML и MLX выглядит так:

dependencies: [
.package(
url: "https://github.com/mattt/AnyLanguageModel.git",
branch: "main",
traits: ["CoreML", "MLX"] // Enable CoreML and MLX support
)
]


Пример использования Any Language Model выглядит следующим образом:

import AnyLanguageModel

struct WeatherTool: Tool {
let name = "getWeather"
let description = "Retrieve the latest weather information for a city"

@Generable
struct Arguments {
@Guide(description: "The city to fetch the weather for")
var city: String
}

func call(arguments: Arguments) async throws -> String {
"The weather in \(arguments.city) is sunny and 72°F / 23°C"
}
}

let model = SystemLanguageModel.default
let session = LanguageModelSession(model: model, tools: [WeatherTool()])

let response = try await session.respond {
Prompt("How's the weather in Cupertino?")
}
print(response.content)


➡️ Код библиотеки доступен на GitHub. Для работы нужен Swift 6.1+ и iOS 17.0, macOS 14.0 или visionOS 1.0.

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

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