Расположение поддержки приложения Xcode 6 iPhone Simulator


137

В Xcode 6 у меня есть приложение, в котором я использую Core Data, но в Application Support для iOS 8 iPhone Simulator нет папки. Где хранятся мои файлы и база данных sqlite Core Data?


Попробуйте это . Существует приложение, которое напрямую открывает каталог документов последнего запущенного приложения.
NSRover

Я добавил ответ (внизу других ответов), который показывает, как программно получить путь, по которому находятся файлы Core Data.
SpokaneDude 01

Взгляните на эту ссылку .. stackoverflow.com/questions/24133022/…
Tunvir Rahman Tusher

Используйте «NSTemporaryDirectory ()». Посмотрите это
Шубхенду

Ответы:


296

Каталог симулятора был перемещен с бета-версией Xcode 6 в ...

~/Library/Developer/CoreSimulator

Просмотр каталога в папке Documents вашего приложения немного сложнее, например,

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

4
в целом это правильно, но похоже, что изменений внутренней папки больше. Это путь, который работает для меня в Xcode Beta 3:~/Library/Developer/CoreSimulator/Devices/B2C6629C-998D-4E84-9ADB-06CAF5BA4B89/data/Containers/Data/Application/62593001-FADA-4647-AA80-FE9973956C05/Documents/
harryhorn

1
Есть ли способ понять, что числа или грубая сила - единственный шанс получить данные?
vir us

89
NSLog (@ "каталог приложения:% @", [[[NSFileManager defaultManager] URLsForDirectory: NSDocumentDirectory inDomains: NSUserDomainMask] lastObject]); - напечатает полный путь к папке с данными
vir us

2
Мне нужен был постоянный ярлык для каталога документов моего приложения для быстрой отладки. После того как приложение сделал FinishLaunchingWithOptions. #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 Теперь у меня есть simlink, который работает, хотя iOS8 + XCode6 меняет GUID данных моего приложения каждый раз, когда я создаю.
seabass

32
xcrun simctl listКоманда может быть использована , чтобы увидеть соответствие между именами тренажеров и UDIDs устройств. Или, точнее, xcrun simctl list devicesкоманду.
ThomasW 02

36

Я бы посоветовал вам использовать SimPholder для поиска файлов симулятора. Это элемент строки меню, который отслеживает ваши приложения-симуляторы и позволяет вам переходить непосредственно к их папкам и содержимому. Это круто.


У меня также были проблемы с SimPholder2 в Йосемити, поэтому я запустил сценарий командной строки, чтобы помочь вам найти и открыть окно Finder для симулятора и приложения, которое вы хотите. Он просматривает папки и списки метаданных, чтобы перечислить все папки и приложения симулятора. Если интересно, посмотрите здесь
Родриго Лима

SimPholder2 работает в Йосемити, но немного медленнее; как только вы щелкнете значок в строке состояния, подождите несколько секунд, и он должен появиться.
Джейсон

Ух ты, это круто и последняя работа с Yosemite + Xcode 6.3!
TruMan1

21

Я нашел приложение SimulatorManager очень полезным. Вы попадете прямо в папку приложений установленных симуляторов. Я пробовал с симуляторами 7.1, 8.0 и 8.1.

SimulatorManager отображается в виде значка на панели задач и предоставляет возможность «Запускать при входе в систему».

введите описание изображения здесь

Примечание . Это работает только с Xcode 6 (в моем случае - 6.1.1) и выше.

Надеюсь, это поможет!


Амар, как установить SimulatorManager? Я думал, что это плагин к Xcode, но это проект Xcode
Malena

1
на верхней панели выберите: Продукт -> Архив ->, а затем Экспортировать архив как приложение Mac без повторной подписи (последний вариант), вы получите файл .app, который вы можете поместить в папку приложения, как обычное приложение. ..
Heckscheibe

11

Чтобы узнать, где ваш файл .sqlite хранится в вашем AppDelegate.m, добавьте следующий код

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

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

теперь вызовите этот метод в AppDelegate.m

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

  //call here
   [self applicationDocumentsDirectory];

}

отлично .. особенно полезно, когда есть несколько симуляторов
Ясита Вадуге

6

Это сработало для меня быстро:

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

3

Некоторое время я боролся с этим. Просто добраться до моей локальной базы данных sqlite стало огромной болью. Я написал этот скрипт и сделал его фрагментом кода внутри XCode. Я помещаю его в свой appDidFinishLaunching внутри моего 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

