No Xcode 6, tenho um aplicativo em que estou usando o Core Data, mas não há pasta no Suporte a aplicativos para o iOS 8 iPhone Simulator. Onde meus arquivos e o banco de dados sqlite do Core Data estão sendo armazenados?
No Xcode 6, tenho um aplicativo em que estou usando o Core Data, mas não há pasta no Suporte a aplicativos para o iOS 8 iPhone Simulator. Onde meus arquivos e o banco de dados sqlite do Core Data estão sendo armazenados?
Respostas:
O diretório do simulador foi movido com o Xcode 6 beta para ...
~/Library/Developer/CoreSimulator
Navegar no diretório para a pasta Documents do seu aplicativo é um pouco mais difícil, por exemplo,
~/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
Agora eu tenho um simlink que funciona, mesmo que o iOS8 + XCode6 altere o GUID de dados do meu aplicativo toda vez que eu construo.
xcrun simctl list
comando pode ser usado para ver a correspondência entre os nomes do simulador e os UDIDs do dispositivo. Ou, mais especificamente, o xcrun simctl list devices
comando.
Eu sugiro que você use SimPholders para encontrar seus arquivos do Simulator. É um item da barra de menus que rastreia seus aplicativos de simulador e permite que você vá diretamente para suas pastas e conteúdo. É incrivel.
Achei a aplicação SimulatorManager muito útil. Leva você diretamente para a pasta do aplicativo dos simuladores instalados. Eu tentei com os simuladores 7.1, 8.0 e 8.1.
O SimulatorManager reside como um ícone na bandeja do sistema e fornece uma opção para "Iniciar no logon".
Nota : Isso funciona apenas com o Xcode 6 (6.1.1 no meu caso) e acima.
Espero que ajude!
Para saber onde seu arquivo .sqlite está armazenado no AppDelegate.m, adicione o seguinte código
- (NSURL *)applicationDocumentsDirectory
{
NSLog(@"%@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
return [[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject];
}
agora chame esse método no AppDelegate.m
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
//call here
[self applicationDocumentsDirectory];
}
Eu lutei com isso por algum tempo. Tornou-se uma enorme dor simplesmente acessar meu banco de dados sqlite local. Eu escrevi esse script e o fiz um trecho de código dentro do XCode. Coloco-o dentro do meu appDidFinishLaunching dentro do meu 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
Isso cria um simlink na raiz da sua unidade. (Talvez você precise criar essa pasta pela primeira vez e chmod, ou pode mudar a localização para outro local). Então instalei o plugin xcodeway https://github.com/onmyway133/XcodeWay
Eu o modifiquei um pouco para permitir que eu simplesmente pressione cmd + d e ele abrirá um enrolador de localização no diretório de documentos persistente do meu aplicativo atual. Dessa forma, não importa quantas vezes o XCode mude seu caminho, ele muda apenas na execução e atualiza seu simlink imediatamente a cada execução.
Espero que isso seja útil para os outros!
Open finder> Biblioteca> Desenvolvedor> CoreSimulator> Dispositivos
Em seguida, clique no ícone Alterar arranjo no localizador, selecione Data de adição
Selecione seu aplicativo> dados> Contêiner> dados> Aplicativos>
escolha seu aplicativo> Documentos> Aqui está o seu arquivo db
No meu caso:
/Users/pluto/Library/Developer/CoreSimulator/Devices/A75107D2-A535-415A-865D-978B2555370B/data/Containers/Data/Application/265A12BC-FF5B-4235-B5EF-6022B83754B4/Documents/dboPhotoBucket.sqlite
Caso contrário, faça o seguinte:
NSLog(@"app dir: %@",[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);
- Ele imprimirá o caminho completo para a pasta de dados.
Rápido:
let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
Use o Finder -> vá para a pasta e insira o caminho base especificado para acessar as pastas do aplicativo
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *basePath = ([paths count] > 0) ? [paths objectAtIndex:0] : nil;
NSLog(@"%@",basePath);
O simulador coloca o arquivo em ~ / Library / Developer / CoreSimulator / Devices / ... mas o caminho após / Devices é diferente para todos.
Use este método útil. Ele retorna o caminho do diretório temporário para o usuário atual e não aceita argumentos.
NSString * NSTemporaryDirectory ( void );
Portanto, na minha classe ViewController, costumo colocar essa linha no meu viewDidLoad apenas para uma referência quando preciso pegar meu arquivo armazenado no CoreData. Espero que isto ajude.
NSLog(@"FILE PATH :%@", NSTemporaryDirectory());
(Nota: para ir para o caminho, no menu localizador, clique em Ir e digite ~ / Library para abrir o diretório oculto; em seguida, na janela do Finder, clique no caminho mostrado no console.)
Esse local, mais uma vez, foi alterado, se você estiver usando o Swift, use-o para descobrir onde está a pasta (copiada do arquivo AppDelegate.swift que a Apple cria para você, portanto, se não funcionar em sua máquina, pesquise esse arquivo para a sintaxe correta, isso funciona no meu usando o simulador Xcode 6.1 e iOS 8):
let urls = NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory, inDomains: .UserDomainMask)
println("Possible sqlite file: \(urls)")
Os simuladores estão localizados em:
~/Library/Developer/CoreSimulator/
Aqui, eles são listados como diretórios com nomes de UUID. Use classificar por 'Data da modificação' para encontrar a mais recente. Dentro, navegue até:
/data/Containers/Data/Application/
Aqui você obterá uma lista de todos os aplicativos nesse dispositivo. Você pode classificar novamente para obter o aplicativo mais recente.
NOTA: O Xcode altera o nome do diretório toda vez que você executa o aplicativo, portanto, não confie em criar alias / atalhos na área de trabalho.
A maneira mais fácil é usar o aplicativo aqui , que faz tudo automaticamente.
Eu criei esse script que compactará o aplicativo mais recente criado para qualquer simulador e compactado na área de trabalho.
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"
No Swift 4 ou Swift 5 você pode usar NSHomeDirectory()
.
A maneira mais fácil no Xcode 10 (ou Xcode 11) é pausar seu aplicativo (como quando atinge um ponto de interrupção) e executar esta linha no console do depurador:
po NSHomeDirectory()
po
significa objeto de impressão e imprime a maioria das coisas
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
Com o Swift 4, você pode usar o código abaixo para obter o diretório inicial do seu aplicativo. O diretório de documentos do seu aplicativo está lá.
print(NSHomeDirectory())
Acho que você já sabe que o diretório inicial do seu aplicativo é mutável. Portanto, se você não deseja adicionar código adicional à sua base de código, o SimPholder é uma ótima ferramenta para você.
Além disso, você pode se perguntar: existe uma ferramenta que pode ajudar você a economizar tempo ao fechar e reabrir o mesmo banco de dados SQLite toda vez que o diretório inicial do seu aplicativo for alterado. E a resposta é sim, uma ferramenta que eu conheço é o SQLiteFlow . Do documento, diz que:
Manipule o nome do arquivo de banco de dados ou as alterações de diretório. Isso faz com que o SQLiteFlow possa funcionar de maneira amigável com o banco de dados SQLite no simulador do iOS.
Aqui está o sh para o último simulador e aplicação usados. Basta executar sh e copiar o texto impresso e colar e executar o comando para mostrar no localizador.
#!/bin/zsh
lastUsedSimulatorAndApplication=`ls -td -- ~/Library/Developer/CoreSimulator/Devices/*/data/Containers/Data/Application/*/ | head -n1`
echo $lastUsedSimulatorAndApplication