2015-02-22 23 views
8

Przechowuję plik .mp3 w katalogu dokumentów aplikacji iOS i zapisuję ścieżkę do danych podstawowych. Kiedy przebudowuję aplikację, Xcode wydaje się przenosić dane aplikacji do innego katalogu, co sprawia, że ​​przechowywana ścieżka jest nieważna. Dlaczego tak się dzieje i jakie są najlepsze praktyki dotyczące zapisywania ścieżek plików?Xcode zmienia lokalizację folderu aplikacji na kompilacji

Używam Xcode 6.2 i pomyślnie odzyskałem plik w przeszłości.

lokalizację pliku po pobraniu:

in ~/Library/Developer/CoreSimulator/Devices/82D1931C-590D-45A2-AB9B-8D1D4F2530C5/data/Containers/Data/Application/ 
$ find . -iname p612.mp3 
./1C070BF8-0E2E-4EAC-99B6-C56E48675E6E/Documents/adf07cf85254e8f28f942f2d6fa704ae/p612.mp3 

Lokalizacja pliku po przebudowie:

in ~/Library/Developer/CoreSimulator/Devices/82D1931C-590D-45A2-AB9B-8D1D4F2530C5/data/Containers/Data/Application/ 
$ find . -iname p612.mp3 
./E6C7D0AF-E61C-4BDD-AF4B-68C445E2BB0D/Documents/adf07cf85254e8f28f942f2d6fa704ae/p612.mp3 
+0

Myślę, że to nowość w iOS8. Zobacz to [Pytanie SO] (http://stackoverflow.com/q/26552245/3985749). Rozwiązaniem jest przechowywanie tylko nazwy pliku i wyszukiwanie adresu URL katalogu dokumentów podczas odczytu i zapisywania. – pbasdf

Odpowiedz

11

Od iOS 8.0, za każdym razem odbudować swój kod, nazwę folderu aplikacji (który zawiera twoje dokumenty i katalogi biblioteczne) zmiany. To jest zamierzone zachowanie.

Jeśli chcesz zapisać ścieżkę, powinieneś tylko zapisać nazwę pliku, a następnie połączyć ją z położeniem katalogu dokumentów w locie. W ten sposób zawsze wskaże właściwą lokalizację.

Zawartość katalogu dokumentów będzie obowiązywać, nawet jeśli nazwa folderu, w którym się znajduje, zmieni się z kompilacji na kompilację.

// Returns the URL to the application's Documents directory. 
- (NSURL *)applicationDocumentsDirectory 
{ 
    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]; 
} 

Patrz: Technical Note TN2406.

1

Szybka aktualizacja dotycząca zwracania DocumentsDirectory w celu zachowania trwałości między kompilacjami. Ta odpowiedź zwróci ścieżkę do Dir. Następnie możesz dokończyć dodawanie nazwy pliku/ostatniego komponentu.

func findAppDir()->String{ 
    let appDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0] as String 
    let path = "file://\(appDir)/" 
    return path 
}