Новый инструмент Xtool позволяет собирать, подписывать и запускать iOS приложения без Xcode. Как отмечает Томас Рикуар, теперь разрабатывать под iOS можно даже на Linux или Windows — достаточно минимального Swift пакета.
🔸 Открытый билдчейн с полным контролем над процессом сборки.
🔸 Поддержка кроссплатформенной разработки (macOS / Linux / Windows).
🔸 Работает с чистыми Swift пакетами — без Storyboard и xcodeproj.
🔹 Больше не нужен Xcode для базовых задач.
🔹 Сборка на любом ПК — даже без Mac (если есть сертификаты подписи).
🔹 Гибкость CI/CD — можно использовать Linux серверы для сборки iOS приложений.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍23🔥10🤯4
@ObservedObject в SwiftUI.@ObservedObject — это property wrapper, который позволяет подписываться на изменения внешнего объекта данных и автоматически обновлять View при их изменении.
class Counter: ObservableObject {
@Published var value = 0
}
struct CounterView: View {
@ObservedObject var counter: Counter
var body: some View {
Button("+1") { counter.value += 1 }
Text("Значение: \(counter.value)")
}
}
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👍13❤3
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🔥14❤2👀1
Комьюнити 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🔥10✍4
Главное правило:
Если применяете 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🔥15✍3❤2
Одна из самых сложных управленческих дилемм возникает, когда человек, который должен брать на себя все больше и справляться с этим лучше с каждым днем, вместо этого лажает или просто плохо выполняет свою работу.
🔸 Талантливый специалист ≠ хороший руководитель. Если сотрудника повысили, но не научили управленческим навыкам, он может тонуть в задачах, которые раньше решал за час.
🔸 Сильные сотрудники часто берут на себя слишком много — особенно если им не говорят «стоп». Со временем это приводит к ошибкам и апатии.
🔸 Даже топовые специалисты — живые люди. Развод, болезнь, уход за родственником снижают концентрацию.
🔸 Если сотрудник не чувствует поддержки коллег или борется с токсичным окружением, его мотивация падает.
🔸 Рутина убивает амбиции. Если человек не видит развития, он начинает работать «на минимуме».
🔸 Хронический стресс, депрессия, недосып или синдром самозванца снижают продуктивность.
🔸 Если компания резко меняет курс (например, с качества на скорость), принципиальные сотрудники теряют мотивацию.
🔸 Плохое согласование может привести к неэффективной работе сотрудников.
Прежде чем ругать сотрудника, разберитесь в причинах. Часто проблема не в нём, а в системе.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👀23👍16❤2🤝2
С выходом 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👍13❤2
На 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.
🔹 Ускорение разработки (меньше ждёте загрузку Xcode).
🔹 Энергоэффективность (Power Profiler спасёт батарею пользователей).
🔹 Плавный интерфейс (SwiftUI Instrument избавит от лагов).
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
👍27❤13🔥2
В Swift современный подход к многопоточности: Structured Concurrency — позволяет легко управлять асинхронными операциями, сохраняя читаемость кода. Рассмотрим два ключевых сценария: последовательное и параллельное выполнение.
Когда задачи зависят друг от друга или должны выполняться по очереди:
func fetchData() async {
// Сначала загружаем аккаунты, затем задачи
let accounts = await fetchAccounts()
let tasks = await fetchTasks(accounts: accounts)
print("Аккаунты: \(accounts)")
print("Задачи: \(tasks)")
}
🔸 Выполняется пошагово: fetchAccounts() → fetchTasks()
🔸 Подходит, если второй запрос требует данных из первого.
🔸 Простота отладки (очевидный порядок выполнения).
Когда задачи независимы и можно сэкономить время, выполняя их одновременно:
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.
Иерархия задач:
🔹 Родительская задача ждет завершения дочерних (async let).
🔹 Отмена родительской отменяет и дочерние.
Безопасность:
🔹 Компилятор контролирует await, предотвращая deadlock.
🔹 Ошибки распространяются корректно.
Эффективность:
🔹 Система сама решает, сколько потоков использовать.
🔹 Нет ручного управления (DispatchQueue не нужен).
🔸 await — для последовательного кода.
🔸 async let — для параллельных операций.
🔸 Structured Concurrency делает асинхронный код предсказуемым
Используйте эти подходы, чтобы оптимизировать работу с сетью, базами данных или тяжелыми вычислениями.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
❤26👍13👀1
Владимир Путин сегодня подписал закон, который обязывает Apple разрешить установку российского магазина приложений RuStore на iPhone.
Теперь производителям запрещено блокировать его загрузку на устройства, продаваемые в России. Если RuStore установлен (даже если вы скачали его сами), Apple не может замедлять его работу, мешать обновлять приложения, ограничивать платежи или ухудшать работу смартфона из-за российского магазина приложений.
Несоблюдение этих правил будет считаться нарушением прав потребителей — это грозит серьезными штрафами.
Закон вступает в силу 1 сентября 2025 года.
Компания всегда строго охраняла свою экосистему, и неизвестно, как она отреагирует на требование открыть iPhone для стороннего магазина.
Лично мне кажется, что Apple всё же разрешит RuStore. Россия — важный рынок, и компания вряд ли захочет рисковать штрафами или уходом с него. Да, их система всегда была закрытой, но ради бизнеса они могут пойти на уступки — как уже делали в других странах.
Мобильный трудоголик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥24👍17❤2👏2
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
👍19❤11🤝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
👍22❤9🔥3
Буквально недавно обсуждали, что никаких запретов в сторону 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 файлы, чтобы проверить идею.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🔥12❤6👀1
На WWDC25 компания Apple представила новые компоненты WebView и WebPage, которые значительно упрощают интеграцию веб-контента в SwiftUI приложения, которые доступны с iOS 18.4.
Отслеживание состояния:
@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), таких как ошибки, перенаправления, завершение загрузки.
Теперь есть возможность сохранения веб-контента в следующих форматах:
🔹 Снимки экрана (PNG/JPEG).
🔹 PDF.
🔹 Веб-архивы (полное сохранение страницы).
WebPage(url: someURL)
.saveSnapshot(as: .pdf) { result in
switch result {
case .success(let data):
// Сохраняем PDF
case .failure(let error):
print("Ошибка: \(error)")
}
}
Есть возможность отображения сохраненных страниц:
WebArchiveView(data: archivedData)
🔹 Скролл к определённому элементу на странице.
🔹 Расширенное взаимодействие с 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
🔥23❤11👍6👀2