iOS Broadcast – Telegram
iOS Broadcast
3.46K subscribers
1.86K photos
86 videos
1.04K links
Подборка новостей и статей для iOS разработчиков.

Новости Kotlin и мультиплатформы @kotlin_broadcast
Новости Android @android_broadcast
Реклама и прочее @ab_manager
Download Telegram
🔨 Stanford CS193p лекция 3 Model & UI + Swift Type System
В новой лекции разбираются фундаментальные принципы работы SwiftUI через призму архитектуры модели и системы типов Swift — то, что определяет устойчивость и масштабируемость iOS-приложений.
Перемешивание UI и логики. Во многих SwiftUI-проектах View начинает обрастать обязанностями: хранением данных, обработкой логики, сетевыми вызовами. Это приводит к:
🟡Трудному тестированию
🟡Отсутствию переиспользования
🟡UI, зависимому от внутренних деталей хранения данных

Чёткое разделение Model ↔️ View
Связка Model и UI — центральная концепция лекции. SwiftUI ожидает, что:
🟡Model хранит истинное состояние и бизнес-логику.
🟡View — чистая функция состояния: она описывает интерфейс, но не владеет логикой.
Это делает приложение устойчивым к изменениям и легко тестируемым.

Swift Type System как фундамент архитектуры. Лекция подчёркивает важность системы типов Swift:
🟡Struct как основной строительный блок данных. Value-semantics уменьшают количество багов, связанных с состоянием.
🟡Enum + associated values. Мощный инструмент для моделирования состояний экрана: loading / success / error.
🟡Optionals. Встроенная безопасность, которая заставляет проектировать модель осознанно.
🟡Immutability по умолчанию. View остаются предсказуемыми, изменения происходят только в модели.

MVVM как естественный путь
CS193p фактически показывает MVVM-подход, но без перегибов:
🔵Model — данные и логика.
🔵ViewModel — источник правды для View, объявленный через @Observable / @StateObject.
🔵View — рендер состояния, без тяжёлой логики.

Выводы:
🔵Избегайте логики в View — переносите в модель или ViewModel.
🔵Используйте enum-состояния для сложных процессов (загрузка, ошибки, пустые состояния).
🔵Стройте данные на основе struct — меньше сайд-эффектов и легче тестировать.
🔵Используйте Optional осознанно: они должны отражать реальную модель данных.
🔵Делайте View чистой функцией состояния — UI становится стабильнее и проще.
#cs193p
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
⌨️⌨️⌨️ Ввод текста прямо из push-уведомления
Часто нужно дать пользователю возможность быстро ответить или ввести текст, не открывая приложение: ответить на сообщение, оставить короткий комментарий, подтвердить действие текстом. Обычные push-уведомления этого не позволяют — только кнопки без контекста.
Требуется UNTextInputNotificationAction:
🟣Пользователь вводит текст прямо в notification UI
🟣Приложение получает введённую строку в AppDelegate / Notification Service
🟣Можно обработать ответ без открытия приложения

Как это работает
⌨️ Создаём action с текстовым вводом
let replyAction = UNTextInputNotificationAction(
identifier: "REPLY_ACTION",
noscript: "Ответить",
options: [],
textInputButtonTitle: "Отправить",
textInputPlaceholder: "Введите сообщение"
)


⌨️ Добавляем action в категорию уведомлений
let category = UNNotificationCategory(
identifier: "MESSAGE_CATEGORY",
actions: [replyAction],
intentIdentifiers: [],
options: []
)

UNUserNotificationCenter.current()
.setNotificationCategories([category])


⌨️ Обрабатываем введённый текст
if let response = response as? UNTextInputNotificationResponse {
let text = response.userText
}


Что важно учитывать
🟣Работает только для notification categories
🟣Требует корректной обработки в UNUserNotificationCenterDelegate
🟣Пользователь всё ещё должен дать разрешение на уведомления
🟣UI ввода — системный, кастомизировать нельзя

UNTextInputNotificationAction — недооценённая, но очень мощная возможность iOS.
Позволяет превратить уведомление из «пассивного» в интерактивный элемент, который реально экономит время пользователя.
Please open Telegram to view this post
VIEW IN TELEGRAM
4👍1
Kotlin Multiplatform + gRPC — мощный тандем для мобильной разработки 🚀

О чём поговорим:
— настройка проекта на KMP ⚙️
— построение сетевого слоя на gRPC ⚡️
— интеграция с iOS и нюансы платформы 🍎
— разбор структуры приложения и реальных кейсов 📱

Почему это важно:
Kotlin Multiplatform становится ключевым инструментом для кросс-платформенной разработки, а gRPC обеспечивает быстрые и прозрачные сетевые взаимодействия без лишних обёрток ⚡️📡

Для кого урок:
Для разработчиков, изучающих iOS, интересующихся KMP и стремящихся прокачать архитектурное мышление 🧠💡
Только практика — реальные решения и интеграция в продакшн-проекты.

