Posizione di supporto dell'applicazione Xcode 6 per iPhone Simulator


137

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?


Prova questo . Esiste un'app che apre direttamente la directory Documents dell'ultima esecuzione dell'app.
NSRover,

Ho aggiunto una risposta (in fondo alle altre risposte) che mostra come ottenere a livello di programmazione il percorso in cui risiedono i file di dati principali.
SpokaneDude,


Utilizzare "NSTemporaryDirectory ()". Guardate questo- stackoverflow.com/questions/1108076/...
Shubhendu

Risposte:


296

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

4
questo è corretto in generale, ma sembra che ci siano più cambiamenti nella cartella interna. Questo è il percorso che funziona per me in Xcode Beta 3:~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
harryhorn,

1
C'è un modo per capire che i numeri o la forza bruta sono l'unica possibilità di ottenere dati?
vir us

89
NSLog (@ "app dir:% @", [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject]); - Stampa il percorso completo della cartella dei dati
vir us

2
Avevo bisogno di un collegamento persistente alla directory dei documenti della mia app, per un debug rapido. Dopo l'applicazione didFinishLaunchingWithOptions. #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.
branzino,

32
Il xcrun simctl listcomando può essere utilizzato per visualizzare la corrispondenza tra i nomi del simulatore e gli UDID del dispositivo. O più precisamente il xcrun simctl list devicescomando.
ThomasW,

36

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.


Avevo anche problemi con SimPholders2 su Yosemite, quindi ho avviato uno script da riga di comando per aiutarti a trovare e aprire una finestra del Finder per il simulatore e l'app che desideri. Scorre le cartelle e i metadati per elencare tutte le cartelle e le app del simulatore. Se interessati, dai un'occhiata qui
Rodrigo Lima,

SimPholders2 funziona in Yosemite ma è un po 'lento; dopo aver fatto clic sull'icona nella barra di stato, attendi qualche secondo e dovrebbe apparire.
Jason,

Whoa è fantastico e gli ultimi lavori con Yosemite + Xcode 6.3!
TruMan1,

21

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".

inserisci qui la descrizione dell'immagine

Nota : funziona solo con Xcode 6 (6.1.1 nel mio caso) e versioni successive.

Spero che aiuti!


Amar, come si installa SimulatorManager? Ho pensato che fosse un plugin per Xcode ma è un progetto Xcode
malena,

1
nella barra in alto seleziona: Prodotto -> Archivio -> e quindi esporta l'archivio come applicazione Mac senza ripetere la firma (l'ultima opzione) otterrai un file .app che puoi inserire nella cartella dell'applicazione come una normale applicazione. ..
Heckscheibe,

11

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];

}

fantastico .. utile specialmente quando ci sono più simulatori
Yasitha Waduge,

6

Questo ha funzionato per me rapidamente:

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")

3

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!


Grazie, aggiorno XcodeWay per supportare la cartella del simulatore iOS 8
onmyway133

3

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)")

Swift 3.0:let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
AtomicBoolean il

2

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);

1

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.)


1

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)")

1

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.


1

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"

1

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


0
 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

0
  1. 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())

  2. 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.

  3. 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.


0

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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.