Это создает simlink в корне вашего диска. (Возможно, вам придется создать эту папку самостоятельно в первый раз и выполнить ее chmod, или вы можете изменить местоположение на другое место) Затем я установил плагин xcodeway https://github.com/onmyway133/XcodeWay

Я немного изменил его, чтобы я мог просто нажать cmd + d и открыть средство поиска в постоянном каталоге документов моего текущего приложения. Таким образом, независимо от того, сколько раз XCode изменяет ваш путь, он изменяется только при запуске и обновляет вашу simlink сразу при каждом запуске.

Надеюсь, это будет полезно для других!


Спасибо, я только что обновил XcodeWay для поддержки папки симулятора iOS 8
onmyway133

3

Откройте Finder> Библиотека> Разработчик> CoreSimulator> Устройства

Затем значок «Изменить расположение» в искателе выберите «Дата добавления».

Выберите свое приложение> данные> контейнер> данные> приложения>

выберите свое приложение> Документы> Вот ваш файл БД

В моем случае:

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

В противном случае сделайте это:

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

- Будет напечатан полный путь к папке с данными.

Swift:

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

Используйте Finder -> перейдите в папку и введите указанный базовый путь для доступа к папкам приложений.

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

NSLog(@"%@",basePath);

1

Симулятор помещает файл в ~ / Library / Developer / CoreSimulator / Devices / ... но путь после / Devices у всех разный.

Воспользуйтесь этим удобным методом. Он возвращает путь к временному каталогу для текущего пользователя и не принимает аргументов.

NSString * NSTemporaryDirectory ( void );

Поэтому в моем классе ViewController я обычно помещаю эту строку в свой viewDidLoad только для справки, когда мне нужно получить файл, хранящийся в CoreData. Надеюсь это поможет.

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

(Примечание: чтобы перейти к пути, в меню поиска нажмите «Перейти» и введите ~ / Library, чтобы открыть скрытый каталог, затем в окне Finder вы можете щелкнуть путь, указанный на консоли.)


1

Это местоположение снова было изменено, если вы используете Swift, используйте его, чтобы узнать, где находится папка (он скопирован из файла AppDelegate.swift, который Apple создает для вас, поэтому, если он не работает на вашем компьютере, выполните поиск в этот файл для правильного синтаксиса, это работает на моем с использованием симулятора Xcode 6.1 и iOS 8):

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

1

Тренажеры расположены под:

~/Library/Developer/CoreSimulator/

Здесь они перечислены как каталоги с именами UUID. Используйте сортировку по дате изменения, чтобы найти самую последнюю. Внутри перейдите к:

/data/Containers/Data/Application/

Здесь вы получите список всех приложений на этом устройстве. Вы можете снова отсортировать это, чтобы получить последнюю версию приложения.

ПРИМЕЧАНИЕ. Xcode изменяет имя каталога каждый раз, когда вы запускаете приложение, поэтому не полагайтесь на создание псевдонимов / ярлыков на рабочем столе.

Самый простой способ - использовать здесь приложение , которое делает все автоматически.


1

Я создал этот скрипт, который заархивирует последнее приложение, созданное для любого симулятора, и закрепит его на рабочем столе.

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

В Swift 4 или Swift 5 можно использовать NSHomeDirectory().

Самый простой способ в Xcode 10 (или Xcode 11) - приостановить ваше приложение (например, когда оно достигает точки останова) и запустить эту строку в консоли отладчика:

po NSHomeDirectory()

po обозначает объект печати и печатает большинство вещей


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. В Swift 4 вы можете использовать приведенный ниже код, чтобы получить домашний каталог вашего приложения. Каталог документов вашего приложения находится там.

    print(NSHomeDirectory())

  2. Я думаю, вы уже знаете, что домашний каталог вашего приложения можно изменить, поэтому, если вы не хотите добавлять дополнительный код в свою кодовую базу, SimPholder - отличный инструмент для вас.

  3. Более того, вы можете задаться вопросом, есть ли инструмент, который поможет вам сэкономить время на закрытии и повторном открытии той же базы данных SQLite каждый раз после изменения домашнего каталога вашего приложения. И ответ - да, я знаю инструмент SQLiteFlow . В этом документе говорится, что:

    Обрабатывать имя файла базы данных или изменения каталога. Благодаря этому SQLiteFlow может работать с вашей базой данных SQLite в симуляторе iOS.


0

Вот sh для последнего использованного симулятора и приложения. Просто запустите sh, скопируйте напечатанный текст, вставьте и запустите команду для показа в Finder.

#!/bin/zsh

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

echo $lastUsedSimulatorAndApplication
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.