Read documents using the Vision framework
Что нового в Vision фреймворке?
🔥 Новый режим распознавания документов в виде таблиц! API
😮 Функция
➡️ Новая модель определения позы руки более компактна и точна, но требует переобучения существующих классификаторов из-за изменения расположения суставов.
#wwdc2025
Что нового в Vision фреймворке?
RecognizeDocumentsRequest
позволяет извлекать структурированную информацию из документов, включая таблицы, списки и машинно-читаемые коды, что упрощает процесс обработки данных.DetectLensSmudgeRequest
определяет, было ли изображение снято с запачканным объективом, используя коэффициент уверенности от 0 до 1, что помогает фильтровать низкокачественные изображения.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2❤1
Android Workgroup
Swift идет в Android🫠
⚡️ Основная цель Android workgroup заключается в добавлении и поддержке Android как официально поддерживаемой платформы для языка Swift. Иными словами можно будет пилить приложения под андроид из Swift.
➡️ Членство в группе открыто для всех желающих, и участники могут общаться через регулярные видеозвонки и форумы Swift.
➡️ Все желающие могут участвовать в обсуждениях, задавать вопросы, сообщать об ошибках и отправлять запросы на изменения в проектах поддержки Android.
А вы что думаете? Идет нормальная замена KMP?🙂
Swift идет в Android
А вы что думаете? Идет нормальная замена KMP?
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥16
Subtle retain cycle is subtle
Отойдем немного от презентации эпл к насущным проблемам. А именно к🔍
➡️ Измените область видимости сильной ссылки, переместив
➡️ Используйте слабую ссылку на
❗️ Использование
Отойдем немного от презентации эпл к насущным проблемам. А именно к
Retain Cycle.
Retain cycle
сложно отследить, и в приведенном примере класс Example создает цикл удержания, который не позволяет deinit выполниться.class Example {
var task: Task<Void, Never>?
init() {
task = Task { [weak self] in
guard let self else { return }
repeat {
performSomeWork()
} while !Task.isCancelled
}
}
func performSomeWork() { }
deinit {
print("deinit")
task?.cancel()
}
}
Автор предлагает несколько решений: guard
внутрь цикла repeat
, чтобы избежать удержания объекта Example
.task = Task { [weak self] in //
repeat { //
guard let self else { return } // - strong reference taken here
performSomeWork() //
} while !Task.isCancelled // - goes out of scope here
}
self
в методе performSomeWork
, чтобы избежать создания retain cycle
.task = Task { [weak self] in
repeat {
self?.performSomeWork()
} while !Task.isCancelled
}
capture group
может не решить проблему, так как методы экземпляра имеют неявную ссылку на self
.Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
What’s new in UIKit
🆕
ℹ️ В iOS 26 представлен новый дизайн с материалом
✏️
➡️
➡️ Введен новый метод
#wwdc2025
UIKit
теперь поддерживает автоматическое отслеживание Observable объектов, что упрощает синхронизацию пользовательского интерфейса без необходимости вручную вызывать setNeedsLayout
.Liquid Glass
, который обновляет стандартные компоненты UIKit
и улучшает навигационные переходы.UIKit
теперь позволяет интегрировать сцены SwiftUI
с помощью нового протокола UIHostingSceneDelegate
, что упрощает совместное использование UIKit
и SwiftUI
в приложениях.UIKit
расширяет поддержку HDR, позволяя создавать HDR цвета и использовать их в UIColorPickerViewController
, что улучшает визуальные эффекты в приложениях.updateProperties
для UIView
и UIViewController
, который позволяет более эффективно обновлять свойства без лишних проходов по макету.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤1
Automatic Observation Tracking in UIKit and AppKit: The Feature Apple Forgot to Mention
А вот и обзор изменений для обновления UI.
🔴 В iOS 18 и macOS 15 добавлено автоматическое отслеживание изменений для
👀 Чтобы активировать автоматическое отслеживание, необходимо добавить ключ
❓ Автоматическое отслеживание работает в методах, таких как
☄️ В iOS 26 добавлены новые методы, такие как
⚠️ Важно учитывать, что отслеживание происходит только в определенных методах, и необходимо следить за безопасностью потоков и возможными утечками памяти.
А вот и обзор изменений для обновления UI.
UIKit
и AppKit
, позволяющее обновлять интерфейс без ручных вызовов методов, таких как setNeedsDisplay()
.UIObservationTrackingEnabled
в Info.plist
для UIKit
и NSObservationTrackingEnabled
для AppKit
.viewWillLayoutSubviews()
и layoutSubviews()
, что упрощает синхронизацию данных и интерфейса.updateProperties()
, которые обеспечивают более эффективное обновление свойств перед layoutSubviews
, улучшая производительность.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Profile and optimize power usage in your app
☄️ Очень крутая сессия про профилирование использования батареи приложением - вся функциональность блекнет на фоне быстро садящегося телефона.
🆕 Используйте
📊 При разработке новых функций сравнивайте влияние различных реализаций на энергопотребление, проводя тесты в разных условиях и усредняя результаты.
⚠️ Включите режим разработчика и
⚙️ Используйте инструменты
#wwdc2025
Power Profiler
в Instruments
для выявления и устранения проблем с энергопотреблением в приложениях, что позволяет улучшить время работы от батареи.Performance Trace
на устройстве, чтобы собирать данные о потреблении энергии в реальных условиях, что помогает выявить проблемы, которые невозможно воспроизвести в процессе разработки.Xcode
, такие как Energy
Gauges
, XCTest
и MetricKit
, для мониторинга и оптимизации энергопотребления на всех этапах разработки и после выпуска приложения.#wwdc2025
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Schedule a countdown timer with AlarmKit
Не стал делать обзор
❓ Он позволяет планировать одноразовые будильники, повторяющиеся будильники и таймеры обратного отсчета, которые работают даже в беззвучном режиме.
⚠️ Перед использованием
⌛ Для настройки таймера необходимо создать объект
🔴 Для отображения текущего обратного отсчета во время работы таймера необходимо настроить
🖥
Не стал делать обзор
AlarmKit
из видео сессии, но сразу принес статью с кучей примеров.AlarmKit
необходимо запросить у пользователя разрешение, добавив ключ NSAlarmKitUsageDescription
в Info.plist
и проверив статус авторизации с помощью API AlarmManager
.AlarmPresentation.Alert
с заголовком и кнопкой остановки, а затем использовать AlarmAttributes
для определения его атрибутов перед вызовом метода schedule() AlarmManager
.Live Activity
, добавив Widget Extension
и используя ActivityConfiguration
для отображения состояния таймера на экране блокировки и в Dynamic Island
.AlarmKit
предоставляет асинхронную последовательность для получения всех активных будильников, что позволяет отображать их в приложении и управлять ими, включая возможность отмены.struct TimerButton: View {
private let manager = AlarmManager.shared
var body: some View {
Button("Start a timer", systemImage: "timer") {
Task {
if await checkForAuthorization() {
await scheduleTimer()
} else {
// Handle unauthorized status
}
}
}
}
private func scheduleTimer() async {
let alert = AlarmPresentation.Alert(
title: "Ready!",
stopButton: AlarmButton(
text: "Done",
textColor: .pink,
systemImageName: "checkmark"
)
)
}
...
}
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4
Swift concurrency. Executors, Actors и их связь с потоками
🖥
💡 Существуют различные типы
➡️ Разработчики могут создавать свои собственные
➡️
➡️ Используя функцию
Swift Concurrency
включает в себя такие ключевые компоненты, как Task
, Job
и Executor
, которые обеспечивают асинхронное выполнение кода и управление потоками.Executors
: Global concurrent executor
, Serial executors
и Main Actor executor
, каждый из которых выполняет задачи по-разному, обеспечивая гибкость в управлении потоками.Executors
, используя протоколы TaskExecutor
и SerialExecutor
, что позволяет им контролировать выполнение задач в своих приложениях.Actors
в Swift
обеспечивают потокобезопасность, выполняя свои методы последовательно, что предотвращает гонки данных и обеспечивает целостность данных.withUnsafeCurrentTask
, разработчики могут определить, какой Executor
используется в данный момент для выполнения асинхронной функции.
@available(iOS 18.0, *)
final class CustomExecutor: TaskExecutor {
func enqueue(_ job: consuming ExecutorJob) {
job.runSynchronously(on: asUnownedTaskExecutor())
}
func asUnownedTaskExecutor() -> UnownedTaskExecutor {
UnownedTaskExecutor(ordinary: self)
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
Ternary operator in Swift explained
Вдруг кто-то не знает про тернарную операцию🫠
❓ Тернарный оператор в Swift позволяет записывать условные выражения в компактной форме, заменяя многословные конструкции if-else на одну строку.
⚙️ Стандартный синтаксис тернарного оператора выглядит как <условие> ? <если истинно> : <если ложно>, например,
➡️ Тернарные выражения полезны для простых проверок, но их следует избегать при сложных или вложенных условиях, чтобы сохранить читаемость кода.
➡️ Тернарные операторы часто используются в модификаторах представлений SwiftUI для условного применения стилей, что делает код более лаконичным.
Вдруг кто-то не знает про тернарную операцию
username.isEmpty ? .gray : .red
.let buttonColor: Color = if username.isEmpty {
.gray
} else {
.red
}
Превращается в
let buttonColor: Color = username.isEmpty ? .gray : .red
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2🤯1
Supporting Universal Links on iOS
🔴 Хороший гайд по работе с универсальными ссылками. Они позволяют пользователям открывать контент вашего приложения через прямые ссылки, обеспечивая более гибкий доступ и возможность делиться контентом.
➡️ Для поддержки универсальных ссылок необходимо иметь сервер, который возвращает корректный JSON-ответ с информацией о приложении и разрешенных путях для ссылок.
➡️ Добавьте
⚙️ Тестируйте универсальные ссылки, открывая их на устройстве; иногда требуется переустановка приложения для корректной работы.
❓ Если пользователь отказывается открывать приложение, предоставьте ему возможность увидеть контент на веб-странице или предложите скачать приложение.
capability
Associated Domains
в проект, указав домен с префиксом applinks:
, чтобы iOS мог проверить права вашего приложения на обработку ссылок.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Power of Swift Macros
Макросы в Swift достаточно удобная штука, если их правильно применять🙂 Например, они позволяют автоматизировать создание представлений SwiftUI для UIKit, упрощая процесс написания повторяющегося кода.
➡️ Для создания макроса необходимо инициализировать новый Swift пакет с помощью команды ➡️ Основной код макроса включает в себя извлечение метаданных из объявления класса и создание структуры SwiftUI, которая реализует протокол
➡️ Тестирование макроса включает проверку различных случаев, таких как наличие модификаторов и правильность обработки классов, не являющихся представлениями UIKit.
Макросы в Swift достаточно удобная штука, если их правильно применять
swift package init --type macro --name RepresentableMacros
UIViewRepresentable
.import SwiftCompilerPlugin
import SwiftSyntax
import SwiftSyntaxBuilder
import SwiftSyntaxMacros
public enum ViewRepresentableError: CustomStringConvertible, Error {
case onlyApplicableToView
public var description: String {
switch self {
case .onlyApplicableToView:
"@ViewRepresentable is only applicable to UIKit View."
}
}
}
public struct ViewRepresentable: PeerMacro {
public static func expansion(
of node: AttributeSyntax,
providingPeersOf declaration: some DeclSyntaxProtocol,
in context: some MacroExpansionContext
) throws -> [DeclSyntax] {
// here will be our magic code
return []
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡3
State of in-app subscriptions 2025
Раньше меня очень вдохновляла возможность создавать свои личные приложения и зарабатывать на них. Я не могу назвать себя трушным и успешным инди разработчиком, который достиг невероятных высот, но веху $1k MRR я пробил.
Одна из самых сложных задач при создании продукта: монетизация, если вы не планируете играть в альтруизм. Ребята, которые делают крутой сервис – Adapty, берущий на себя почти все сложности с монетизацией, выпустили крутой отчет, который закрывает кучу вопросов:
⁃ какую длительность подписки выбрать
⁃ нужен ли триал и что он дает
⁃ на какие страны целиться
⁃ и как сделать лучший пейволл
P.S. Сейчас крутое время, чтобы попробовать создать свой пет-продукт: AI тулы и инструменты, как Adapty, сильно упрощают этот путь. Но конкуренция, конечно же, будет жесткая.
Раньше меня очень вдохновляла возможность создавать свои личные приложения и зарабатывать на них. Я не могу назвать себя трушным и успешным инди разработчиком, который достиг невероятных высот, но веху $1k MRR я пробил.
Одна из самых сложных задач при создании продукта: монетизация, если вы не планируете играть в альтруизм. Ребята, которые делают крутой сервис – Adapty, берущий на себя почти все сложности с монетизацией, выпустили крутой отчет, который закрывает кучу вопросов:
⁃ какую длительность подписки выбрать
⁃ нужен ли триал и что он дает
⁃ на какие страны целиться
⁃ и как сделать лучший пейволл
P.S. Сейчас крутое время, чтобы попробовать создать свой пет-продукт: AI тулы и инструменты, как Adapty, сильно упрощают этот путь. Но конкуренция, конечно же, будет жесткая.
👍7🔥1🙏1
The Anatomy of a LiquidGlass Button in iOS 26
😱 Кнопка
⚙️ Для создания круглой кнопки необходимо обрезать форму кнопки, чтобы эффект стекла правильно отображался при нажатии.
❓ Рекомендуется использовать стиль
⚠️ При изменении цвета кнопки в светлом режиме возникают проблемы, где кнопка не отображает выбранный цвет, оставаясь прежней.
LiquidGlass
в iOS 26
имеет стильный эффект стекла, который можно настроить с помощью модификаторов .glass
и .glassProminent
. borderProminent
с эффектом стекла для лучшего отображения в темном режиме, хотя это все еще может быть немного багованным.Please open Telegram to view this post
VIEW IN TELEGRAM
👎3👍1
Using defer in Swift to manage state cleanup
Раз новое не заходит, вспомним старое🥲
⚡️ В
💡 Использование
❓
➡️ Пример использования defer включает управление индикатором загрузки, который показывается во время выполнения асинхронной операции и скрывается по завершении, что предотвращает пропуск очистки состояния:
Раз новое не заходит, вспомним старое
Swift
оператор defer
позволяет гарантировать выполнение кода очистки при выходе из текущей области видимости, независимо от того, завершилась ли функция успешно или с ошибкой.defer
уменьшает вероятность ошибок в коде, особенно в больших функциях, где могут быть добавлены новые возвраты или отмены задач.Defer
гарантирует выполнение кода очистки в различных сценариях: нормальное завершение функции, выброс ошибки, ранний возврат или отмена задачи во время ожидания.func fetch() async {
isLoading = true
defer { isLoading = false }
do {
articles = try await service.fetchArticles()
} catch {
self.error = error.localizedDescription
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1