Lokalizacja wsparcia aplikacji Xcode 6 iPhone Simulator


137

W Xcode 6 mam aplikację, w której używam danych podstawowych, ale nie ma folderu w obsłudze aplikacji dla symulatora iPhone'a iOS 8. Gdzie są przechowywane moje pliki i baza danych Core Data sqlite?


Spróbuj tego . Istnieje aplikacja, która bezpośrednio otwiera katalog Dokumenty z najnowszą uruchomioną aplikacją.
NSRover

Dodałem odpowiedź (na dole innych odpowiedzi), która pokazuje, jak programowo uzyskać ścieżkę, w której znajdują się pliki Core Data.
SpokaneDude


Użyj „NSTemporaryDirectory ()”. Spójrz na to
Shubhendu

Odpowiedzi:


296

Katalog symulatora został przeniesiony wraz z Xcode 6 beta do ...

~/Library/Developer/CoreSimulator

Przeglądanie katalogu do folderu Dokumenty aplikacji jest nieco bardziej uciążliwe, np.

~/Library/Developer/CoreSimulator/Devices/4D2D127A-7103-41B2-872B-2DB891B978A2/data/Containers/Data/Application/0323215C-2B91-47F7-BE81-EB24B4DA7339/Documents/MyApp.sqlite

4
jest to ogólnie poprawne, ale wydaje się, że jest więcej zmian w folderach wewnętrznych. To jest ścieżka, która działa dla mnie w Xcode Beta 3:~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
harryhorn,

1
Czy istnieje sposób, aby zrozumieć, że liczby lub brutalna siła to jedyna szansa na dotarcie do danych?
nas

89
NSLog (@ "katalog aplikacji:% @", [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject]); - drukuje pełną ścieżkę do folderu danych
vir nam

2
Potrzebowałem trwałego skrótu do katalogu dokumentów mojej aplikacji w celu szybkiego debugowania. Po zastosowaniu 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 Teraz mam simlink, który działa, mimo że iOS8 + XCode6 zmienia identyfikator GUID danych mojej aplikacji za każdym razem, gdy buduję.
labraks

32
xcrun simctl listKomenda może być używana do sprawdzania korespondencji pomiędzy nazwami i symulator do identyfikatorów urządzeń. A dokładniej xcrun simctl list devicespolecenie.
ThomasW

36

Sugerowałbym, abyś użył SimPholder do znalezienia plików symulatora. Jest to element paska menu, który śledzi aplikacje symulatora i pozwala przejść bezpośrednio do ich folderów i zawartości. To jest zajebiste.


Miałem również problemy z SimPholderami2 w Yosemite, więc uruchomiłem skrypt wiersza poleceń, który pomoże Ci znaleźć i otworzyć okno Findera do symulatora i wybranej aplikacji. Przechodzi przez foldery i listy metadanych, aby wyświetlić wszystkie foldery i aplikacje symulatora. Jeśli jesteś zainteresowany, sprawdź tutaj
Rodrigo Lima

SimPholder2 działa w Yosemite, ale jest trochę powolne; po kliknięciu ikony na pasku stanu poczekaj kilka sekund, a powinna się pojawić.
Jason

Whoa, to niesamowite i najnowsze działa z Yosemite + Xcode 6.3!
TruMan1,

21

Uważam, że aplikacja SimulatorManager jest bardzo przydatna. Przenosi Cię bezpośrednio do folderu aplikacji zainstalowanych symulatorów. Próbowałem z symulatorami 7.1, 8.0 i 8.1.

SimulatorManager znajduje się w postaci ikony w zasobniku systemowym i udostępnia opcję „Uruchom przy logowaniu”.

wprowadź opis obrazu tutaj

Uwaga : działa to tylko z Xcode 6 (w moim przypadku 6.1.1) i nowszymi.

Mam nadzieję, że to pomoże!


Amar, jak zainstalować SimulatorManager? Myślałem, że to wtyczka do Xcode, ale jest to projekt Xcode
malena

1
w górnym pasku wybierz: Produkt -> Archiwum -> a następnie Eksportuj archiwum jako aplikację Mac bez ponownego podpisywania (ostatnia opcja) otrzymasz plik .app, który możesz umieścić w folderze aplikacji jak zwykła aplikacja. ..
Heckscheibe,

11

Aby dowiedzieć się, gdzie jest przechowywany plik .sqlite w pliku AppDelegate.m, dodaj następujący kod

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

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

teraz wywołaj tę metodę w AppDelegate.m

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

  //call here
   [self applicationDocumentsDirectory];

}

świetnie… szczególnie przydatne, gdy istnieje wiele symulatorów
Yasitha Waduge

6

To zadziałało szybko:

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

3

Zmagałem się z tym przez jakiś czas. Po prostu dotarcie do mojej lokalnej bazy danych sqlite stało się ogromnym problemem. Napisałem ten skrypt i zrobiłem z niego fragment kodu wewnątrz XCode. Umieszczam go w mojej aplikacjiDidFinishLaunching inside my 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

Tworzy to łącze simlink w katalogu głównym dysku. (Być może za pierwszym razem będziesz musiał samodzielnie utworzyć ten folder i chmod go lub możesz zmienić lokalizację w inne miejsce) Następnie zainstalowałem wtyczkę xcodeway https://github.com/onmyway133/XcodeWay

Zmodyfikowałem go trochę tak, że pozwoli mi po prostu nacisnąć cmd + d i otworzy wyszukiwarkę winder do katalogu trwałych dokumentów mojej bieżącej aplikacji. W ten sposób, niezależnie od tego, ile razy XCode zmienia twoją ścieżkę, zmienia się tylko podczas działania i aktualizuje twoje łącze simlink natychmiast po każdym uruchomieniu.

Mam nadzieję, że jest to przydatne dla innych!


Dzięki, właśnie zaktualizowałem XcodeWay, aby obsługiwał folder symulatora iOS 8
onmyway133

3

Otwórz wyszukiwarkę> Biblioteka> Deweloper> CoreSimulator> Urządzenia

Następnie ikonę Zmień układ z wyszukiwarki wybierz Data dodania

Wybierz swoją aplikację> dane> Kontener> dane> Aplikacje>

wybierz swoją aplikację> Dokumenty> Oto Twój plik db

W moim przypadku:

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

W przeciwnym razie zrób to:

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

- Wyświetli pełną ścieżkę do folderu danych.

Szybki:

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

Swift 3.0:let dirPaths = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true) print("App Path: \(dirPaths)")
AtomicBoolean

2

Użyj Findera -> przejdź do folderu i wprowadź podaną ścieżkę bazową, aby dotrzeć do folderów aplikacji

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

NSLog(@"%@",basePath);

1

Symulator umieszcza plik w katalogu ~ / Library / Developer / CoreSimulator / Devices / ..., ale ścieżka po / Devices jest inna dla każdego.

Użyj tej poręcznej metody. Zwraca ścieżkę do katalogu tymczasowego dla bieżącego użytkownika i nie przyjmuje argumentów.

NSString * NSTemporaryDirectory ( void );

Dlatego w mojej klasie ViewController zwykle umieszczam ten wiersz w moim viewDidLoad tylko jako odniesienie, gdy muszę pobrać mój przechowywany plik CoreData. Mam nadzieję że to pomoże.

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

(Uwaga: aby przejść do ścieżki, w menu wyszukiwarki kliknij Idź i wpisz ~ / Library, aby otworzyć ukryty katalog, a następnie w oknie Findera możesz kliknąć ścieżkę wyświetlaną na konsoli).


1

Ta lokalizacja ponownie się zmieniła, jeśli używasz Swift, użyj tego, aby dowiedzieć się, gdzie jest folder (jest to kopiowane z pliku AppDelegate.swift, który tworzy dla Ciebie Apple, więc jeśli nie działa na twoim komputerze, wyszukaj w ten plik dla odpowiedniej składni, działa to na moim przy użyciu symulatora Xcode 6.1 i iOS 8):

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

1

Symulatory znajdują się pod:

~/Library/Developer/CoreSimulator/

Tutaj są wymienione jako katalogi z nazwami UUID. Użyj opcji sortowania według „Daty modyfikacji”, aby znaleźć najnowszą. Wewnątrz przejdź do:

/data/Containers/Data/Application/

Tutaj otrzymasz listę wszystkich aplikacji na tym urządzeniu. Możesz ponownie posortować to, aby pobrać najnowszą aplikację.

UWAGA: Xcode zmienia nazwę katalogu za każdym razem, gdy uruchamiasz aplikację, więc nie polegaj na tworzeniu aliasów / skrótów na pulpicie.

Najłatwiej jest użyć tutaj aplikacji , która robi wszystko automatycznie.


1

Stworzyłem ten skrypt, który spakuje najnowszą aplikację zbudowaną dla dowolnego symulatora i spakuje ją na pulpit.

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"

1

W Swift 4 lub Swift 5 możesz użyć NSHomeDirectory().

Najłatwiejszym sposobem w Xcode 10 (lub Xcode 11) jest wstrzymanie aplikacji (np. Gdy osiągnie punkt przerwania) i uruchomienie tego wiersza w konsoli debugera:

po NSHomeDirectory()

po oznacza drukowany obiekt i drukuje większość rzeczy


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

0
  1. Dzięki Swift 4 możesz użyć poniższego kodu, aby uzyskać katalog domowy swojej aplikacji. Tam znajduje się katalog dokumentów Twojej aplikacji.

    print(NSHomeDirectory())

  2. Myślę, że już wiesz, że katalog domowy twojej aplikacji jest zmienny, więc jeśli nie chcesz dodawać dodatkowego kodu do swojej bazy kodu, SimPholder jest dla Ciebie miłym narzędziem.

  3. Co więcej, możesz się zastanawiać, czy istnieje narzędzie, które pomoże Ci zaoszczędzić czas związany z zamykaniem i ponownym otwieraniem tej samej bazy danych SQLite za każdym razem po zmianie katalogu domowego aplikacji. Odpowiedź brzmi: tak, narzędziem, które znam, jest SQLiteFlow . Z jego dokumentu jest napisane, że:

    Obsługa zmian nazw plików lub katalogów bazy danych. To sprawia, że ​​SQLiteFlow może współpracować z bazą danych SQLite w symulatorze iOS.


0

Oto sh dla ostatnio używanego symulatora i aplikacji. Po prostu uruchom sh i skopiuj wydrukowany tekst i wklej i uruchom polecenie pokazu w Finderze.

#!/bin/zsh

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

echo $lastUsedSimulatorAndApplication
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.