iCloud Drive to chmurowe przechowywanie plików Apple, wbudowane w iOS, macOS i iPadOS do synchronizacji dokumentów między urządzeniami użytkownika. Według danych Apple, 2024, iCloud Drive wykorzystuje CloudKit jako backend do przechowywania plików i automatycznej synchronizacji: zmiany wprowadzone na iPhone natychmiast pojawiają się na Mac i iPad bez działań ze strony użytkownika. Deweloperzy mogą integrować iCloud Drive w aplikacjach poprzez NSDocumentPickerViewController i API Ubiquity.
Najważniejsze
iCloud Drive to chmurowa usługa plików Apple, zapewniająca jedno przechowywanie dokumentów dla wszystkich urządzeń użytkownika autoryzowanych pod jednym Apple ID. Usługa została uruchomiona w 2014 roku wraz z iOS 8 i OS X Yosemite jako zamiennik iCloud Documents.
iCloud Drive różni się od innych chmurowych przechowywań (Google Drive, Dropbox) głęboką integracją z systemem operacyjnym: pliki są wyświetlane bezpośrednio w Finder na macOS i w aplikacji Pliki na iOS, bez konieczności instalowania dodatkowej aplikacji. System automatycznie synchronizuje zawartość w tle, przełączając się między Wi-Fi a siecią komórkową.
Według danych Apple Platform Overview, 2024, iCloud Drive obsługuje wersjonowanie plików do 30 dni, udostępnianie folderów przez iCloud Sharing i integrację z systemowym wyszukiwaniem Spotlight. Deweloperzy uzyskują dostęp do przechowywania przez API NSFileCoordinator i Ubiquity containers.
Ubiquity — termin Apple oznaczający zdolność danych do „bycia wszędzie” (z ang. ubiquitous). W kontekście iCloud Drive jest to mechanizm umożliwiający automatyczną synchronizację plików między wszystkimi urządzeniami użytkownika poprzez chmurowy backend CloudKit.
| Komponent | Opis | Rola |
|---|---|---|
| Ubiquity container | Specjalny katalog aplikacji | Przechowuje pliki do synchronizacji |
| CloudKit | Backend Apple | Zapewnia przechowywanie i synchronizację |
| NSMetadataQuery | Zapytanie systemowe | Śledzi stan plików Ubiquity |
| NSFileVersion | Zarządzanie wersjami | Rozwiązuje konflikty zmian |
Ubiquity container to katalog wewnątrz Sandbox aplikacji oznaczony do synchronizacji. Pliki umieszczone w tym katalogu są automatycznie przesyłane do iCloud Drive i rozpowszechniane na inne urządzenia. Dostęp do kontenera konfiguruje się przez Capabilities w Xcode.
System śledzi status każdego pliku przez NSMetadataQuery: plik może być lokalny (pobrany na urządzenie), zdalny (tylko w chmurze) lub pobierany. Deweloper może programowo zażądać pobrania pliku lub sprawdzić jego dostępność przed otwarciem.
Integracja iCloud Drive zaczyna się od dodania capability iCloud w Xcode i włączenia usługi iCloud Documents. Następnie aplikacja uzyskuje dostęp do Ubiquity container — specjalnego katalogu, którego ścieżka jest zwracana przez 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 zapewnia systemowy UI do wyboru i importu plików z iCloud Drive. Użytkownik widzi standardową przeglądarkę plików z obsługą wyszukiwania, sortowania i wielokrotnego wyboru. Po wybraniu pliku aplikacja otrzymuje jego URL i może pracować z nim przez NSFileCoordinator.
Ważna zasada: podczas pracy z plikami iCloud Drive należy używać NSFileCoordinator do odczytu i zapisu. Gwarantuje to, że plik nie zostanie zmieniony przez inny proces (np. synchronizację) podczas operacji. Zaniedbanie koordynacji może prowadzić do uszkodzenia danych.
Konflikty wersji występują, gdy plik jest zmieniany na dwóch urządzeniach jednocześnie przed zakończeniem synchronizacji. iOS automatycznie wykrywa takie sytuacje przez NSFileVersion i tworzy konfliktujące wersje, które użytkownik lub aplikacja muszą rozwiązać.
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 przechowuje historię zmian pliku do 30 dni. Każda wersja zawiera URL, datę utworzenia i identyfikator urządzenia, które utworzyło wersję. System automatycznie oznacza wersje jako konfliktujące, gdy dwa urządzenia wysyłają zmiany z tym samym podstawowym identyfikatorem.
Strategie rozwiązywania: aplikacja może automatycznie scalać zmiany (dla obsługiwanych formatów), pokazywać użytkownikowi wybór wersji lub stosować strategię „ostatni piszący” (last-writer-wins). Apple zaleca dla tekstowych i strukturyzowanych danych używanie automatycznego scalania, a dla formatów binarnych — pokazywanie użytkownikowi konfliktujących wersji.
Darmowe przechowywanie iCloud wynosi 5 GB, rozdzielanych między wszystkie usługi użytkownika: kopie zapasowe, zdjęcia, pocztę i iCloud Drive. Płatne plany zaczynają się od 50 GB i sięgają do 12 TB. Dla aplikacji z intensywną wymianą plików krytyczne jest uwzględnienie tych limitów.
Optymalizacja przechowywania: iOS zapewnia mechanizm zwalniania plików (eviction) — gdy kończy się lokalne miejsce, system może usunąć buforowane kopie plików iCloud Drive, pozostawiając tylko metadane. Przy próbie otwarcia takiego pliku system automatycznie pobiera go z chmury. Deweloper może kontrolować ten proces przez NSFileCoordinator i sprawdzać status pliku przez NSMetadataUbiquitousItemDownloadingStatusKey.
Według danych WWDC 2022, Apple zaleca następujące praktyki optymalizacji iCloud Drive: przechowywać w Ubiquity container tylko dokumenty użytkownika, a nie pamięć podręczną aplikacji; używać asynchronicznego pobierania z wskaźnikiem postępu; dostarczać użytkownikowi informację o rozmiarze plików przed pobraniem; zaimplementować obsługę wznawiania dla dużych plików.
Kluczowy niuans: usunięcie pliku z Ubiquity container powoduje jego usunięcie ze wszystkich urządzeń użytkownika. Do plików tymczasowych używaj lokalnego katalogu Documents, a nie Ubiquity container. Należy również uwzględnić, że synchronizacja nie jest natychmiastowa — opóźnienie może wynosić od kilku sekund do minut w zależności od rozmiaru pliku i sieci.
Często zadawane pytania
iCloud Drive to chmurowe przechowywanie plików Apple, synchronizujące dokumenty między iPhone, iPad, Mac i PC. Jest zintegrowane z Finder i aplikacją Pliki, umożliwiając pracę z dokumentami bez dodatkowych aplikacji.
Synchronizacja działa przez CloudKit: pliki z Ubiquity container aplikacji są automatycznie przesyłane do chmury i rozpowszechniane na inne urządzenia użytkownika. System używa NSMetadataQuery do śledzenia statusu i NSFileCoordinator do bezpiecznego dostępu.
Dodaj capability iCloud w Xcode, włącz usługę iCloud Documents i użyj FileManager.url(forUbiquityContainer:) do uzyskania ścieżki do synchronizowanego katalogu. Do wyboru plików użyj NSDocumentPickerViewController.
iOS tworzy konfliktujące wersje przez NSFileVersion. Deweloper może automatycznie scalić zmiany lub pokazać użytkownikowi wybór. System przechowuje wersje do 30 dni i automatycznie oznacza konflikty przy jednoczesnych zmianach z różnych urządzeń.
Za darmo dostępne jest 5 GB na wszystkie usługi iCloud. Płatne plany: 50 GB, 200 GB, 2 TB, 6 TB i 12 TB. Dla dużych plików zaimplementuj obsługę wznawiania i sprawdzaj dostępne miejsce przed zapisem.
Podsumowanie
Opracujemy aplikację mobilną pod klucz
IT Sectr tworzy aplikacje na iOS i Androida dla startupów i firm od 2017 roku. Doradzimy Ci i zaproponujemy najlepsze rozwiązanie.
Przeczytaj również