En Xcode 6, tengo una aplicación en la que estoy usando Core Data, pero no hay una carpeta en el Soporte de aplicaciones para iOS 8 iPhone Simulator. ¿Dónde se almacenan mis archivos y la base de datos Core Data sqlite?
En Xcode 6, tengo una aplicación en la que estoy usando Core Data, pero no hay una carpeta en el Soporte de aplicaciones para iOS 8 iPhone Simulator. ¿Dónde se almacenan mis archivos y la base de datos Core Data sqlite?
Respuestas:
El directorio del simulador se ha movido con Xcode 6 beta a ...
~/Library/Developer/CoreSimulator
Navegar por el directorio de la carpeta Documentos de su aplicación es un poco más arduo, por ejemplo,
~/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
Ahora tengo un simlink que funciona, a pesar de que iOS8 + XCode6 cambia el GUID de datos de mi aplicación cada vez que construyo.
xcrun simctl list
comando se puede usar para ver la correspondencia entre los nombres del simulador y los UDID del dispositivo. O más específicamente el xcrun simctl list devices
comando.
Te sugiero que uses SimPholders para encontrar tus archivos de Simulator. Es un elemento de la barra de menú que rastrea las aplicaciones de su simulador y le permite ir directamente a sus carpetas y contenido. Es impresionante.
La aplicación SimulatorManager me pareció muy útil. Te lleva directamente a la carpeta de la aplicación de simuladores instalados. He intentado con simuladores 7.1, 8.0 y 8.1.
SimulatorManager reside como un icono en la bandeja del sistema y ofrece una opción para "Iniciar al iniciar sesión".
Nota : Esto funciona solo con Xcode 6 (6.1.1 en mi caso) y superior.
¡Espero que ayude!
Para saber dónde está almacenado su archivo .sqlite en su AppDelegate.m agregue el siguiente código
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
ahora llame a este método en AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Luché con esto por algún tiempo. Se convirtió en un gran dolor simplemente llegar a mi sqlite db local. Escribí este script y lo convertí en un fragmento de código dentro de XCode. Lo coloco dentro de mi appDidFinishLaunching dentro de mi 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
Esto crea un enlace sim en la raíz de su disco. (Es posible que deba crear esta carpeta usted mismo la primera vez, y modificarla, o puede cambiar la ubicación a otro lugar) Luego instalé el complemento xcodeway https://github.com/onmyway133/XcodeWay
Lo modifiqué un poco para que me permita simplemente presionar cmd + d y se abrirá una bobinadora de búsqueda en el directorio de Documentos persistentes de mi aplicación actual. De esta manera, no importa cuántas veces XCode cambie su ruta, solo cambia en la ejecución y actualiza su enlace simbólico inmediatamente en cada ejecución.
¡Espero que esto sea útil para otros!
Buscador abierto> Biblioteca> Desarrollador> CoreSimulator> Dispositivos
Luego, cambie el ícono de Arreglo del buscador, seleccione Fecha de adición
Seleccione su aplicación> datos> Contenedor> datos> Aplicaciones>
elige tu aplicación> Documentos> Aquí está su archivo db
En mi caso:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
De lo contrario, haga esto:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Imprimirá la ruta completa a la carpeta de datos.
Rápido:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Use Finder -> vaya a la carpeta e ingrese la ruta base dada para llegar a las carpetas de la aplicación
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
El simulador coloca el archivo en ~ / Library / Developer / CoreSimulator / Devices / ... pero la ruta después de / Devices es diferente para todos.
Usa este práctico método. Devuelve la ruta del directorio temporal para el usuario actual y no toma argumentos.
NSString * NSTemporaryDirectory ( void );
Entonces, en mi clase ViewController, generalmente pongo esta línea en mi viewDidLoad solo como referencia cuando necesito tomar mi archivo almacenado CoreData. Espero que esto ayude.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Nota: para ir a la ruta, desde el menú del buscador, haga clic en Ir y escriba ~ / Library para abrir el directorio oculto; luego, en la ventana del Finder, puede hacer clic en la ruta que se muestra en la consola).
Esta ubicación, una vez más, ha cambiado, si usa Swift, use esto para averiguar dónde está la carpeta (esto se copia del archivo AppDelegate.swift que Apple crea para usted, así que si no funciona en su máquina, busque ese archivo para la sintaxis correcta, esto funciona en el mío usando Xcode 6.1 y simulador iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Los simuladores se encuentran debajo de:
~/Library/Developer/CoreSimulator/
Aquí, se enumeran como directorios con nombres de UUID. Use ordenar por 'Fecha de modificación' para encontrar la última. Dentro de navegar a:
/data/Containers/Data/Application/
Aquí obtendrá una lista de todas las aplicaciones en ese dispositivo. Puede ordenar esto nuevamente para obtener la última aplicación.
NOTA: Xcode cambia el nombre del directorio cada vez que ejecuta la aplicación, así que no confíe en hacer alias / atajos en el escritorio.
La forma más fácil es usar la aplicación aquí , que hace todo automáticamente.
Creé este script que comprimirá la última aplicación creada para cualquier simulador y la comprimirá en el escritorio.
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"
En Swift 4 o Swift 5 puedes usar NSHomeDirectory()
.
La forma más fácil en Xcode 10 (o Xcode 11) es pausar su aplicación (como cuando llega a un punto de interrupción) y ejecutar esta línea en la consola del depurador:
po NSHomeDirectory()
po
significa objeto de impresión e imprime la mayoría de las cosas
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, puede usar el siguiente código para obtener el directorio de inicio de su aplicación. El directorio de documentos de su aplicación está allí.
print(NSHomeDirectory())
Creo que ya sabe que el directorio de inicio de su aplicación es modificable, por lo que si no desea agregar código adicional a su base de código, SimPholder es una buena herramienta para usted.
Y aún más, puede preguntarse si existe una herramienta que pueda ayudarlo a ahorrar tiempo al cerrar y volver a abrir la misma base de datos SQLite cada vez que se cambia el directorio de inicio de su aplicación. Y la respuesta es sí, una herramienta que conozco es SQLiteFlow . De su documento, dice que:
Manejar el nombre del archivo de la base de datos o los cambios de directorio. Esto hace que SQLiteFlow pueda funcionar con su base de datos SQLite en el simulador de iOS.
Aquí está el sh para el último simulador y aplicación usados. Simplemente ejecute sh y copie el texto impreso y pegue y ejecute el comando para mostrar en el buscador.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication