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 контейнери.
Ubiquity — термін Apple, що означає здатність даних «бути присутніми всюди». У контексті 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 року. Ми проконсультуємо вас і запропонуємо найкраще рішення.
Читайте також