Documents Directory „ to katalog w piaskownicy aplikacji iOS przeznaczony do przechowywania danych użytkownika, które powinny być zachowywane między sesjami aplikacji i dostępne dla użytkownika przez iTunes File Sharing oraz iCloud. Według Apple File System Programming Guide (2024) zawartość tego katalogu jest automatycznie uwzględniana w kopii zapasowej iCloud i iTunes, dlatego programista powinien świadomie wybierać, jakie dane umieszczać w Documents. W przeciwieństwie do Caches Directory pliki w Documents nie są usuwane przez system przy braku miejsca „ odpowiedzialność za zarządzanie rozmiarem spoczywa na aplikacji.
Najważniejsze
Documents Directory „ to katalog wewnątrz piaskownicy aplikacji iOS przeznaczony do przechowywania danych użytkownika, które powinny być zachowywane między uruchomieniami i dostępne dla użytkownika. Każda aplikacja otrzymuje własną izolowaną piaskownicę, a Documents jest jednym z kluczowych katalogów obok Caches, tmp i Library.
iOS używa ścisłej piaskownicy (sandbox): aplikacja nie ma dostępu do systemu plików innych aplikacji ani do katalogów systemowych bez specjalnych uprawnień. Documents Directory „ jedyny katalog, którego zawartość użytkownik może przeglądać przez iTunes File Sharing (po włączeniu odpowiedniego klucza UIFileSharingEnabled w Info.plist).
Według danych Apple WWDC 2023 ponad 85% aplikacji w App Store używa Documents Directory do przechowywania co najmniej jednego typu danych użytkownika „ od wyeksportowanych PDF po zapisane pliki gier i wyeksportowane obrazy.
Programista musi zrozumieć: pliki w Documents są automatycznie uwzględniane w kopii zapasowej iCloud i iTunes. Jeśli aplikacja przechowuje w Documents duże ilości danych, które można przywrócić (na przykład pamięć podręczną obrazów lub pliki tymczasowe), doprowadzi to do nieuzasadnionego zużycia miejsca w magazynie iCloud użytkownika.
W Swift ścieżkę do Documents Directory uzyskuje się przez FileManager. Apple zaleca używanie API opartego na URL zamiast string-based dla lepszej zgodności z nowoczesnymi możliwościami iOS.
import Foundation
let fileManager = FileManager.default
guard let documentsURL = fileManager.urls(
for: .documentDirectory,
in: .userDomainMask
).first else { return }
// Utwórz plik w Documents
let fileURL = documentsURL.appendingPathComponent("report.pdf")
let data = Data("Hello, world!".utf8)
try data.write(to: fileURL)
Objective-C używa NSSearchPathForDirectoriesInDomains „ starszego, ale wciąż obsługiwane podejścia, które zwraca ścieżkę jako ciąg znaków zamiast URL.
@import Foundation;
NSArray *paths = NSSearchPathForDirectoriesInDomains(
NSDocumentDirectory,
NSUserDomainMask,
YES
);
NSString *documentsPath = paths.firstObject;
NSString *filePath = [documentsPath stringByAppendingPathComponent:@"report.pdf"];
Nowoczesne projekty w Swift powinny używać FileManager.urls, ponieważ ta metoda zwraca URL, a nie ciąg znaków, co zmniejsza ryzyko błędów z kodowaniem ścieżek i czyni kod bardziej bezpiecznym typowo.
Documents Directory jest przeznaczona dla danych utworzonych przez użytkownika lub potrzebnych użytkownikowi w jawnej formie. Apple wyróżnia kilka kategorii, które warto umieszczać w tym katalogu.
Pliki, które użytkownik tworzy lub importuje „ dokumenty tekstowe, PDF, obrazy, wyeksportowane raporty, pliki kopii zapasowych. Te dane mają bezpośrednią wartość dla użytkownika, a ich utrata byłaby krytyczna.
Sejwy gier, pliki stanu aplikacji, wyeksportowane projekty „ wszystko, co użytkownik oczekuje przywrócić po ponownej instalacji aplikacji. Jednak w przypadku krytycznych danych zaleca się dodatkowo używać iCloud Key-Value Storage lub Core Data z synchronizacją iCloud.
| Typ danych | Odpowiedni dla Documents | Alternatywa |
|---|---|---|
| PDF i dokumenty tekstowe | Tak | „ |
| Pamięć podręczna obrazów | Nie | Caches Directory |
| Sejwy gier | Tak | iCloud KVS |
| Logi i dane debugowania | Nie | Caches lub tmp |
| Wyeksportowane raporty | Tak | „ |
Kluczowe kryterium: jeśli dane mogą zostać przywrócone z sieci lub ponownie utworzone „ ich miejsce jest w Caches, a nie w Documents. Każdy gigabajt w Documents to gigabajt w kopii zapasowej iCloud użytkownika.
iOS automatycznie uwzględnia zawartość Documents Directory w kopii zapasowej podczas podłączenia urządzenia do iTunes lub synchronizacji z iCloud. Tego zachowania nie można wyłączyć na poziomie katalogu „ tylko dla poszczególnych plików przez atrybut NSURLIsExcludedFromBackupKey.
Począwszy od iOS 5.0 Apple zaczęło odrzucać aplikacje, które przechowują w Documents duże ilości danych podlegających przywróceniu. Zalecenie Apple: pliki, które można ponownie pobrać, powinny być przechowywane w Caches Directory z flagą wyłączenia z kopii zapasowej.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
// Wyłącz plik z kopii zapasowej iCloud
var resourceValues = URLResourceValues()
resourceValues.isExcludedFromBackup = true
var fileURL = documentsURL.appendingPathComponent("cached_data.json")
try fileURL.setResourceValues(resourceValues)
Synchronizacja iCloud działa przez NSUbiquitousContainer, jeśli aplikacja używa iCloud Documents. W takim przypadku pliki z Documents Directory są automatycznie synchronizowane między urządzeniami użytkownika. Dla aplikacji bez iCloud synchronizacja jest ograniczona do kopii zapasowej.
Różnica między Documents a Caches „ jedno z najczęstszych nieporozumień wśród początkujących programistów iOS. Główna różnica: system może w każdej chwili usunąć pliki z Caches, aby zwolnić miejsce, ale nigdy nie rusza Documents bez wiedzy użytkownika.
| Charakterystyka | Documents Directory | Caches Directory |
|---|---|---|
| Kopia zapasowa w iCloud | Tak (domyślnie) | Nie |
| Usunięcie przez system | Nigdy | Przy braku miejsca |
| iTunes File Sharing | Tak (po włączeniu flagi) | Nie |
| Przeznaczenie | Dane użytkownika | Pamięć podręczna, dane tymczasowe |
| Przywrócenie danych | Wymaga przywrócenia | Można ponownie pobrać z sieci |
Według Apple Developer Documentation (2024) nieprawidłowe używanie Documents Directory „ jedna z częstych przyczyn odrzucenia aplikacji podczas recenzji: jeśli aplikacja przechowuje w Documents więcej niż kilka megabajtów danych, które można przywrócić, Apple zaleca przeniesienie ich do Caches lub zastosowanie NSURLIsExcludedFromBackupKey.
Praktyczna zasada: jeśli użytkownik będzie zmartwiony utratą pliku „ przechowuj w Documents. Jeśli plik można ponownie pobrać lub wygenerować „ przechowuj w Caches.
Doświadczeni programiści iOS wypracowali kilka zasad, które pomagają uniknąć problemów z Documents Directory na wszystkich etapach cyklu życia aplikacji „ od rozwoju do publikacji w App Store.
Regularnie sprawdzaj rozmiar Documents Directory przez FileManager.enumerator(at:includingPropertiesForKeys:). Jeśli rozmiar przekracza 100 MB dla danych niebędących danymi użytkownika „ to powód do przemyślenia architektury przechowywania.
Dla wszystkich plików, które można ponownie pobrać z sieci, ustaw isExcludedFromBackup = true. Zmniejsza to obciążenie magazynu iCloud użytkownika i zmniejsza ryzyko odrzucenia aplikacji przez App Review.
Przy zmianie formatu danych w Documents przewidz migrację: nie usuwaj starych plików, dopóki nie upewnisz się, że nowe zostały poprawnie utworzone. Używaj podkatalogów specyficznych dla wersji.
import Foundation
let documentsURL = FileManager.default
.urls(for: .documentDirectory, in: .userDomainMask)
.first!
let versionDir = documentsURL.appendingPathComponent("v2")
try FileManager.default.createDirectory(
at: versionDir,
withIntermediateDirectories: true
)
Przestrzeganie tych praktyk zmniejsza ryzyko utraty danych użytkownika, redukuje rozmiar kopii zapasowej iCloud i ułatwia przejście recenzji w App Store.
Często zadawane pytania
Tak, przez Files „ wbudowaną aplikację iOS od wersji 11. Po włączeniu klucza UIFileSharingEnabled w Info.plist zawartość Documents Directory jest wyświetlana w aplikacji Pliki w sekcji „Na moim iPhonie“. Użytkownik może przeglądać, kopiować i usuwać pliki.
Cała piaskownica aplikacji, w tym Documents Directory, Caches, tmp i Library, jest całkowicie usuwana z urządzenia. Kopie zapasowe w iCloud pozostają do momentu przywrócenia lub ręcznego usunięcia. Po ponownej instalacji aplikacja zaczyna z czystą piaskownicą.
Użyj FileManager.enumerator do przejścia wszystkich plików w katalogu i zsumowania ich rozmiarów. Dla każdego pliku uzyskaj atrybut .fileSize przez resourceValues(forKeys:). Alternatywnie użyj URLResourceKey.fileSizeKey i .directoryEnumerationResults.
Domyślnie Core Data tworzy plik SQLite w Library/Application Support, nie w Documents. Przenoszenie bazy do Documents nie jest zalecane „ zostanie uwzględniona w iTunes File Sharing i użytkownik będzie mógł ją przypadkowo usunąć lub zmodyfikować. Wyjątkiem jest sytuacja, gdy aplikacja jawnie daje użytkownikowi dostęp do danych przez Core Data.
UIFileSharingEnabled (Application supports iTunes file sharing) „ klucz boolowski w Info.plist. Po ustawieniu na YES użytkownik może kopiować pliki z Documents Directory przez iTunes i Files. Dodaj klucz do Info.plist: UIFileSharingEnabled = YES. Włączaj tylko jeśli aplikacja rzeczywiście tworzy dokumenty użytkownika.
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ż