Emplacement de prise en charge de l'application Xcode 6 iPhone Simulator

137

Dans Xcode 6, j'ai une application dans laquelle j'utilise Core Data, mais il n'y a pas de dossier dans Application Support pour le simulateur iPhone iOS 8. Où mes fichiers et la base de données sqlite Core Data sont-ils stockés?

Henry Glendening
la source
Essayez ceci . Il existe une application qui ouvre directement le répertoire Documents de la dernière exécution de l'application.
NSRover
J'ai ajouté une réponse (au bas des autres réponses) qui montre comment obtenir par programme le chemin où résident les fichiers Core Data.
SpokaneDude
Jetez un œil à ce lien .. stackoverflow.com/questions/24133022/…
Tunvir Rahman Tusher
Utilisez "NSTemporaryDirectory ()". Regardez ceci- stackoverflow.com/questions/1108076/…
Shubhendu

Réponses:

296

Le répertoire du simulateur a été déplacé avec Xcode 6 beta vers ...

~/Library/Developer/CoreSimulator

Parcourir le répertoire dans le dossier Documents de votre application est un peu plus ardu, par exemple,

~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite
Scott Gardner
la source
4
c'est correct en général mais il semble qu'il y ait plus de changements de dossier interne. C'est le chemin qui fonctionne pour moi dans Xcode Beta 3:~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
harryhorn
1
Existe-t-il un moyen de comprendre que les chiffres ou la force brute sont la seule chance d'accéder aux données?
vir us
89
NSLog (@ "app dir:% @", [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject]); - imprimera le chemin complet du dossier de données
vir nous
2
J'avais besoin d'un raccourci persistant vers le répertoire des documents de mon application, pour un débogage rapide. Après l'application 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 Maintenant, j'ai un lien sim qui fonctionne, même si iOS8 + XCode6 change le GUID de données de mon application à chaque fois que je construis.
seabass
32
La xcrun simctl listcommande peut être utilisée pour voir la correspondance entre les noms du simulateur et les UDID de l'appareil. Ou plus précisément la xcrun simctl list devicescommande.
ThomasW
36

Je vous suggère d'utiliser SimPholders pour trouver vos fichiers Simulator. C'est un élément de la barre de menu qui suit vos applications de simulateur et vous permet d'accéder directement à leurs dossiers et à leur contenu. C'est génial.

ucangetit
la source
J'avais également des problèmes avec SimPholders2 sur Yosemite, j'ai donc lancé un script de ligne de commande pour vous aider à trouver et à ouvrir une fenêtre Finder sur le simulateur et l'application de votre choix. Il parcourt les dossiers et les listes de métadonnées pour répertorier tous les dossiers et applications du simulateur. Si vous êtes intéressé, vérifiez-le ici
Rodrigo Lima
SimPholders2 fonctionne dans Yosemite mais c'est un peu lent; une fois que vous avez cliqué sur l'icône dans la barre d'état, attendez quelques secondes et elle devrait apparaître.
Jason
Whoa c'est génial et le dernier fonctionne avec Yosemite + Xcode 6.3!
TruMan1
21

J'ai trouvé SimulatorManager application très utile. Il vous amène directement au dossier d'application des simulateurs installés. J'ai essayé avec des simulateurs 7.1, 8.0 et 8.1.

SimulatorManager se présente sous la forme d'une icône dans la barre d'état système et fournit une option pour «Lancer à la connexion».

entrez la description de l'image ici

Remarque : cela ne fonctionne qu'avec Xcode 6 (6.1.1 dans mon cas) et supérieur.

J'espère que cela pourra aider!

Amar
la source
Amar, comment installez-vous le SimulatorManager? Je pensais que c'était un plugin pour Xcode mais c'est un projet Xcode
malena
1
dans la barre supérieure, sélectionnez: Produit -> Archive -> puis Exportez l'archive en tant qu'application Mac sans re-signature (la dernière option), vous obtiendrez un fichier .app que vous pouvez placer dans votre dossier Application comme une application normale. ..
Heckscheibe
11

Pour savoir où votre fichier .sqlite est stocké dans votre AppDelegate.m, ajoutez le code suivant

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

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

appelez maintenant cette méthode dans AppDelegate.m

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

  //call here
   [self applicationDocumentsDirectory];

}
Salut mec
la source
super .. particulièrement utile quand il y a plusieurs simulateurs
Yasitha Waduge
6

Cela a fonctionné pour moi rapidement:

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

J'ai lutté avec ça pendant un certain temps. Il est devenu très difficile d'accéder simplement à ma base de données sqlite locale. J'ai écrit ce script et en ai fait un extrait de code dans XCode. Je le place dans mon appDidFinishLaunching dans mon 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

