Мобильный трудоголик
1.32K subscribers
61 photos
9 videos
263 links
👨‍💻 Пишу простым языком об iOS разработке на Swift и мобильной разработке в целом.
🔹 Вошел в IT задолго до того как это стало мейнстримом.
---
‍Обо мне: https://t.me/hardworkerIT/3
Чат: @hardworkerChatIT
Канал про разработку и жизнь в ИТ: @itDenisov
Download Telegram
🔨 Xtool — кроссплатформенная замена Xcode для iOS-разработки.

Новый инструмент Xtool позволяет собирать, подписывать и запускать iOS приложения без Xcode. Как отмечает Томас Рикуар, теперь разрабатывать под iOS можно даже на Linux или Windows — достаточно минимального Swift пакета.

⚠️ Что это за инструмент?
🔸 Открытый билдчейн с полным контролем над процессом сборки.
🔸 Поддержка кроссплатформенной разработки (macOS / Linux / Windows).
🔸 Работает с чистыми Swift пакетами — без Storyboard и xcodeproj.

🤔 Как это меняет разработку?
🔹 Больше не нужен Xcode для базовых задач.
🔹 Сборка на любом ПК — даже без Mac (если есть сертификаты подписи).
🔹 Гибкость CI/CD — можно использовать Linux серверы для сборки iOS приложений.

🔗 Официальный репозиторий Xtool

🔗 Документация

💡 Xtool пока не заменяет Xcode полностью (нет Interface Builder, отладчика), но открывает новые возможности для автоматизации и кросс-платформенных разработки.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥10🤯4
🔢 @ObservedObject в SwiftUI.

@ObservedObject — это property wrapper, который позволяет подписываться на изменения внешнего объекта данных и автоматически обновлять View при их изменении.

🤔 Как использовать:

♣️ Создаем ObservableObject:

class Counter: ObservableObject {
@Published var value = 0
}


♣️ Передаем объект в View (через инициализатор):

struct CounterView: View {
@ObservedObject var counter: Counter

var body: some View {
Button("+1") { counter.value += 1 }
Text("Значение: \(counter.value)")
}
}


♣️ Используем в родительском View:

struct ParentView: View {
@StateObject private var counter = Counter()

var body: some View {
CounterView(counter: counter)
}
}


⚠️ Ключевые особенности:
🔸 Автоматическое обновление: View перерисовывается при изменении @Published свойств.
🔸 Локальная область видимости: работает только для конкретного View, куда передан объект.
🔸 Гибкость: можно передавать между View как обычное свойство.

💡 Для глобальных данных лучше использовать @EnvironmentObject.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥23👍133
😁30👍11🔥4🤔2
👨‍💻 Nutrition Labels в App Store: как рассказать о доступности своего приложения.

Apple добавила в App Store новый раздел с настройками доступности, где разработчики могут отметить, какие функции поддерживает их приложение. Это помогает пользователям с особыми потребностями быстрее находить подходящие программы.

Какие параметры можно указать?
🔹 Скринридер (VoiceOver) — поддержка озвучивания интерфейса.
🔹 Управление голосом (Voice Control).
🔹 Увеличение текста (Dynamic Type).
🔹 Темная тема (Dark Mode).
🔹 Различие не только цветом (не полагается только на цвет для передачи информации).
🔹 Повышенный контраст (для слабовидящих).
🔹 Уменьшение движения (Reduce Motion).
🔹 Субтитры (скрытые титры для видео).
🔹 Аудиоописание (описание визуального контента).

🤔 Как это работает?
Разработчик самостоятельно отмечает в App Store Connect, какие функции доступности реализованы в приложении. Apple не проверяет это автоматически — ответственность лежит на команде.

🔗 Документация

⚠️ Зачем это нужно?
🔸 Пользователи смогут фильтровать приложения по нужным им функциям.
🔸 Разработчики получат дополнительный способ выделить своё приложение.
🔸 Повышение инклюзивности — больше людей смогут комфортно пользоваться приложением.

💡 Где настроить?
→ App Store Connect → [Ваше приложение] → Доступность

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24👀14🔥3
🛒 Командная работа — важный навык.

Ты часто слышишь: «Нам нужны командные игроки». Но что это на самом деле значит?
Это не про бесконечные митинги и формальные отчёты. И уж точно не про работу в одиночку, под эгидой одной компании.

Настоящая командная работа — это:
🔹 Готовность делиться — не только проблемами, но и идеями, знаниями, ресурсами.
🔹 Взаимное уважение — к коллегам, их времени и вкладу в общее дело.
🔹 Поддержка вместо конкуренции — ты не просто «закрываешь свои таски», а помогаешь другим двигаться вперёд.
🔹 Общий результат важнее личных амбиций — успех проекта зависит от всех, а не только от тебя.

«Но у меня мало опыта в больших командах!» — не проблема.
Важно не количество людей вокруг, а твой подход к совместной работе.

🤔 Как показать это на собеседовании?
🔸 На вопросы наподобие «Расскажите о вашей прошлой работе» нужно подробно рассказать о составе прошлой команды, с кем тебе приходилось взаимодействовать.
🔸 На вопросы вроде «Расскажите какие задачи приходилось решать?» нужно обязательно отвечать о совместных с командой достижениях и решенных проблемах и в меньшей степени о единоличных успехах.
🔸 На вопросы «Как ты делал работу команды эффективнее?» желательно отвечать что-то вроде: «Я инициировал ежедневные созвоны, чтобы быстро решать вопросы, предлагал упрощённые решения, которые экономили время всем, и всегда был на связи, если кому-то нужна была помощь».
🔸 Вопрос «Какой был результат вашей работы?» предполагает ответ вроде: «Мы уложились в дедлайн, избежали лишних доработок, и бизнес заказчик остался доволен итогом работы».

⚠️ Дополнительный козырь — менторство.
Если у тебя есть опыт наставничества с джунами, мидлами и другими сотрудниками — не скрывай этого!

💡 Почему это важно?
🔹 Ты не только специалист, но и наставник — можешь развивать команду.
🔹 Ты мыслишь масштабнее — понимаешь, что рост коллег = рост компании.
🔹 Ты умеешь объяснять — а это редкий и ценный навык.

Умение работать с людьми — вот что делает тебя по-настоящему ценным. Настали временна, когда код пишут многие, нужно выделяться и качать софт-скиллы.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍26🔥142👀1
🔢 🏋️ Swift для Android: что задумали разработчики?

Комьюнити Swift официально запускает Android Workgroup — рабочую группу, которая займётся адаптацией языка под разработку для Android.

🤔 Что это значит?
🔹 Swift может стать официально поддерживаемым языком для Android.
🔹 Появится возможность писать нативные приложения на Swift под Android (как это уже делает Apple Music).
🔹 Открытая разработка: любой может присоединиться к обсуждениям и вносить правки.

⚠️ Какие задачи у группы?
🔸 Поддержка Android в дистрибутиве Swift.
🔸 Адаптация Swift пакетов под Android идиомы.
🔸 Интеграция с Java SDK (взаимодействие Swift и Java кода).
🔸 Система CI/CD для тестирования сборки под Android.
🔸 Отладка Swift кода на Android устройствах.

Сообщество может влиять на процесс через форумы Swift. Членство в группе открыто для всех.

💡 Почему это важно?
Если инициатива реализуется, разработчики смогут:
🔹 Использовать один язык (Swift) для iOS и Android.
🔹 Переносить код между платформами с минимальными изменениями.
🔹 Упростить поддержку кроссплатформенных проектов.

Пока рано говорить о сроках, но сам факт создания рабочей группы — большой шаг в сторону универсального Swift.
Будем следить за развитием!

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥29👍10👀4
Для тех кто не знал, в Xcode можно быстро убрать из логов сообщения от любых библиотек или системных процессов.

