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?

Henry Glendening
źródło
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
Spójrz na ten link .. stackoverflow.com/questions/24133022/…
Tunvir Rahman Tusher
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
Scott Gardner
źródło
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.

ucangetit
źródło
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
źródło
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];

}
cześć mężczyzno
źródło
ś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)")
Nate Uni
źródło
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!

labraks
źródło
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)")
Nagarjun
źródło
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);
user1039695
źródło
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).

O mój
źródło
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)")
kakubei
źródło
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.

NSRover
źródło
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"
Andy
źródło
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

exp
źródło
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
źródło
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.

Tim
źródło
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
zapdroid
źródło