2016-03-29 10 views
7

Mam aplikację na iOS w sklepie z aplikacjami, która może pobrać stosunkowo duże pliki, które muszą pozostać na urządzeniu do użytku w trybie offline. Te pliki są obecnie przechowywane w folderze aplikacji Documents, ale właśnie czytam, że utworzono kopię zapasową folderu Documents i należy go używać wyłącznie w przypadku treści generowanych przez użytkowników. This Apple technical Q&A stwierdza, że ​​należy ustawić NSURLIsExcludedFromBackupKey, aby zapobiec tworzeniu kopii zapasowej. This stwierdza, że ​​aplikacja to /Library/Caches jest odpowiednim miejscem do umieszczania tego rodzaju plików, chociaż dalsze czytanie sugeruje, że folder może zostać wyczyszczony, gdy urządzenie ma mało pamięci, co jest niedopuszczalne dla tej aplikacji. Wierzę, że /Library/Application Support/ jest wtedy najlepszą lokalizacją dla nich - czy to brzmi dobrze?Duże pliki pobrane do Dokumentów i z kopią zapasową do iCloud

Niestety, ten błąd przeszedł proces sprawdzania aplikacji. Jakie są najlepsze metody naprawiania tego teraz, gdy użytkownicy korzystają z aplikacji i mają już pewne pliki przechowywane w folderze Documents i ich kopiach zapasowych? Wygląda na to, że muszę przenieść wszystkie istniejące pliki i ustawić ich aktualizację na NSURLIsExcludedFromBackupKey. Jak mogę zagwarantować, że zostanie to zrobione dokładnie raz i że nie zostanie przerwane? Czy przeniesienie plików z folderu Documents jest ważne, czy mogę je tam zostawić? Czy zmiana statusu kopii zapasowej plików spowoduje usunięcie ich z istniejących kopii zapasowych?

Używam Swift 2.1.1 i kieruję na iOS 8.0+.

Odpowiedz

2

Jak napisano w technicznej wersji Q & A, najlepszym rozwiązaniem może być utworzenie podkatalogu w Dokumentach i wykluczenie tego podkatalogu tylko raz.

+0

Dzięki, @Allen. Pliki były już w jednym folderze, więc wykluczyłem je i przeszedłem przegląd aplikacji. Dokumentacja NSURL (https://developer.apple.com/library/ios/documentation/Cocoa/Reference/Foundation/Classes/NSURL_Class/#//apple_ref/doc/constant_group/Common_File_System_Resource_Keys) stwierdza, że ​​"Niektóre operacje zwykle wykonywane do dokumentów użytkownika powoduje, że ta właściwość jest resetowana do wartości false, w związku z tym nie używaj tej właściwości w dokumentach użytkownika ", co mnie dotyczy. Na razie po prostu wykluczam katalog przy każdym uruchomieniu aplikacji, ale nie wydaje mi się to idealne. –

+0

Bez obaw, dotyczy to folderu Dokumenty, a nie podkatalogu, którego będziesz używać, i pamiętaj, że w systemie iOS nikt inny nie będzie miał dostępu do środowiska Twojej aplikacji. – Allen

+0

Jeśli możesz dodać źródło potwierdzające, że możesz pozostawić pliki w folderze Dokumenty i dodać więcej szczegółów do odpowiedzi, na przykład czy zmiana statusu plików spowoduje usunięcie ich z istniejących kopii zapasowych (prawdopodobnie nie?), Mogę zaakceptować odpowiedź. –

2

Nie wierzę, że możesz napisać "Zrób to raz i upewnij się, że to się robi", ponieważ nie możesz zagwarantować, że Twoja aplikacja nie ulegnie awarii podczas działania. Z pewnością możesz ustawić flagę ukończenia, gdy masz pewność, że tak się stanie, że po jej zakończeniu nie będziesz musiał jej ponownie uruchamiać.

Wyklucz swój katalog z kopii zapasowej, a nie z poszczególnych plików. Od Xcode:

Możesz użyć tej właściwości, aby wykluczyć pamięć podręczną i inne pliki obsługi aplikacji, które nie są potrzebne w kopii zapasowej. Niektóre operacje wykonywane zwykle w dokumentach użytkownika powodują resetowanie tej właściwości do wartości false; w związku z tym nie należy używać tej właściwości w dokumentach użytkownika.

Oto strategia Użyłem z dobrymi wynikami (przepraszam, jego w Objective-C - Nie jestem szybki facet Mam nadzieję, że będzie ci się ten pomysł.):

- (BOOL)moveAllFiles{ 

    // Searches through the documents directory for all files ending in .data 
    BOOL success = true; 
    NSString *myNewLocation = @"/store/my/files/here/now"; 

    // Get the documents directory 
    NSArray *documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentDirectory = [documentDirectories objectAtIndex:0]; 

    // Get all files ending in .data (whatever your file type is) 
    NSArray *dataFilesArray = [NSArray arrayWithArray:[NSBundle pathsForResourcesOfType:@"data" inDirectory:documentDirectory]]; 
    // If you have multiple resource types, use this line once each for each resource type, then append the arrays. 

    // Iterate the found files 
    NSString *fileName = [NSString string]; 
    for (int i=0; i<[dataFilesArray count]; i++) { 
     fileName = [[dataFilesArray objectAtIndex:i] lastPathComponent]; 

     // Move file, set success to false if unsuccessful move 
     if (![[NSFileManager defaultManager] moveItemAtPath:[dataFilesArray objectAtIndex:i] 
                toPath:[myNewLocation stringByAppendingPathComponent:fileName] 
                error:nil]) { 
      success = false; // Something went wrong 
     } 
    } 
    return success; 
} 

Teraz użyj wartości sukcesu, aby ustawić klucz w pliku domyślnym użytkownika. Sprawdź ten klucz podczas uruchamiania. Jeśli jest to fałsz (lub brak), uruchom tę procedurę (ponownie).

Ten przykład dotyczy ścieżek plików. Możesz zrobić to samo z adresami URL plików, jeśli chcesz.

+0

Dzięki, @Peter. To, co zrobiłem na razie, jest oznaczony jako folder w katalogu Dokumenty, w którym znajdują się pliki do pobrania, których nie można zarchiwizować. Nie mogę znaleźć ostatecznej odpowiedzi na pytanie, czy muszę przenieść pliki, czy mogę je zostawić w obecnej postaci. Fragment, który cytujesz, mówi "nie korzystaj z tej właściwości w dokumentach użytkownika", ale techniczne pytania i odpowiedzi mówią, że można. Czy znalazłeś jakąś dalszą dokumentację na ten temat? –

+0

Myślę, że to zadziała. Uważam, że oficjalne przykłady są sprzeczne, jeśli chodzi o użycie flagi "nie do tworzenia kopii zapasowych" na plikach, ale biorąc pod uwagę, że powyższy fragment zawierał powód, aby tego nie robić (flaga może być zmieniana przez interakcje użytkownika), myślałem, że byłoby najbardziej rozważną drogą do trzymania się katalogu. – Peter

Powiązane problemy