🤔 Зачем это нужно?
🔸 Чище вывод логов при отладке.
🔸 Не отвлекает лишний шум от сторонних зависимостей.
🔸 Работает даже с системными сообщениями.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍30🔥104
🔢 Как правильно использовать Glass-эффект в Swift.

Главное правило:
Если применяете glassEffect() к кастомным вью — оборачивайте их в общий контейнер (например, HStack или UIView).

ZStack {
HStack {
FirstView()
SecondView()
}
.glassEffect() // Эффект применяется ко всей группе
}

HStack {
ZStack { // Отдельные контейнеры для каждой вью
FirstView()
.glassEffect() // Эффект применяется только к данному вью
}

ZStack { // Отдельные контейнеры для каждой вью
SecondView()
.glassEffect() // Эффект применяется только к данному вью
}
}


⚠️ Почему это важно?
🔸 Glass-эффект анализирует пиксели вокруг себя для создания полупрозрачного размытия.
🔸 Если наложить два эффекта друг на друга — получится грязное наложение (артефакты, мерцание).
🔸 Нативные системные элементы (навигация, тулбары) уже содержат правильную группировку — их не нужно оборачивать.

Когда можно нарушить правило?
🔹 Если используете одиночный glass-элемент без пересечений с другими.
🔹 Для статичного фона (например, картинка под стеклом).

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍24🔥1532
😤 Сильный сотрудник начал сдавать? 8 реальных причин.

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


🔸 Талантливый специалист ≠ хороший руководитель. Если сотрудника повысили, но не научили управленческим навыкам, он может тонуть в задачах, которые раньше решал за час.
🔸 Сильные сотрудники часто берут на себя слишком много — особенно если им не говорят «стоп». Со временем это приводит к ошибкам и апатии.
🔸 Даже топовые специалисты — живые люди. Развод, болезнь, уход за родственником снижают концентрацию.
🔸 Если сотрудник не чувствует поддержки коллег или борется с токсичным окружением, его мотивация падает.
🔸 Рутина убивает амбиции. Если человек не видит развития, он начинает работать «на минимуме».
🔸 Хронический стресс, депрессия, недосып или синдром самозванца снижают продуктивность.
🔸 Если компания резко меняет курс (например, с качества на скорость), принципиальные сотрудники теряют мотивацию.
🔸 Плохое согласование может привести к неэффективной работе сотрудников.

Прежде чем ругать сотрудника, разберитесь в причинах. Часто проблема не в нём, а в системе.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀23👍162🤝2
🔢 Swift 6: Typed Throws — точечная обработка ошибок.

С выходом Swift 6 работа с ошибками стала точнее. Теперь вместо простого throws можно указывать конкретный тип или даже вариант ошибки, что делает код безопаснее и понятнее.

♣️ Раньше функция могла выбросить любую ошибку, и компилятор не проверял её тип:

func readFile(at path: String) throws -> String {
}


♣️ Теперь можно явно указать, какую именно ошибку ожидать:

func readFile(at path: String) throws(FileNotFoundError) -> String {
}


Если функция попытается выбросить другой вариант FileNotFoundError (например FileNotFoundError.whileSearchingFile), компилятор заранее сообщит об ошибке.

🤔 Зачем это нужно?
🔹 Безопасность: компилятор проверяет, что вы ловите именно те ошибки, которые задекларированы.
🔹 Читаемость: из сигнатуры функции сразу видно, что может пойти не так.
🔹 Упрощение кода: больше не нужен «универсальный» catch для всех неизвестных ошибок:

do {
let content = try readFile(at: "path")
} catch FileNotFoundError.whileReadingFile {
print("Файл поврежден")
} catch FileNotFoundError.whileSearchingFile {
print("Ошибка при поиске файла")
}


⚠️ Важно:
🔸 Тип ошибки должен соответствовать протоколу Error.
🔸 Можно указать как общий catch (как было ранее), так и конкретный case из enum.

💡 Вывод:
Typed Throws в Swift 6 — это шаг к предсказуемому и самодокументируемому коду. Меньше скрытых багов, проще отладка!

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥26👍132
🔨 Новый инструмент для оптимизации приложений на SwiftUI.

