Speicherort des Xcode 6 iPhone Simulator-Anwendungssupports

137

In Xcode 6 habe ich eine App, in der ich Core Data verwende, aber es gibt keinen Ordner in der Anwendungsunterstützung für den iOS 8 iPhone Simulator. Wo werden meine Dateien und die Core Data SQLite-Datenbank gespeichert?

Henry Glendening
quelle
Versuchen Sie dies . Es gibt eine App, die direkt das Dokumentverzeichnis des letzten App-Laufs öffnet.
NSRover
Ich habe eine Antwort hinzugefügt (am Ende der anderen Antworten), die zeigt, wie programmgesteuert der Pfad ermittelt wird, in dem sich die Core Data-Dateien befinden.
SpokaneDude
Schauen Sie sich diesen Link an .. stackoverflow.com/questions/24133022/…
Tunvir Rahman Tusher
Verwenden Sie "NSTemporaryDirectory ()". Schauen Sie sich das an
Shubhendu

Antworten:

296

Das Simulatorverzeichnis wurde mit Xcode 6 Beta nach ...

~/Library/Developer/CoreSimulator

Das Durchsuchen des Verzeichnisses in den Ordner "Dokumente" Ihrer App ist etwas schwieriger, z.

~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
Scott Gardner
quelle
4
Dies ist im Allgemeinen korrekt, aber es scheint, dass es mehr interne Ordneränderungen gibt. Dies ist der Weg, der für mich in Xcode Beta 3 ~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
funktioniert
1
Gibt es eine Möglichkeit zu verstehen, dass Zahlen oder Brute Force die einzige Möglichkeit sind, an Daten zu gelangen?
Vir uns
89
NSLog (@ "app dir:% @", [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject]); - druckt den vollständigen Pfad zum
vir us
2
Zum schnellen Debuggen benötigte ich eine dauerhafte Verknüpfung zum Dokumentenverzeichnis meiner App. Nach der Anwendung 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 Jetzt habe ich einen Simlink, der funktioniert, obwohl iOS8 + XCode6 die Daten-GUID meiner App bei jedem Erstellen ändert.
Seebarsch
32
Mit dem xcrun simctl listBefehl kann die Entsprechung zwischen den Simulatornamen und den Geräte-UDIDs angezeigt werden. Oder genauer gesagt der xcrun simctl list devicesBefehl.
ThomasW
36

Ich würde vorschlagen, dass Sie SimPholders verwenden , um Ihre Simulator-Dateien zu finden. Es ist ein Menüleistenelement, mit dem Sie Ihre Simulator-Apps verfolgen und direkt zu deren Ordnern und Inhalten wechseln können. Es ist toll.

ucangetit
quelle
Ich hatte auch Probleme mit SimPholders2 auf Yosemite, daher habe ich ein Befehlszeilenskript gestartet, mit dem Sie ein Finder-Fenster für den gewünschten Simulator und die gewünschte App finden und öffnen können. Es geht durch die Ordner und Metadatenlisten, um alle Simulatorordner und Apps aufzulisten. Wenn Sie interessiert sind, überprüfen Sie es hier
Rodrigo Lima
SimPholders2 funktioniert in Yosemite, ist aber etwas langsam. Sobald Sie auf das Symbol in der Statusleiste geklickt haben, warten Sie einige Sekunden und es sollte angezeigt werden.
Jason
Whoa, es ist großartig und die neuesten Arbeiten mit Yosemite + Xcode 6.3!
TruMan1
21

Ich fand die SimulatorManager- Anwendung sehr nützlich. Sie gelangen direkt zum Anwendungsordner der installierten Simulatoren. Ich habe es mit 7.1, 8.0 und 8.1 Simulatoren versucht.

SimulatorManager befindet sich als Symbol in der Taskleiste und bietet eine Option zum Starten bei Anmeldung.

Geben Sie hier die Bildbeschreibung ein

Hinweis : Dies funktioniert nur mit Xcode 6 (in meinem Fall 6.1.1) und höher.