Cela crée un lien sim à la racine de votre lecteur. (Vous devrez peut-être créer ce dossier vous-même la première fois et le modifier, ou vous pouvez changer l'emplacement à un autre endroit) Ensuite, j'ai installé le plugin xcodeway https://github.com/onmyway133/XcodeWay

Je l'ai un peu modifié pour qu'il me permette d'appuyer simplement sur cmd + d et il ouvrira un enrouleur de recherche dans le répertoire persistant Documents de mon application actuelle. De cette façon, peu importe le nombre de fois que XCode modifie votre chemin, il ne change que lors de l'exécution, et il met à jour votre simlink immédiatement à chaque exécution.

J'espère que cela sera utile pour les autres!

Loup de mer
la source
Merci, je viens de mettre à jour XcodeWay pour prendre en charge le dossier du simulateur iOS 8
onmyway133
3

Ouvrez Finder> Bibliothèque> Développeur> CoreSimulator> Périphériques

Ensuite, l'icône de changement d'arrangement dans le viseur, sélectionnez la date d'ajout

Sélectionnez votre application> données> Conteneur> données> Applications>

choisissez votre application> Documents> Voici votre fichier db

Dans mon cas:

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

Sinon, procédez comme suit:

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

- Il imprimera le chemin complet du dossier de données.

Rapide:

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

Utilisez Finder -> allez dans le dossier et entrez le chemin de base donné pour atteindre les dossiers d'application

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

NSLog(@"%@",basePath);
user1039695
la source
1

Le simulateur place le fichier dans ~ / Library / Developer / CoreSimulator / Devices / ... mais le chemin après / Devices est différent pour tout le monde.

Utilisez cette méthode pratique. Il renvoie le chemin du répertoire temporaire de l'utilisateur actuel et ne prend aucun argument.

NSString * NSTemporaryDirectory ( void );

Donc, dans ma classe ViewController, je mets généralement cette ligne dans mon viewDidLoad juste pour une référence lorsque j'ai besoin de récupérer mon fichier stocké CoreData. J'espère que cela t'aides.

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

(Remarque: pour accéder au chemin, dans le menu du Finder, cliquez sur Go et tapez ~ / Library pour ouvrir le répertoire caché puis dans la fenêtre du Finder, vous pouvez cliquer sur le chemin indiqué sur votre console.)

Oh mon
la source
1

Cet emplacement a, une fois de plus, changé, si vous utilisez Swift, utilisez-le pour savoir où se trouve le dossier (il est copié à partir du fichier AppDelegate.swift qu'Apple crée pour vous, donc si cela ne fonctionne pas sur votre machine, recherchez dans ce fichier pour la bonne syntaxe, cela fonctionne sur le mien en utilisant le simulateur Xcode 6.1 et iOS 8):

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

Les simulateurs sont situés sous:

~/Library/Developer/CoreSimulator/

Ici, ils sont répertoriés comme des répertoires avec des noms UUID. Utilisez le tri par date de modification pour trouver le dernier. À l'intérieur, accédez à:

/data/Containers/Data/Application/

Ici, vous obtiendrez une liste de toutes les applications sur cet appareil. Vous pouvez à nouveau trier ceci pour obtenir la dernière application.

REMARQUE: Xcode change le nom du répertoire chaque fois que vous exécutez l'application, alors ne comptez pas sur la création d'alias / raccourcis sur le bureau.

Le moyen le plus simple est d'utiliser l'application ici , qui fait tout automatiquement.

NSRover
la source
1

J'ai créé ce script qui compressera la dernière application conçue pour n'importe quel simulateur et la compressera sur le bureau.

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
la source
1

Dans Swift 4 ou Swift 5, vous pouvez utiliser NSHomeDirectory() .

Le moyen le plus simple dans Xcode 10 (ou Xcode 11) est de suspendre votre application (comme quand elle atteint un point d'arrêt) et d'exécuter cette ligne dans la console du débogueur:

po NSHomeDirectory()

po représente l'objet d'impression et imprime la plupart des choses

exp
la source
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
la source
0
  1. Avec Swift 4, vous pouvez utiliser le code ci-dessous pour obtenir le répertoire d'accueil de votre application. Le répertoire de documents de votre application s'y trouve.

    print(NSHomeDirectory())

  2. Je pense que vous savez déjà que le répertoire personnel de votre application est modifiable, donc si vous ne souhaitez pas ajouter de code supplémentaire à votre base de code, SimPholder est un outil intéressant pour vous.

  3. Et de plus, vous vous demandez peut-être s'il existe un outil qui peut vous aider à gagner du temps en fermant et en rouvrant la même base de données SQLite à chaque fois après le changement du répertoire de base de votre application. Et la réponse est oui, un outil que je connais est SQLiteFlow . D'après son document, il est dit que:

    Gérez les changements de nom de fichier ou de répertoire de base de données. Cela permet à SQLiteFlow de fonctionner de manière conviviale avec votre base de données SQLite dans le simulateur iOS.

Tim
la source
0

Voici le sh pour le dernier simulateur et application utilisé. Exécutez simplement sh et copiez le texte imprimé et collez et exécutez la commande pour afficher dans le Finder.

#!/bin/zsh

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

echo $lastUsedSimulatorAndApplication
zapdroid
la source