На WWDC25 Apple представила крупное обновление Xcode 26 и новые инструменты для оптимизации SwiftUI приложений.

Команда Apple Music и разработчики Instruments показали, какие проблемы теперь можно отследить в SwiftUI:
🔹 Лишние обновления View (которые вызывают лаги анимации и скролла).
🔹 Подвисания интерфейса (Hitches).
🔹 Медленные списки (теперь обновляются в 16 раз быстрее).

🤔 Как это работает?
Новый SwiftUI Instrument в Xcode 26 детально показывает:
🔸 Какие View обновляются и почему.
🔸 Как часто происходят ререндеры.
🔸 Time Profiler + Hitches Tool помогают находить узкие места.

Пример из сессии WWDC25:
Мы нашли View, которая обновлялась 300 раз в секунду без причины. После фикса FPS вырос с 40 до 60.

🔗 Подробнее на сайте Apple

💡 Зачем это нужно?
🔹 Ускорение разработки (меньше ждёте загрузку Xcode).
🔹 Энергоэффективность (Power Profiler спасёт батарею пользователей).
🔹 Плавный интерфейс (SwiftUI Instrument избавит от лагов).

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2713🔥2
🔢 Structured Concurrency в Swift: последовательное vs параллельное выполнение задач.

В Swift современный подход к многопоточности: Structured Concurrency — позволяет легко управлять асинхронными операциями, сохраняя читаемость кода. Рассмотрим два ключевых сценария: последовательное и параллельное выполнение.

1️⃣ Последовательное выполнение.
Когда задачи зависят друг от друга или должны выполняться по очереди:

func fetchData() async {
// Сначала загружаем аккаунты, затем задачи
let accounts = await fetchAccounts()
let tasks = await fetchTasks(accounts: accounts)

print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}


⚠️ Особенности:
🔸 Выполняется пошагово: fetchAccounts()fetchTasks()
🔸 Подходит, если второй запрос требует данных из первого.
🔸 Простота отладки (очевидный порядок выполнения).

2️⃣ Параллельное выполнение.
Когда задачи независимы и можно сэкономить время, выполняя их одновременно:

func fetchData() async {
// Параллельный запуск
async let accountsRequest = await fetchAccounts()
async let tasksRequest = await fetchTasks()

// Ожидаем результаты
let (accounts, tasks) = await (accountsRequest, tasksRequest)

print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}


⚠️ Особенности:
🔸 Обе функции запускаются одновременно.
🔸 Общее время выполнения ≈ времени самой долгой задачи.
🔸 async let создает параллельное подзадачи.
🔸 Результаты доступны только после await.

Ключевые принципы Structured Concurrency:

Иерархия задач:
🔹 Родительская задача ждет завершения дочерних (async let).
🔹 Отмена родительской отменяет и дочерние.

Безопасность:
🔹 Компилятор контролирует await, предотвращая deadlock.
🔹 Ошибки распространяются корректно.

Эффективность:
🔹 Система сама решает, сколько потоков использовать.
🔹 Нет ручного управления (DispatchQueue не нужен).

💡 Вывод:
🔸 await — для последовательного кода.
🔸 async let — для параллельных операций.
🔸 Structured Concurrency делает асинхронный код предсказуемым

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

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
26👍13👀1
🇷🇺 🍏 Россия требует от Apple открыть iPhone для RuStore.

Владимир Путин сегодня подписал закон, который обязывает Apple разрешить установку российского магазина приложений RuStore на iPhone.

Теперь производителям запрещено блокировать его загрузку на устройства, продаваемые в России. Если RuStore установлен (даже если вы скачали его сами), Apple не может замедлять его работу, мешать обновлять приложения, ограничивать платежи или ухудшать работу смартфона из-за российского магазина приложений.

Несоблюдение этих правил будет считаться нарушением прав потребителей — это грозит серьезными штрафами.
Закон вступает в силу 1 сентября 2025 года.

📱 Но главное: согласится ли Apple?
Компания всегда строго охраняла свою экосистему, и неизвестно, как она отреагирует на требование открыть iPhone для стороннего магазина.

👨‍💻 Что я думаю?
Лично мне кажется, что Apple всё же разрешит RuStore. Россия — важный рынок, и компания вряд ли захочет рисковать штрафами или уходом с него. Да, их система всегда была закрытой, но ради бизнеса они могут пойти на уступки — как уже делали в других странах.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍172👏2
🔢 NavigationView в SwiftUI: навигация в iOS приложениях.

NavigationView — это основной компонент для организации навигации в SwiftUI приложениях. Он позволяет создавать иерархические переходы между экранами, похожие на стандартные UINavigationController в UIKit.

Основные возможности:
🔹 Стековая навигация (push/pop).
🔹 Автоматическая кнопка "Назад".
🔹 Поддержка заголовков и панелей инструментов.

♣️ Пример использования:

struct MenuView: View {
var body: some View {
NavigationView {
List {
NavigationLink("Первый экран", destination: FirstScreen())
NavigationLink("Второй экран", destination: SecondScreen())
}
.navigationTitle("Главное меню")
}
}
}


⚠️ Ключевые модификаторы:
🔸 navigationTitle - задает заголовок экрана.
🔸 navigationBarItems - добавляет кнопки в панель навигации.
🔸 navigationBarHidden- скрывает панель навигации.

NavigationLink - основной способ перехода между экранами:

NavigationLink(destination: FirstScreen()) {
Text("Первый экран")
}


💡 Советы по использованию:
🔹 Не вкладывайте несколько NavigationView друг в друга.
🔹 Для сложной навигации используйте NavigationStack.
🔹 Помните, что стиль навигации может отличаться на разных платформах (iOS, macOS).

NavigationView значительно упрощает реализацию навигации по сравнению с UIKit, сохраняя при этом привычный пользователям iOS интерфейс.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1911🤝4
🔢 Автоматическое отслеживание изменений с помощью @Observable: магия SwiftUI теперь доступна в UIKit.

С iOS 18 и macOS 15 UIKit получил скрытую фичу, которая меняет правила игры — автоматическое отслеживание изменений данных через @Observable. Больше не нужны ручные вызовы setNeedsLayout() — интерфейс теперь обновляется сам!

🤔 Как это работает?

Помечаем модель макросом @Observable:

import Observation

@Observable
class User {
var name = "Иван"
var unreadMessages = 0
}


Читаем данные в стандартных методах ViewController:

class ProfileVC: UIViewController {
let user = User()

override func viewWillLayoutSubviews() {
super.viewWillLayoutSubviews()

// UIKit автоматически отследит эти изменения
nameLabel.text = user.name
messagesCountLabel.text = "\(user.unreadMessages)"
}
}


Изменяем данные — интерфейс обновится автоматически:

@objc func buttonDidTap() {
// Значение messagesCountLabel обновится автоматически
user.unreadMessages += 1
}


Включаем отслеживание @Observable в Info.plist:

<key>UIObservationTrackingEnabled</key>
<true/>


В iOS 26 это работает из коробки без настройки.

⚠️ Важные нюансы:
🔸 Автоматическое отслеживание изменений работает в viewWillLayoutSubviews(), layoutSubviews() и новом методе updateProperties(), который вызывается перед layoutSubviews для оптимизации.
🔸 Обновление интерфейса после обновления данных возможно только в main thread.
🔸 Важно не забывать про retain cycles, при работе с @Observable.
🔸 Рекомендуется избегать обновление данных без необходимости, так как частое обновление интерфейса может сказаться на производительности приложения.

💡 Вывод:
Теперь UIKit умеет так же удобно обновлять интерфейс, как SwiftUI. Главное — правильно использовать @Observable и не забывать про потокобезопасность.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍229🔥3
✌️ Продажу iPhone могут запретить в России, если Apple не пропустит RuStore.

Буквально недавно обсуждали, что никаких запретов в сторону Apple не ожидается, а вот вам и здравствуйте. В Госдуме сообщили, что в случае отказа Apple содействовать работе российского магазина приложений RuStore на своих устройствах, в отношении компании могут ввести санкции, вплоть до полного запрета продаж iPhone на территории России.

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

Переобулись уж очень быстро 😅

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🗿28🤯12🫡3
🔨 Новый макрос #Playground в Xcode 26: запускаем код без лишних файлов.

С выходом Xcode 26 появился удобный инструмент для быстрого тестирования кода прямо в проекте — макрос #Playground. Теперь не нужно создавать отдельные .playground файлы, чтобы проверить идею.

🤔 Как это работает?

♣️ Добавляем макрос в любой Swift-файл:
import Playgrounds  

#Playground {
let person = Person(name: "Артем")
print(person.name.uppercased())
}

После чего смотрим результат в Canvas (как с SwiftUI превью, пример на изображении).

Плюсы:
🔹 Экономия времени — не нужно переключаться между файлами.
🔹 Тестирование на реальных данных — используете структуры из проекта.
🔹 Несколько превью в одном файле — можно подписать каждое:

#Playground("Проверка имени") {  
print(Person(name: "Анна").name.count)
}


⚠️ Ограничения:
🔸 Требует Xcode 26+ и iOS 18/macOS 15.
🔸 Пока нет поддержки интерактивного редактирования (как в обычных Playgrounds).

💡 Вывод:
#Playground — это лайт-версия Playgrounds прямо в рабочих файлах. Не заменяет полноценные .playground файлы для сложных экспериментов, но идеален для повседневных задач.

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍25🔥126👀1
🔢 WebKit для SwiftUI: новые API для работы с веб-контентом.

На WWDC25 компания Apple представила новые компоненты WebView и WebPage, которые значительно упрощают интеграцию веб-контента в SwiftUI приложения, которые доступны с iOS 18.4.

Что нового?

1️⃣ WebPage: удобная загрузка и управление.
Отслеживание состояния:
@State private var isLoading: Bool = false
@State private var progress: Double = 0.0

WebPage(url: URL(string: "https://t.me/hardworkerIT"))
.onLoadingChanged { loading in
isLoading = loading
}
.onProgressChanged { progress in
self.progress = progress
}


Обработка событий навигации (currentNavigationEvent), таких как ошибки, перенаправления, завершение загрузки.

2️⃣ Сохранение контента.
Теперь есть возможность сохранения веб-контента в следующих форматах:
🔹 Снимки экрана (PNG/JPEG).
🔹 PDF.
🔹 Веб-архивы (полное сохранение страницы).
WebPage(url: someURL)
.saveSnapshot(as: .pdf) { result in
switch result {
case .success(let data):
// Сохраняем PDF
case .failure(let error):
print("Ошибка: \(error)")
}
}


3️⃣ WebArchiveView — просмотр сохранённых веб-страниц.
Есть возможность отображения сохраненных страниц:
WebArchiveView(data: archivedData)


4️⃣ Дополнительные возможности:
🔹 Скролл к определённому элементу на странице.
🔹 Расширенное взаимодействие с JavaScript.
🔹 Кастомные обработчики для ссылок и форм.

🤔 Зачем это нужно?
🔸 Проще, чем WKWebView — не нужно писать обёртки для SwiftUI.
🔸 Нативные состояния загрузки — больше никаких кастомных индикаторов.
🔸 Готовые решения для экспорта и архивирования.

⚠️ Ограничения:
🔹 Требуется iOS 18.4+ / macOS 15.4+.
🔹 Для сложных сценариев (например, кастомные схемы URL) всё ещё может потребоваться WKWebView.

Больше информации доступно в официальной документации.

💡 Вывод:
Новые API делают работу с веб-контентом в SwiftUI такой же простой, как и с любыми другими вью. Теперь встраивать браузеры, документацию или веб-интерфейсы стало ещё удобнее!

➡️ Подписаться на канал
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥2311👍6👀2