Hoffentlich hilft das!

Amar
quelle
Amar, wie installierst du den SimulatorManager? Ich dachte, es wäre ein Plugin für Xcode, aber es ist ein Xcode-Projekt
Malena
1
Wählen Sie in der oberen Leiste: Produkt -> Archiv -> und exportieren Sie das Archiv als Mac-Anwendung, ohne es erneut zu signieren (letzte Option). Sie erhalten eine .app-Datei, die Sie wie eine normale Anwendung in Ihren Anwendungsordner legen können. ..
Heckscheibe
11

Fügen Sie den folgenden Code hinzu, um zu erfahren, wo Ihre .sqlite-Datei in AppDelegate.m gespeichert ist

- (NSURL *)applicationDocumentsDirectory
{
    NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory      inDomains:NSUserDomainMask] lastObject]);

    return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory     inDomains:NSUserDomainMask] lastObject];
 }

Rufen Sie diese Methode jetzt in AppDelegate.m auf

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

  //call here
   [self applicationDocumentsDirectory];

}
Himan
quelle
großartig .. besonders nützlich, wenn es mehrere Simulatoren gibt
Yasitha Waduge
6

Das hat bei mir schnell geklappt:

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

Ich habe einige Zeit damit gerungen. Es wurde ein großer Schmerz, einfach zu meiner lokalen SQLite-Datenbank zu gelangen. Ich habe dieses Skript geschrieben und es zu einem Code-Snippet in XCode gemacht. Ich platziere es in meinem appDidFinishLaunching in meinem 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

Dadurch wird ein Simlink im Stammverzeichnis Ihres Laufwerks erstellt. (Möglicherweise müssen Sie diesen Ordner beim ersten Mal selbst erstellen und ändern, oder Sie können den Speicherort an einen anderen Ort ändern.) Dann habe ich das xcodeway- Plugin https://github.com/onmyway133/XcodeWay installiert

Ich habe es ein wenig geändert, damit ich einfach cmd + d drücken kann, und es wird ein Finder-Winder für das persistente Dokumentenverzeichnis meiner aktuellen Anwendung geöffnet. Unabhängig davon, wie oft XCode Ihren Pfad ändert, ändert es sich auf diese Weise nur beim Ausführen und aktualisiert Ihren Simlink sofort bei jedem Ausführen.

Ich hoffe das ist nützlich für andere!

Seebarsch
quelle
Vielen Dank, ich aktualisiere gerade XcodeWay, um iOS 8 Simulator-Ordner zu unterstützen
onmyway133
3

Öffnen Sie den Finder> Bibliothek> Entwickler> CoreSimulator> Geräte

Dann ändern Sie das Arrangement-Symbol im Finder und wählen Sie das Datum des Hinzufügens

Wählen Sie Ihre App> Daten> Container> Daten> Anwendungen>

Wählen Sie Ihre App> Dokumente> Hier ist Ihre Datenbankdatei

In meinem Fall:

/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite

Andernfalls machen Sie Folgendes:

NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]); 

- Es wird der vollständige Pfad zum Datenordner gedruckt.

Schnell:

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
Nagarjun
quelle
Swift 3.0:let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
AtomicBoolean
2

Verwenden Sie den Finder -> gehen Sie zum Ordner und geben Sie den angegebenen Basispfad ein, um zu den Anwendungsordnern zu gelangen

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;

NSLog(@"%@",basePath);
user1039695
quelle
1

Der Simulator legt die Datei in ~ / Library / Developer / CoreSimulator / Devices / ... ab, aber der Pfad nach / Devices ist für alle unterschiedlich.

Verwenden Sie diese praktische Methode. Es gibt den Pfad des temporären Verzeichnisses für den aktuellen Benutzer zurück und akzeptiert kein Argument.

NSString * NSTemporaryDirectory ( void );

In meiner ViewController-Klasse füge ich diese Zeile normalerweise in mein viewDidLoad ein, nur als Referenz, wenn ich meine gespeicherte CoreData-Datei abrufen muss. Hoffe das hilft.

  NSLog(@"FILE PATH :%@", NSTemporaryDirectory());

(Hinweis: Um zum Pfad zu gelangen, klicken Sie im Finder-Menü auf Los und geben Sie ~ / Library ein, um das versteckte Verzeichnis zu öffnen. Klicken Sie dann im Finder-Fenster auf den Pfad, der auf Ihrer Konsole angezeigt wird.)

Oh mein
quelle
1

Dieser Speicherort hat sich erneut geändert. Wenn Sie Swift verwenden, können Sie anhand dieses Speicherorts herausfinden, wo sich der Ordner befindet (dieser wird aus der von Apple für Sie erstellten Datei AppDelegate.swift kopiert. Wenn er auf Ihrem Computer nicht funktioniert, suchen Sie in Diese Datei für die richtige Syntax funktioniert bei mir mit Xcode 6.1 und iOS 8 Simulator.

let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Kakubei
quelle
1

Die Simulatoren befinden sich unter:

~/Library/Developer/CoreSimulator/

Hier werden sie als Verzeichnisse mit UUID-Namen aufgelistet. Verwenden Sie die Sortierung nach 'Änderungsdatum', um das neueste zu finden. Innen navigieren zu:

/data/Containers/Data/Application/

Hier erhalten Sie eine Liste aller Anwendungen auf diesem Gerät. Sie können dies erneut sortieren, um die neueste App zu erhalten.

HINWEIS: Xcode ändert den Verzeichnisnamen jedes Mal, wenn Sie die App ausführen. Verlassen Sie sich daher nicht darauf, Alias ​​/ Verknüpfungen auf dem Desktop zu erstellen.

Der einfachste Weg ist es, die App nutzen hier , was alles automatisch tut.

NSRover
quelle
1

Ich habe dieses Skript erstellt, das die neueste App für jeden Simulator komprimiert und auf den Desktop komprimiert.

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"
Andy
quelle
1

In Swift 4 oder Swift 5 können Sie verwenden NSHomeDirectory().

Der einfachste Weg in Xcode 10 (oder Xcode 11) besteht darin, die App anzuhalten (z. B. wenn sie einen Haltepunkt erreicht) und diese Zeile in der Debugger-Konsole auszuführen:

po NSHomeDirectory()

po steht für Druckobjekt und druckt die meisten Dinge

exp
quelle
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
SpokaneDude
quelle
0
  1. Mit Swift 4 können Sie den folgenden Code verwenden, um das Home-Verzeichnis Ihrer App abzurufen. Dort befindet sich das Dokumentverzeichnis Ihrer App.

    print(NSHomeDirectory())

  2. Ich denke, Sie wissen bereits, dass das Home-Verzeichnis Ihrer App geändert werden kann. Wenn Sie also Ihrer Codebasis keinen zusätzlichen Code hinzufügen möchten, ist SimPholder ein nützliches Tool für Sie.

  3. Darüber hinaus fragen Sie sich vielleicht, ob es ein Tool gibt, mit dem Sie Zeit sparen können, wenn Sie die SQLite-Datenbank jedes Mal schließen und erneut öffnen, nachdem das Home-Verzeichnis Ihrer App geändert wurde. Und die Antwort lautet: Ja, ein Tool, das ich kenne, ist SQLiteFlow . Aus dem Dokument geht hervor, dass:

    Behandeln Sie Datenbankdateinamen oder Verzeichnisänderungen. Dadurch kann SQLiteFlow mit Ihrer SQLite-Datenbank im iOS-Simulator kompatibel arbeiten.

Tim
quelle
0

Hier ist der sh für den zuletzt verwendeten Simulator und die zuletzt verwendete Anwendung. Führen Sie einfach sh aus und kopieren Sie den gedruckten Text und fügen Sie den Befehl zum Anzeigen im Finder ein und führen Sie ihn aus.

#!/bin/zsh

lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`

echo $lastUsedSimulatorAndApplication
zapdroid
quelle