Когда: 22 декабря в 20:00 МСК — перед стартом курса «iOS Developer. Professional».
👉 Регистрация открыта

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
🔨 Ускоряем инкрементальную сборку проекта с Claude Code + XcodeBuildMCP

При использовании Claude Code стандартные xcodebuild-сборки тормозят на больших проектах, потому что каждый билд проходит полный цикл компиляции. Новое решение — интеграция XcodeBuildMCP, которая позволяет задействовать экспериментальную поддержку инкрементальных сборок

Что это даёт разработчику
🔵Быстрые инкрементальные сборки — при повторных билд-сессиях XcodeBuildMCP ускоряет компиляцию за счёт повторного использования артефактов вместо полной пересборки
🔵Работает в связке с Claude Code/AI-ассистентами, когда команды билда передаются через MCP (Model Context Protocol)

Как включить:
🟣В конфигурации Claude Code добавляем XcodeBuildMCP и включаем экспериментальный incremental-режим:
claude mcp add -s user XcodeBuildMCP npx xcodebuildmcp@latest \
-e INCREMENTAL_BUILDS_ENABLED=true \
-e XCODEBUILDMCP_ENABLED_WORKFLOWS="simulator,device,project-discovery,session-management" \
-e XCODEBUILDMCP_SENTRY_DISABLED=true

🟣INCREMENTAL_BUILDS_ENABLED=true — включает быстрые incremental-сборки
🟣simulator, device — включают нужные рабочие группы
🟣SENTRY_DISABLED — отключает Sentry-отчёты на время эксперимента
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
🐥 Все не так с Codable
Выпустили статью про наши оптимизации JSONDecoder/Encoder. Очень советую к прочтению, получил огромное удовольствие при редактуре.

Почему Codable тормозит?
🔵Многие приложения используют Codable для API-ответов, UserDefaults, кешей и пр. — и именно от его скорости часто зависит старт/UI-ответ.
🔵Внутренние механизмы стандартной реализации делают много проверок conformances (соответствий протоколам), особенно через вызовы swift_conformsToProtocolMaybeInstantiateSuperclasses. Эти вызовы оказываются самой медленной частью сериализации/десериализации
🔵Причём чем больше моделей и ключей (CodingKeys) — тем хуже масштабируется производительность

Оптимизации в JSONDecoder/Encoder
🟢Мы проанализировали использующиеся проверки и смогли уменьшить накладные расходы при conformances, избегая лишних runtime-поисков
🟢Предложили универсальный `AnyCodingKey`, который снижает количество разных protocol-denoscriptors, экономя работу рантайма
🟢Благодаря этим подходам, в A/B-экспериментах на 80 000 пользователей сериализация и десериализация стали в ≈2× быстрее на ключевых квантилях

🎁 Оптимизация через макросы
Чтобы ещё сильнее ускорить, мы конвертировали модели на уровне генерации кода:
🔵Использование Swift-макросов для автоматической генерации init(from:)/encode(to:) без CodingKeys
🔵Это уменьшает нагрузку на рантайм и ещё сильнее снижает overhead сериализации/десериализации

Выводы
🟡Если у вас большие JSON-модели или массовый парсинг/запись — Codable может быть узким местом
🟡Оптимизация ключей, контроль CodingKeys и сокращение количества протоколов, через которые проходит парсинг — реально влияет на производительность
🟡В продакшн-приложениях важно измерять не только бизнес-логику, но почти «внутренности» стандартных API — часто именно там скрываются миллисекунды, влияющие на UX
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9🔥5
🔨 Stanford CS193p Лекция 4
Заканчиваем неделю уже регулярной еженедельной рубрикой по лекциям из курса по разработке iOS приложений на SwiftUI от Стендфорда. Эта лекция посвящена построению модели игры CodeBreaker и связке её с UI. Это важный этап курса — теперь приложение не просто отображает данные, а игра становится полностью работоспособной с логикой в модели. Вся лекция это лайв кодинг, который отображает подход к иттерационной разработке и выстраивает правильное мышление при решении задачи. Что проходит в лекции:

Повторение архитектуры Model ↔️ View
🔵Model для CodeBreaker — логику игры, проверку ходов, хранение состояния
🔵Отделение логики от UI — ключ к тестируемости и масштабируемости
🔵UI теперь связан с моделью через @StateObject / @ObservedObject / bindings, и игра оживает

Работа с состоянием и обновлениями
🔵Рассматриваются структуры данных и состояния
🔵SwiftUI автоматически реагирует на изменения модели, обновляя интерфейс

Применение Optional, Enum и коллекций
🔵Для Game Status удобно использовать enum и Optional, чтобы чётко описать стадии игры
🔵Такого рода типы делают модель выразительной и безопасной

Интеграция с UI
🔵View без бизнес-логики — модель принимает решения, а UI отображает результат
🔵Обработка событий (нажатие плитки, новая попытка) прокидывается через binding к модели

#cs193p
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM