Prompting users to review your app
🟢 Количество отзывов и их оценки критически важны для успеха вашего приложения в App Store, так как они влияют на алгоритмы рекомендаций и доверие пользователей.
✔️ Используйте
➡️ Запрашивайте отзывы в конце успешных действий, избегая запроса сразу после запуска приложения или в ответ на действия пользователя.
➡️ Используйте
RequestReviewAction из StoreKit 2, чтобы запрашивать отзывы у пользователей до трех раз в год, избегая прерывания их работы в приложении.ReviewPromptManager для отслеживания, когда последний раз запрашивался отзыв, чтобы избежать повторных запросов для одной и той же версии приложения.private func presentReview() {
guard ReviewPromptManager.shared.canRequestReview() else { return }
Task {
try? await Task.sleep(for: .seconds(2))
await requestReview()
ReviewPromptManager.shared.markReviewRequested()
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍6❤2🔥2
MainActorMessage & AsyncMessage: Concurrency-safe notifications
🆕 Apple представила новые протоколы
📣 Старый способ наблюдения за уведомлениями вызывает предупреждения о потокобезопасности, даже если они обрабатываются в главном потоке, из-за неявной изоляции.
ℹ️ Использование новых API позволяет избежать предупреждений о потокобезопасности и упрощает код, делая его более читаемым и безопасным.
ℹ️ Протокол
MainActorMessage и AsyncMessage, которые обеспечивают потокобезопасные уведомления, доступные с iOS и macOS 26+. AsyncMessage позволяет отправлять уведомления асинхронно из любого контекста изоляции, что улучшает гибкость обработки уведомлений.struct RecentBuildsChangedMessage: NotificationCenter.AsyncMessage {
typealias Subject = [RecentBuild]
let recentBuilds: Subject
}
extension NotificationCenter.MessageIdentifier where Self == NotificationCenter.BaseMessageIdentifier<RecentBuildsChangedMessage> {
static var recentBuildsChanged: NotificationCenter.BaseMessageIdentifier<RecentBuildsChangedMessage> {
.init()
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍3❤2
How to perform a lightweight migration in Core Data
➡️ Легкая миграция в
🖥 Для выполнения легкой миграции необходимо: включить миграцию, создать новую версию модели и внести изменения в новую модель.
⚠️ При использовании
ℹ️ Создайте новую версию модели через Xcode, чтобы избежать ошибок несовместимости при изменении существующей модели.
ℹ️
Core Data позволяет автоматически переносить совместимые изменения в модели без потери данных.NSPersistentContainer легкая миграция активируется автоматически. Для ручной настройки используйте параметры NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption.Core Data поддерживает изменения, такие как добавление, переименование или удаление сущностей и атрибутов, а также изменение типов отношений.Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
GSoC 2025 Showcase: Improved Code completion for Swift
🆕 Если вы вдруг пропустили - проект улучшает отображение документации во время автозаполнения кода в
🖥 Основная цель проекта - показать полную документацию для элементов автозаполнения и реализовать поддержку запроса помощи по сигнатурам, показывая доступные перегрузки и их документацию.
🔥 Успешно реализовано извлечение полной документации по запросу и значительная часть поддержки помощи по сигнатурам, что улучшает опыт работы в редакторах, таких как
❓ Признавайтесь, а вы уже пишите под
SourceKit-LSP, позволяя видеть полную документацию вместо кратких аннотаций.VS Code и Neovim.Swift на VS Code или планируете?Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
Building Peer-to-Peer Sessions: Sending and Receiving Data with Multipeer Connectivity
❓ Для начала работы с
➡️ Данные отправляются с помощью метода
➡️ Для отслеживания изменений состояния сессии необходимо реализовать протокол
➡️ Метод
❓ Для приглашения другого устройства в сессию используется метод
Multipeer Connectivity необходимо создать объект MCPeerID для идентификации устройства и MCSession для установления канала связи между устройствами.send(_:toPeers:with:), где строка сообщения преобразуется в формат Data с кодировкой UTF-8. Обработка ошибок обязательна для успешной передачи.MCSessionDelegate, который позволяет реагировать на изменения состояния подключенных пиров и получать данные.session(_:didReceive:fromPeer:) используется для обработки полученных данных, которые преобразуются обратно в строку и добавляются в массив полученных сообщений.invitePeer(_:using:), который позволяет отправить приглашение на подключение.Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Меня снова спросили за Optional
Очередная база🤩
➡️ Опционалы представляют собой перечисление с двумя кейсами:
✔️ Для инициализации опционалов без использования кейсов необходимо подписать их под протоколы
⚠️ Наиболее популярный способ распаковки опционалов — это оператор
ℹ️ Для реализации сравнения опционалов необходимо сначала реализовать протокол
Очередная база
.none и .some(T), что позволяет создавать универсальные контейнеры для различных типов данных.ExpressibleByNilLiteral и ExpressibleByIntegerLiteral, что позволяет использовать nil и литералы напрямую.nil-coalescing (??), который позволяет подставить значение по умолчанию, если опционал пустой.Equatable, а затем Comparable, что позволяет использовать операторы равенства и сравнения.enum MyOptional<T> {
case none
case some(T)
}
extension MyOptional: ExpressibleByIntegerLiteral where T == Int {
init(integerLiteral value: Int) {
self = .some(value)
}
}
extension MyOptional {
static func ?? (optional: MyOptional<T>, defaultValue: @autoclosure () -> T) -> T {
switch optional {
case .none:
return defaultValue()
case let .some(unwrappedValue):
return unwrappedValue
}
}
}Please open Telegram to view this post
VIEW IN TELEGRAM
👍1