Assembler for Swift developers
Статья про ассемблер для разработчиков на Swift. Вы спросите: зачем❓
💡 В целом сейчас вы не будете это применять (с вероятностью 98%). Однако понимание самого процесса может оказаться весьма полезным для последующей работы, например, для разбора багов перформанса с не очень читаемым стектрейсом.
1️⃣ Это первая из трёх статей, посвящённых разбору процесса взаимодействия высокоуровневых языков с ассемблером.
👀 В этой части вы разберёте
Статья про ассемблер для разработчиков на Swift. Вы спросите: зачем
Hello, Assembly!
под macOS
на C
, узнаете про используемые регистры на Apple Silicon (Arm64)
и посмотрите на системные вызовы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
How to use the @available attribute in Swift
⚠️ Атрибут
✏️ Первый аргумент указывает платформу, а остальные могут включать
⚙️ Для выполнения кода на старых версиях можно использовать проверку
ℹ️ Если используется только аргумент
@available
позволяет определять доступность функций и типов на конкретных платформах или версиях Swift, что полезно при устаревании API или изменении методов.unavailable
, introduced, deprecated, obsoleted, message
и renamed
для управления доступностью кода.if #available
, чтобы условно выполнять код в зависимости от версии платформы.introduced
, можно применять сокращенный синтаксис, что упрощает запись атрибутов доступности.if #available(iOS 17.0, *) {
// Content is available here
} else {
// Fallback to some other code
}
@available(swift 5.10)
@available(iOS 17.0)
struct Content {
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5❤2
Streaming changes with Observations
Вы до сих пор используете Combine? Тогда мы идем к вам 🫵
Ну а если без шуток - речь про фреймворк Observation, который, по сути, заменяет Combine.
👀 Тип
🔗 Этот тип группирует обновления, что позволяет избежать избыточных эмиссий при изменении нескольких свойств одновременно.
⚙️ Автор представляет расширение для протокола
Вы до сих пор используете Combine? Тогда мы идем к вам 🫵
Ну а если без шуток - речь про фреймворк Observation, который, по сути, заменяет Combine.
Observations
соответствует протоколу AsyncSequence
, что позволяет использовать его в асинхронных циклах for-await
, упрощая работу с изменениями состояния.Observable
, позволяющее легко создавать асинхронные последовательности для определенных ключевых путей.extension Observable {
func stream<Value: Sendable>(
of keyPath: KeyPath<Self, Value>
) -> any AsyncSequence<Value, Never> {
Observations {
self[keyPath: keyPath]
}
}
}
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Swift 6: Sendable, @unchecked Sendable, @Sendable, sending and nonsending
Прочитав заголовок, кто-то может задаться вопросом: wtf?😐
Но это реалии Swift 6. А в статье автор пытается разобраться со всем этим - в конце даже отличная таблица сравнение.
Вот несколько моментов:
➡️
➡️
➡️
➡️
➡️
Прочитав заголовок, кто-то может задаться вопросом: wtf?
Но это реалии Swift 6. А в статье автор пытается разобраться со всем этим - в конце даже отличная таблица сравнение.
Вот несколько моментов:
Sendable
— это протокол, который позволяет компилятору проверять, может ли тип безопасно передаваться между изоляционными доменами, с автоматическим выводом соответствия для простых типов. @unchecked Sendable -
Используется для типов, безопасность которых была обеспечена другими механизмами, позволяя разработчикам обойти проверки компилятора, но требует осторожности, чтобы не злоупотреблять этой возможностью.@Sendable -
для замыканий указывает, что замыкание может безопасно передаваться между изоляционными доменами, с проверкой безопасности на этапе компиляции.sending -
позволяет передавать объекты без проверки на Sendable
, но гарантирует, что переданный объект не будет использоваться повторно после передачи.nonsending
- используется с nonisolated
для указания, что асинхронный метод должен наследовать изоляцию вызывающего контекста, а не выходить за его пределы.Please open Telegram to view this post
VIEW IN TELEGRAM
👍1👎1
Default Actor Isolation: New Problems from Good Intentions
🆕 Swift 6.2 приносит долгожданное улучшение —
Основные идеи и эффекты нового механизма:
➡️ До Swift 6.2 неаннотированный код считался nonisolated, что приводило к множеству предупреждений и ошибок при строгой проверке конкурентности, особенно когда код на самом деле всегда выполнялся на главном потоке.
➡️
➡️ В Xcode 26 новые проекты получают эту настройку по умолчанию, а для старых нужно включать ее вручную в настройках компилятора или в Swift Package Manager через
➡️
➡️ Важно аккуратно использовать nonisolated и
❓ Новый подход снижает шум ошибок при миграции на Swift 6 и стимулирует более корректное использование модульного дизайна и конкурентного программирования.
Default Actor Isolation
, которое меняет подход к конкурентности в Swift. Теперь по умолчанию весь код таргета изолируется на @MainActor
, если явно не указано иное. Это снижает количество boilerplate-кода с аннотациями @MainActor
и Sendable
, упрощая жизнь разработчикам в UI-ориентированных проектах.Основные идеи и эффекты нового механизма:
Default Actor Isolation
меняет это поведение: теперь такой код автоматически считается изолированным на @MainActor
.defaultIsolation(MainActor.self)
nonisolated
сохраняется как способ явного выхода из изоляции, но меняет семантику — асинхронные nonisolated
функции уже не “сбрасывают” изоляцию, а наследуют ее от вызывающего контекста. @concurrent
, особенно в сложных многопоточных сценариях.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤2
What's New in UIKit
Принес вам супер лонг рид про нововведение в UIKit в 26 iOS. 64 минуты на чтение - самое то на выходных🍷
Вот основные моменты и темы, освещённые в статье:
➡️ Обновления
➡️ Новые визуальные эффекты и компоненты: введён новый класс
➡️ Поддержка HDR-цветов: в
➡️ Расширена система меню с новыми методами для тонкой настройки главного меню iPadOS и контекстных меню, а также поддержкой фокусного выбора меню.
➡️ новые свойства для
➡️ новый класс
Принес вам супер лонг рид про нововведение в UIKit в 26 iOS. 64 минуты на чтение - самое то на выходных
Вот основные моменты и темы, освещённые в статье:
UIAction
и UIApplicationDelegate
: добавлены новые идентификаторы действий и происходит постепенный отход от UIApplicationDelegate
в пользу более современных UISceneDelegate
и UIWindowSceneDelegate
UIGlassEffect
с эффектами Liquid Glass
, новые API для сглаживания углов в виде UICornerConfiguration
и UICornerRadius
. Также есть новые опции для кнопок (UIButton.Configuration
и элементов навигационной панели UIBarButtonItem
, включая новые стили, бейджи иконок и поведение.UIColor
и связанных компонентах появляются конструкторы и свойства для работы с HDR, а в UIColorPickerViewController
добавлен HDR-лайтбокс.UINavigationItem
позволяют задавать комплексные атрибуты титулов и подзаголовков, улучшена работа жестов для интерактивного закрытия экранов и размещения поисковых панелей.UIScrollEdgeEffect
позволяет контролировать эффекты на краях скроллов, а появилось также взаимодействие UIScrollEdgeElementContainerInteraction
для кастомных элементов.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Getting access to the user’s calendar
🗓 Для работы с календарем и напоминаниями пользователей используется фреймворк
🔴 Перед доступом к календарю необходимо получить разрешение от пользователя, используя ключи конфиденциальности в настройках проекта:
🖥 Для запроса доступа к событиям и напоминаниям используются методы
⚠️ Текущий статус авторизации можно проверить с помощью метода
➡️ Рекомендуется создать отдельный класс, например
EventKitt
, который предоставляет все необходимые инструменты для создания и получения событий.Privacy - Calendars Full Access Usage Description
и Privacy - Reminders Full Access Usage Description
.requestFullAccessToEvents
и requestFullAccessToReminders
, а также requestWriteOnlyAccessToEvents
для приложений, которые не требуют чтения календаря.authorizationStatus(for:)
, который возвращает значения EKAuthorizationStatus
, такие как fullAccess
, writeOnly
, denied
, notDetermined
и restricted
.CalendarPermissionsViewModel
, для управления статусом доступа к календарю и напоминаниям, а также для обработки запросов на доступ.Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
Inspect & optimize Image Decoding timing in iOS
⌛ Декодирование изображений в iOS происходит в основном потоке во время фазы коммита
⚙️ Используйте методы UIKit, такие как
➡️ Старайтесь использовать
⚠️ Использование API
Core Animation
, что может вызывать зависания приложения при работе с большими изображениями.prepareForDisplay
и prepareThumbnail
, для предварительной обработки изображений в фоновом режиме, чтобы избежать задержек в основном потоке.ImageIO
для создания уменьшенных изображений перед дальнейшей обработкой и избегайте копирования изображений между основной и графической памятью для повышения производительности.UIImageReader
в iOS 17 может привести к утечкам памяти, которые были исправлены в iOS 18.Getting HDR UIImage in iOS 17 and display it in a UIImageView will result in major memory leak internally. Apple have fixed this issue on iOS 18
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
High Level Anatomy of a Camera Capturing Session
❓ Камера или микрофон служат источником для захвата видео, фото или аудио, включая заднюю и фронтальную камеры.
ℹ️ Выход может быть в виде фото или видео, которые сохраняются на диске или обрабатываются для распознавания лиц и применения фильтров.
➡️
❓ Метод
➡️
AVCaptureSession
является центральным контроллером, который управляет входами, выходами и предварительными слоями для захвата медиа.capturePhoto
асинхронный, что означает, что захват фото занимает время из-за фокусировки и экспозиции.AVCapturePhoto
- это необработанный вывод, PHAsset
- ссылка на изображение в библиотеке, CGImage
- это битовая карта, а Image
в SwiftUI
- визуальное представление.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Certificate Pinning on iOS in Practice
Статья про то, что такое
⚠️ Основная цель реализации
🖥 Certificate pining включает в себя проверку цепочки сертификатов, состоящей из корневого, промежуточного и конечного сертификатов, с акцентом на конечный сертификат для обеспечения безопасности соединения.
ℹ️ Можно пиннить как весь сертификат, так и его отпечаток или открытый ключ, что дает гибкость в управлении сертификатами, особенно при их обновлении.
❗️ Обновление сертификатов может быть неудобным, так как требует обновления приложения. Рекомендуется использовать пиннинг открытого ключа или удаленные обновления сертификатов через такие решения, как
⚙️ Для реализации
Статья про то, что такое
certificate pining
и как его настроить.certificate pining
— защита от атак типа человек посередине
, которые могут позволить злоумышленникам перехватывать данные пользователей и тестировать уязвимости API.CloudKit
.certificate pining
в iOS необходимо использовать URLSessionDelegate
для обработки аутентификационных вызовов и проверки доверенных сертификатов.Please open Telegram to view this post
VIEW IN TELEGRAM