Local do suporte do aplicativo Xcode 6 iPhone Simulator

137

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?

Henry Glendening
fonte
Tente isso . Há um aplicativo que abre diretamente o diretório Documents da última execução do aplicativo.
NSRover 28/11
Adicionei uma resposta (na parte inferior das outras respostas) que mostra como obter programaticamente o caminho onde os arquivos de dados principais residem.
SpokaneDude
Dê uma olhada neste link .. stackoverflow.com/questions/24133022/…
Tunvir Rahman Tusher
Use "NSTemporaryDirectory ()". Veja aqui: stackoverflow.com/questions/1108076/…
Shubhendu

Respostas:

296

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
Scott Gardner
fonte
4
isso está correto em geral, mas parece que há mais alterações de pastas internas. Este é o caminho que funciona para mim no 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 uma maneira de entender que os números ou a força bruta são a única chance de acessar os dados?
vir us
89
NSLog (@ "app dir:% @", [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject]); - imprimirá o caminho completo para a pasta de dados
vir us
2
Eu precisava de um atalho persistente para o diretório de documentos do meu aplicativo, para depuração rápida. Após a aplicação, 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 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.
seabass
32
O xcrun simctl listcomando 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 devicescomando.
Thomasw
36

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.

ucangetit
fonte
Eu também estava tendo problemas com o SimPholders2 no Yosemite, então iniciei um script de linha de comando para ajudá-lo a encontrar e abrir uma janela do Finder no simulador e no aplicativo que você deseja. Ele percorre as pastas e as listas de metadados para listar todas as pastas e aplicativos do simulador. Se estiver interessado, confira aqui
Rodrigo Lima
O SimPholders2 funciona em Yosemite, mas é um pouco lento; Depois de clicar no ícone na barra de status, aguarde alguns segundos e ele deve aparecer.
Jason
Whoa, é impressionante e os trabalhos mais recentes com o Yosemite + Xcode 6.3!
TruMan1
21

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

insira a descrição da imagem aqui

Nota : Isso funciona apenas com o Xcode 6 (6.1.1 no meu caso) e acima.

Espero que ajude!

Amar
fonte
Amar, como você instala o SimulatorManager? Eu pensei que era um plugin para Xcode, mas é um projeto Xcode
malena
1
na barra superior, selecione: Produto -> Arquivo -> e, em seguida, Exportar o arquivo como um aplicativo Mac sem precisar assinar novamente (a última opção), você receberá um arquivo .app que pode ser colocado na pasta Aplicativo como um aplicativo normal. ..
Heckscheibe
11

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

}
Oi cara
fonte
grande .. especialmente útil quando há vários simuladores
Yasitha Waduge
6

Isso funcionou para mim rapidamente:

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

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!

Robalo
fonte
Obrigado, eu apenas atualizar XcodeWay para apoiar iOS 8 pasta simulador
onmyway133
3

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)")
Nagarjun
fonte
Swift 3.0:let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
AtomicBoolean
2

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);
user1039695
fonte
1

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

Oh meu
fonte
1

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)")
kakubei
fonte
1

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.

NSRover
fonte
1

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

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

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

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

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

Tim
fonte
0

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
zapdroid
fonte