In Xcode 6, ho un'app in cui sto utilizzando Core Data, ma non esiste alcuna cartella in Supporto applicazioni per iOS 8 iPhone Simulator. Dove vengono archiviati i miei file e il database sqlite di Core Data?
In Xcode 6, ho un'app in cui sto utilizzando Core Data, ma non esiste alcuna cartella in Supporto applicazioni per iOS 8 iPhone Simulator. Dove vengono archiviati i miei file e il database sqlite di Core Data?
Risposte:
La directory del simulatore è stata spostata con Xcode 6 beta in ...
~/Library/Developer/CoreSimulator
Navigare nella directory nella cartella Documenti della tua app è un po 'più arduo, ad es.
~/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
Ora ho un simlink che funziona, anche se iOS8 + XCode6 cambia il GUID dei dati della mia app ogni volta che costruisco.
xcrun simctl list
comando può essere utilizzato per visualizzare la corrispondenza tra i nomi del simulatore e gli UDID del dispositivo. O più precisamente il xcrun simctl list devices
comando.
Suggerirei di utilizzare SimPholders per trovare i tuoi file Simulator. È un elemento della barra dei menu che tiene traccia delle app del simulatore e ti consente di accedere direttamente alle loro cartelle e al loro contenuto. È meraviglioso.
Ho trovato molto utile l'applicazione SimulatorManager . Ti porta direttamente alla cartella dell'applicazione dei simulatori installati. Ho provato con simulatori 7.1, 8.0 e 8.1.
SimulatorManager si trova come un'icona nella barra delle applicazioni e fornisce un'opzione per "Avvia al login".
Nota : funziona solo con Xcode 6 (6.1.1 nel mio caso) e versioni successive.
Spero che aiuti!
Per sapere dove è archiviato il tuo file .sqlite in AppDelegate.m aggiungi il seguente codice
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
ora chiama questo metodo in AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Ho lottato con questo per qualche tempo. È diventato un grande dolore semplicemente arrivare al mio db sqlite locale. Ho scritto questo script e l'ho trasformato in uno snippet di codice all'interno di XCode. Lo inserisco nella mia appDidFinishLanciando nella mia 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
Questo crea un simlink alla radice del tuo disco. (Potrebbe essere necessario creare questa cartella da soli la prima volta e modificarla, oppure è possibile modificare la posizione in un altro posto) Quindi ho installato il plug-in xcodeway https://github.com/onmyway133/XcodeWay
L'ho modificato un po 'in modo che mi permettesse semplicemente di premere cmd + d e aprirà un avvolgitore di ricerca nella directory di documenti persistente della mia applicazione corrente. In questo modo, non importa quante volte XCode cambia il tuo percorso, cambia solo in esecuzione e aggiorna immediatamente il tuo simlink ad ogni corsa.
Spero che questo sia utile per gli altri!
Apri finder> Libreria> Sviluppatore> CoreSimulator> Dispositivi
Quindi, cambia l'icona Disposizione dal cercatore seleziona Data aggiunta
Seleziona la tua app> dati> Contenitore> dati> Applicazioni>
scegli la tua app> Documenti> Ecco il tuo file db
Nel mio caso:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
Altrimenti fai questo:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Stampa l'intero percorso della cartella dei dati.
Swift:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Usa Finder -> vai alla cartella e inserisci il dato basepath per raggiungere le cartelle dell'applicazione
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
Il simulatore inserisce il file in ~ / Library / Developer / CoreSimulator / Devices / ... ma il percorso dopo / Devices è diverso per tutti.
Usa questo pratico metodo. Restituisce il percorso della directory temporanea per l'utente corrente e non accetta alcun argomento.
NSString * NSTemporaryDirectory ( void );
Quindi nella mia classe ViewController di solito inserisco questa riga nel mio viewDidLoad solo come riferimento quando devo prendere il mio file memorizzato CoreData. Spero che questo ti aiuti.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Nota: per accedere al percorso, dal menu del Finder fare clic su Vai e digitare ~ / Library per aprire la directory nascosta, quindi nella finestra del Finder è possibile fare clic sul percorso mostrato sulla console.)
Questa posizione è, ancora una volta, cambiata, se si utilizza Swift, utilizzarlo per scoprire dove si trova la cartella (questa viene copiata dal file AppDelegate.swift che Apple crea per te, quindi se non funziona sul tuo computer, cerca in quel file per la giusta sintassi, funziona su di me usando Xcode 6.1 e simulatore iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
I simulatori si trovano sotto:
~/Library/Developer/CoreSimulator/
Qui, sono elencati come directory con nomi UUID. Usa l'ordinamento per 'Data modifica' per trovare l'ultimo. All'interno vai a:
/data/Containers/Data/Application/
Qui otterrai un elenco di tutte le applicazioni su quel dispositivo. Puoi di nuovo ordinare questo per ottenere l'ultima app.
NOTA: Xcode cambia il nome della directory ogni volta che esegui l'app, quindi non fare affidamento su alias / scorciatoie sul desktop.
Il modo più semplice è usare l'app qui , che fa tutto automaticamente.
Ho creato questo script che comprimerà l'ultima app creata per qualsiasi simulatore e lo comprimerà sul desktop.
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"
In Swift 4 o Swift 5 è possibile utilizzare NSHomeDirectory()
.
Il modo più semplice in Xcode 10 (o Xcode 11) è mettere in pausa l'app (come quando raggiunge un punto di interruzione) ed eseguire questa linea nella console del debugger:
po NSHomeDirectory()
po
sta per oggetto di stampa e stampa la maggior parte delle cose
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
Con Swift 4, puoi utilizzare il codice seguente per ottenere la home directory della tua app. La directory dei documenti della tua app è lì.
print(NSHomeDirectory())
Penso che tu sappia già che la home directory della tua app è modificabile, quindi se non vuoi aggiungere altro codice alla tua base di codice, SimPholder è uno strumento piacevole per te.
Inoltre, potresti chiederti che esiste uno strumento che può aiutarti a risparmiare tempo dalla chiusura e dalla riapertura dello stesso database SQLite ogni volta che la directory home dell'app viene modificata. E la risposta è sì, uno strumento che conosco è SQLiteFlow . Dal suo documento, dice che:
Gestire il nome del file di database o le modifiche alla directory. Questo rende SQLiteFlow facile da usare con il tuo database SQLite nel simulatore iOS.
Ecco lo sh dell'ultimo simulatore e applicazione utilizzati. Basta eseguire sh e copiare il testo stampato e incollare ed eseguire il comando per show in finder.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication