iCloud Drive — это облачное файловое хранилище Apple, встроенное в iOS, macOS и iPadOS для синхронизации документов между устройствами пользователя. По данным Apple, 2024, iCloud Drive использует CloudKit в качестве бэкенда для хранения файлов и автоматической синхронизации: изменения, сделанные на iPhone, мгновенно отражаются на Mac и iPad без действий со стороны пользователя. Разработчики могут интегрировать iCloud Drive в приложения через NSDocumentPickerViewController и API Ubiquity.
Главное
iCloud Drive — это облачный файловый сервис Apple, предоставляющий единое хранилище документов для всех устройств пользователя, авторизованных под одним Apple ID. Сервис запущен в 2014 году вместе с iOS 8 и OS X Yosemite как замена iCloud Documents.
iCloud Drive отличается от других облачных хранилищ (Google Drive, Dropbox) глубокой интеграцией с операционной системой: файлы отображаются прямо в Finder на macOS и в приложении Файлы на iOS, без необходимости устанавливать дополнительное приложение. Система автоматически синхронизирует содержимое в фоне, используя переключение между Wi-Fi и сотовой сетью.
По данным Apple Platform Overview, 2024, iCloud Drive поддерживает версионирование файлов до 30 дней, общий доступ к папкам через iCloud Sharing и интеграцию с системным поиском Spotlight. Разработчики получают доступ к хранилищу через API NSFileCoordinator и Ubiquity containers.
Ubiquity — термин Apple, обозначающий способность данных «присутствовать повсюду» (от англ. ubiquitous). В контексте iCloud Drive это механизм, позволяющий файлам автоматически синхронизироваться между всеми устройствами пользователя через облачный бэкенд CloudKit.
| Компонент | Описание | Роль |
|---|---|---|
| Ubiquity container | Специальная директория приложения | Хранит файлы для синхронизации |
| CloudKit | Бэкенд-сервис Apple | Обеспечивает хранение и синхронизацию |
| NSMetadataQuery | Системный запрос | Отслеживает состояние файлов Ubiquity |
| NSFileVersion | Управление версиями | Разрешает конфликты изменений |
Ubiquity container — это директория внутри Sandbox приложения, помеченная для синхронизации. Файлы, помещённые в эту директорию, автоматически загружаются в iCloud Drive и распространяются на другие устройства. Доступ к контейнеру настраивается через Capabilities в Xcode.
Система отслеживает статус каждого файла через NSMetadataQuery: файл может быть локальным (загружен на устройство), удалённым (только в облаке) или загружаемым. Разработчик может программно запросить загрузку файла или проверить его доступность перед открытием.
Интеграция iCloud Drive начинается с добавления capability iCloud в Xcode и включения сервиса iCloud Documents. После этого приложение получает доступ к Ubiquity container — специальной директории, путь к которой возвращается через FileManager.
import UIKit
class DocumentManager {
func ubiquityURL() -> URL? {
return FileManager.default
.url(forUbiquityContainer: nil)
}
func saveToICloud(data: Data, filename: String) {
guard let containerURL = ubiquityURL() else { return }
let fileURL = containerURL
.appendingPathComponent(filename)
do {
try data.write(to: fileURL)
Logger.storage.info(
"Saved \(filename) to iCloud Drive"
)
} catch {
Logger.storage.error(
"Save failed: \(error.localizedDescription)"
)
}
}
func listICloudFiles() {
let query = NSMetadataQuery()
query.searchScopes = [NSMetadataQueryUbiquitousDocumentsScope]
query.start()
}
}
NSDocumentPickerViewController предоставляет системный UI для выбора и импорта файлов из iCloud Drive. Пользователь видит стандартный браузер файлов с поддержкой поиска, сортировки и множественного выбора. После выбора файла приложение получает его URL и может работать с ним через NSFileCoordinator.
Важное правило: при работе с файлами iCloud Drive необходимо использовать NSFileCoordinator для чтения и записи. Это гарантирует, что файл не будет изменён другим процессом (например, синхронизацией) во время операции. Пренебрежение координацией может привести к повреждению данных.
Конфликты версий возникают, когда файл изменяется на двух устройствах одновременно до завершения синхронизации. iOS автоматически обнаруживает такие ситуации через NSFileVersion и создаёт конфликтующие версии, которые пользователь или приложение должны разрешить.
func resolveConflicts(for fileURL: URL) {
let conflictVersions = NSFileVersion
.unresolvedConflictVersionsOfItem(at: fileURL) ?? []
for version in conflictVersions {
do {
let conflictData = try Data(contentsOf: version.url)
let resolved = mergeData(
original: try Data(contentsOf: fileURL),
conflict: conflictData
)
try resolved.write(to: fileURL)
version.remove()
} catch {
Logger.sync.error(
"Conflict resolution failed: \(error)"
)
}
}
}
NSFileVersion хранит историю изменений файла до 30 дней. Каждая версия содержит URL, дату создания и идентификатор устройства, создавшего версию. Система автоматически помечает версии как конфликтующие, когда два устройства отправляют изменения с одинаковым базовым идентификатором.
Стратегии разрешения: приложение может автоматически мержить изменения (для поддерживаемых форматов), показывать пользователю выбор версии или использовать стратегию «последний пишущий» (last-writer-wins). Apple рекомендует для текстовых и структурированных данных использовать автоматическое слияние, а для бинарных форматов — показывать пользователю конфликтующие версии.
Бесплатное хранилище iCloud составляет 5 ГБ, распределяемых между всеми сервисами пользователя: резервные копии, фото, почта и iCloud Drive. Платные тарифы начинаются от 50 ГБ и доходят до 12 ТБ. Для приложений с интенсивным файловым обменом критично учитывать эти лимиты.
Оптимизация хранения: iOS предоставляет механизм выгрузки файлов (eviction) — когда заканчивается локальное место, система может удалить кэшированные копии файлов iCloud Drive, оставив только метаданные. При попытке открыть такой файл система автоматически загружает его с облака. Разработчик может контролировать этот процесс через NSFileCoordinator и проверять статус файла через NSMetadataUbiquitousItemDownloadingStatusKey.
По данным WWDC 2022, Apple рекомендует следующие практики для оптимизации iCloud Drive: хранить в Ubiquity container только пользовательские документы, а не кэш приложения; использовать асинхронную загрузку с индикацией прогресса; предоставлять пользователю информацию о размере файлов перед загрузкой; реализовать поддержку докачки для больших файлов.
Ключевой нюанс: удаление файла из Ubiquity container приводит к его удалению со всех устройств пользователя. Для временных файлов используйте локальную директорию Documents, а не Ubiquity container. Также учитывайте, что синхронизация не мгновенна — задержка может составлять от нескольких секунд до минут в зависимости от размера файла и сети.
Часто задаваемые вопросы
iCloud Drive — это облачное файловое хранилище Apple, синхронизирующее документы между iPhone, iPad, Mac и PC. Оно интегрировано в Finder и приложение Файлы, позволяя работать с документами без дополнительных приложений.
Синхронизация работает через CloudKit: файлы из Ubiquity container приложения автоматически загружаются в облако и распространяются на другие устройства пользователя. Система использует NSMetadataQuery для отслеживания статуса и NSFileCoordinator для безопасного доступа.
Добавьте capability iCloud в Xcode, включите сервис iCloud Documents и используйте FileManager.url(forUbiquityContainer:) для получения пути к синхронизируемой директории. Для выбора файлов используйте NSDocumentPickerViewController.
iOS создаёт конфликтующие версии через NSFileVersion. Разработчик может автоматически смержить изменения или показать пользователю выбор. Система хранит версии до 30 дней и автоматически помечает конфликты при одновременных изменениях с разных устройств.
Бесплатно предоставляется 5 ГБ на все сервисы iCloud. Платные тарифы: 50 ГБ, 200 ГБ, 2 ТБ, 6 ТБ и 12 ТБ. Для больших файлов реализуйте поддержку докачки и проверяйте доступное место перед записью.
Итоги
Мы разработаем мобильное приложение под ключ
IT Sectr создаёт приложения для iOS и Android для стартапов и бизнеса с 2017 года. Мы проконсультируем вас и предложим наилучшее решение.
Читайте также