Xcode 6 iPhone Simulator应用程序支持位置


137

在Xcode 6中,我有一个正在使用Core Data的应用程序,但“应用程序支持”中没有针对iOS 8 iPhone Simulator的文件夹。我的文件和Core Data sqlite数据库存储在哪里?


试试这个。有一个应用程序可以直接打开最新应用程序运行的“文档”目录。
NSRover

我添加了一个答案(在其他答案的底部),该答案显示了如何以编程方式获取Core Data文件所在的路径。
SpokaneDude 2015年


使用“ NSTemporaryDirectory()”。看看这个- stackoverflow.com/questions/1108076/...
Shubhendu

Answers:


296

模拟器目录已随Xcode 6 Beta移至...

~/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/
有用

1
有没有办法理解数字或蛮力是获取数据的唯一机会?
vir我们

89
NSLog(@“ app dir:%@”,[[[[NSFileManager defaultManager] URLsForDirectory:NSDocumentDirectory inDomains:NSUserDomainMask] lastObject]);-将打印数据文件夹的完整路径
vir us

2
我需要一个到我应用程序文档目录的持久快捷方式,以便进行快速调试。应用后执行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 现在,即使我每次构建时iOS8 + XCode6都会更改应用程序的数据GUID,我也可以使用simlink。
鲈鱼

32
xcrun simctl list命令可用于查看模拟器名称和设备UDID之间的对应关系。或更具体地说是xcrun simctl list devices命令。
ThomasW 2014年

36

我建议您使用SimPholders查找模拟器文件。这是一个菜单栏项,可跟踪您的模拟器应用程序,并让您直接转到其文件夹和内容。这很棒。


我在优胜美地(Yosemite)上的SimPholders2也遇到了问题,所以我启动了一个命令行脚本来帮助您找到并打开所需模拟器和应用程序的Finder窗口。它遍历文件夹和元数据文件夹以列出所有模拟器文件夹和应用程序。如果有兴趣,请在这里查看
Rodrigo Lima 2015年

SimPholders2在优胜美地工作,但是有点慢。单击状态栏中的图标后,只需等待几秒钟,它就会出现。
杰森

真棒,它与Yosemite + Xcode 6.3兼容,最新作品!
TruMan1 2015年

21

我发现SimulatorManager应用程序非常有用。它直接将您带到已安装的模拟器的应用程序文件夹。我已经尝试使用7.1、8.0和8.1模拟器。

SimulatorManager作为图标驻留在系统任务栏中,并提供“登录时启动”选项。

在此处输入图片说明

注意:这仅适用于Xcode 6(在我的情况下为6.1.1)和更高版本。

希望有帮助!


Amar,您如何安装SimulatorManager?我以为这是Xcode的插件,但它是Xcode项目
malena

1
在顶部栏中选择:产品->存档->,然后将存档导出为Mac应用程序而无需重新签名(最后一个选项),您将获得一个.app文件,您可以像正常应用程序一样将其放置在Application文件夹中。 ..
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];

}

很棒..当有多个模拟器时特别有用
Yasitha Waduge

6

这对我迅速起作用:

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

3

我为此花了一段时间。简单地进入我本地的sqlite数据库变得非常痛苦。我编写了此脚本,并在XCode中将其作为代码段。我将其放在appDelegate的appDidFinishLaunching内部。


//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,它将打开finder winder到当前应用程序的持久Documents目录。这样,无论XCode更改路径多少次,它都只会在运行时更改,并且每次运行时都会立即更新simlink。

我希望这对其他人有用!


谢谢,我只是更新XcodeWay以支持iOS 8模拟器文件夹
onmyway133

3

打开查找器>库>开发人员> CoreSimulator>设备

然后从查找程序中更改安排图标,选择添加日期

选择您的应用程序> data> Container> data> Applications>

选择您的应用程序> Documents> 这是您的db文件

就我而言:

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

-它将打印数据文件夹的完整路径。

迅速:

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类中,通常当我需要获取CoreData存储的文件时,通常将此行放入viewDidLoad中,以供参考。希望这可以帮助。

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

(注意:要转到路径,请从finder菜单中单击Go并键入〜/ Library打开隐藏目录,然后在Finder窗口中单击控制台上显示的路径。)


1

此位置再次更改,如果使用Swift,请使用此位置查找文件夹的位置(此位置是从Apple为您创建的AppDelegate.swift文件中复制的,因此如果它在您的计算机上不起作用,请在该文件以正确的语法显示,该文件在我的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可以与iOS模拟器中的SQLite数据库友好地工作。


0

这是最后使用的模拟器和应用程序的sh。只需运行sh并复制打印的文本并粘贴并运行命令以在finder中显示。

#!/bin/zsh

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

echo $lastUsedSimulatorAndApplication
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.