W Xcode 6 mam aplikację, w której używam danych podstawowych, ale nie ma folderu w obsłudze aplikacji dla symulatora iPhone'a iOS 8. Gdzie są przechowywane moje pliki i baza danych Core Data sqlite?
W Xcode 6 mam aplikację, w której używam danych podstawowych, ale nie ma folderu w obsłudze aplikacji dla symulatora iPhone'a iOS 8. Gdzie są przechowywane moje pliki i baza danych Core Data sqlite?
Odpowiedzi:
Katalog symulatora został przeniesiony wraz z Xcode 6 beta do ...
~/Library/Developer/CoreSimulator
Przeglądanie katalogu do folderu Dokumenty aplikacji jest nieco bardziej uciążliwe, np.
~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
#if DEBUG NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"]; NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName]; remove([aliasPath UTF8String]); [[NSFileManager defaultManager]createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil]; #endif
Teraz mam simlink, który działa, mimo że iOS8 + XCode6 zmienia identyfikator GUID danych mojej aplikacji za każdym razem, gdy buduję.
xcrun simctl list
Komenda może być używana do sprawdzania korespondencji pomiędzy nazwami i symulator do identyfikatorów urządzeń. A dokładniej xcrun simctl list devices
polecenie.
Sugerowałbym, abyś użył SimPholder do znalezienia plików symulatora. Jest to element paska menu, który śledzi aplikacje symulatora i pozwala przejść bezpośrednio do ich folderów i zawartości. To jest zajebiste.
Uważam, że aplikacja SimulatorManager jest bardzo przydatna. Przenosi Cię bezpośrednio do folderu aplikacji zainstalowanych symulatorów. Próbowałem z symulatorami 7.1, 8.0 i 8.1.
SimulatorManager znajduje się w postaci ikony w zasobniku systemowym i udostępnia opcję „Uruchom przy logowaniu”.
Uwaga : działa to tylko z Xcode 6 (w moim przypadku 6.1.1) i nowszymi.
Mam nadzieję, że to pomoże!
Aby dowiedzieć się, gdzie jest przechowywany plik .sqlite w pliku AppDelegate.m, dodaj następujący kod
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
teraz wywołaj tę metodę w AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Zmagałem się z tym przez jakiś czas. Po prostu dotarcie do mojej lokalnej bazy danych sqlite stało się ogromnym problemem. Napisałem ten skrypt i zrobiłem z niego fragment kodu wewnątrz XCode. Umieszczam go w mojej aplikacjiDidFinishLaunching inside my appDelegate.
//xcode 6 moves the documents dir every time. haven't found out why yet.
#if DEBUG
NSLog(@"caching documents dir for xcode 6. %@", [NSBundle mainBundle]);
NSString *toFile = @"XCodePaths/lastBuild.txt"; NSError *err = nil;
[DOCS_DIR writeToFile:toFile atomically:YES encoding:NSUTF8StringEncoding error:&err];
if(err)
NSLog(@"%@", [err localizedDescription]);
NSString *appName = [[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"];
NSString *aliasPath = [NSString stringWithFormat:@"XCodePaths/%@", appName];
remove([aliasPath UTF8String]);
[[NSFileManager defaultManager] createSymbolicLinkAtPath:aliasPath withDestinationPath:DOCS_DIR error:nil];
#endif
Tworzy to łącze simlink w katalogu głównym dysku. (Być może za pierwszym razem będziesz musiał samodzielnie utworzyć ten folder i chmod go lub możesz zmienić lokalizację w inne miejsce) Następnie zainstalowałem wtyczkę xcodeway https://github.com/onmyway133/XcodeWay
Zmodyfikowałem go trochę tak, że pozwoli mi po prostu nacisnąć cmd + d i otworzy wyszukiwarkę winder do katalogu trwałych dokumentów mojej bieżącej aplikacji. W ten sposób, niezależnie od tego, ile razy XCode zmienia twoją ścieżkę, zmienia się tylko podczas działania i aktualizuje twoje łącze simlink natychmiast po każdym uruchomieniu.
Mam nadzieję, że jest to przydatne dla innych!
Otwórz wyszukiwarkę> Biblioteka> Deweloper> CoreSimulator> Urządzenia
Następnie ikonę Zmień układ z wyszukiwarki wybierz Data dodania
Wybierz swoją aplikację> dane> Kontener> dane> Aplikacje>
wybierz swoją aplikację> Dokumenty> Oto Twój plik db
W moim przypadku:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
W przeciwnym razie zrób to:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Wyświetli pełną ścieżkę do folderu danych.
Szybki:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Użyj Findera -> przejdź do folderu i wprowadź podaną ścieżkę bazową, aby dotrzeć do folderów aplikacji
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Symulator umieszcza plik w katalogu ~ / Library / Developer / CoreSimulator / Devices / ..., ale ścieżka po / Devices jest inna dla każdego.
Użyj tej poręcznej metody. Zwraca ścieżkę do katalogu tymczasowego dla bieżącego użytkownika i nie przyjmuje argumentów.
NSString * NSTemporaryDirectory ( void );
Dlatego w mojej klasie ViewController zwykle umieszczam ten wiersz w moim viewDidLoad tylko jako odniesienie, gdy muszę pobrać mój przechowywany plik CoreData. Mam nadzieję że to pomoże.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Uwaga: aby przejść do ścieżki, w menu wyszukiwarki kliknij Idź i wpisz ~ / Library, aby otworzyć ukryty katalog, a następnie w oknie Findera możesz kliknąć ścieżkę wyświetlaną na konsoli).
Ta lokalizacja ponownie się zmieniła, jeśli używasz Swift, użyj tego, aby dowiedzieć się, gdzie jest folder (jest to kopiowane z pliku AppDelegate.swift, który tworzy dla Ciebie Apple, więc jeśli nie działa na twoim komputerze, wyszukaj w ten plik dla odpowiedniej składni, działa to na moim przy użyciu symulatora Xcode 6.1 i iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Symulatory znajdują się pod:
~/Library/Developer/CoreSimulator/
Tutaj są wymienione jako katalogi z nazwami UUID. Użyj opcji sortowania według „Daty modyfikacji”, aby znaleźć najnowszą. Wewnątrz przejdź do:
/data/Containers/Data/Application/
Tutaj otrzymasz listę wszystkich aplikacji na tym urządzeniu. Możesz ponownie posortować to, aby pobrać najnowszą aplikację.
UWAGA: Xcode zmienia nazwę katalogu za każdym razem, gdy uruchamiasz aplikację, więc nie polegaj na tworzeniu aliasów / skrótów na pulpicie.
Najłatwiej jest użyć tutaj aplikacji , która robi wszystko automatycznie.
Stworzyłem ten skrypt, który spakuje najnowszą aplikację zbudowaną dla dowolnego symulatora i spakuje ją na pulpit.
https://gist.github.com/Gerst20051/8ca49d5afbf09007b3696fab6e9f425c
#!/bin/bash
DESTINATION_DIR="$HOME/Desktop"
APP_PATH=$(find ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Bundle/Application/*/*.app -type d -maxdepth 0 -print0 | xargs -0 ls -td | head -n1)
APP_DIRNAME=$(dirname "$APP_PATH")
APP_BASENAME=$(basename "$APP_PATH")
FILE_NAME="${APP_BASENAME%.*}"
cd "$APP_DIRNAME"
zip -qr "$DESTINATION_DIR/$FILE_NAME.zip" "$APP_BASENAME"
W Swift 4 lub Swift 5 możesz użyć NSHomeDirectory()
.
Najłatwiejszym sposobem w Xcode 10 (lub Xcode 11) jest wstrzymanie aplikacji (np. Gdy osiągnie punkt przerwania) i uruchomienie tego wiersza w konsoli debugera:
po NSHomeDirectory()
po
oznacza drukowany obiekt i drukuje większość rzeczy
1. NSTemporaryDirectory() gives this:
/Users/spokaneDude/Library/Developer/CoreSimulator/Devices/1EE69744-255A-45CD-88F1-63FEAD117B32/data/Containers/Data/Application/199B1ACA-A80B-44BD-8E5E-DDF3DCF0D8D9/tmp
2. remove "/tmp" replacing it with "/Library/Application Support/<app name>/" --> is where the .sqlite files reside
Dzięki Swift 4 możesz użyć poniższego kodu, aby uzyskać katalog domowy swojej aplikacji. Tam znajduje się katalog dokumentów Twojej aplikacji.
print(NSHomeDirectory())
Myślę, że już wiesz, że katalog domowy twojej aplikacji jest zmienny, więc jeśli nie chcesz dodawać dodatkowego kodu do swojej bazy kodu, SimPholder jest dla Ciebie miłym narzędziem.
Co więcej, możesz się zastanawiać, czy istnieje narzędzie, które pomoże Ci zaoszczędzić czas związany z zamykaniem i ponownym otwieraniem tej samej bazy danych SQLite za każdym razem po zmianie katalogu domowego aplikacji. Odpowiedź brzmi: tak, narzędziem, które znam, jest SQLiteFlow . Z jego dokumentu jest napisane, że:
Obsługa zmian nazw plików lub katalogów bazy danych. To sprawia, że SQLiteFlow może współpracować z bazą danych SQLite w symulatorze iOS.
Oto sh dla ostatnio używanego symulatora i aplikacji. Po prostu uruchom sh i skopiuj wydrukowany tekst i wklej i uruchom polecenie pokazu w Finderze.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication