Xcode 6 iPhone 模拟器应用程序支持位置

在 Xcode 6中,我有一个使用核心数据的应用程序,但是在 iOS 8 iPhone 模拟器的应用程序支持中没有文件夹。我的文件和核心数据 sqlite 数据库存储在哪里?

119008 次浏览

模拟器目录已经随 Xcode 6 beta 移动到..。

~/Library/Developer/CoreSimulator

将目录浏览到应用程序的“文档”文件夹有点困难,例如,

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

我纠结了一段时间。简单地访问我的本地 sqlite 数据库就变成了一个巨大的痛苦。我编写了这个脚本,并将其作为 XCode 内部的代码片段。我把它放在我的 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,它将打开一个查找器,查找当前应用程序的持久文档目录。这样,无论 XCode 更改您的路径多少次,它都只在运行时更改,并且在每次运行时立即更新您的 simlink。

我希望这对其他人有用!

使用 Finder —— > 转到文件夹并输入给定的基路径以到达应用程序文件夹

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


NSLog(@"%@",basePath);

要了解. sqlite 文件存储在 App暮光中的位置,请添加以下代码

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


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

现在,在 AppRegiate.m 中调用这个方法

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


//call here
[self applicationDocumentsDirectory];


}

我建议您使用 辛普森持有人来找到您的模拟器文件。它是一个菜单栏项目,跟踪您的模拟器应用程序,让您直接到他们的文件夹和内容。太棒了。

模拟器将文件放入 ~/Library/Developer/CoreSimulator/Devices/... 但是/Device 之后的路径对每个人来说都是不同的。

使用这个方便的方法。它返回当前用户临时目录的路径,并且不接受任何参数。

NSString * NSTemporaryDirectory ( void );

所以在我的 ViewController 类中,当我需要获取 CoreData 存储文件时,我通常将这一行放在 viewDidLoad 中作为参考。希望这个能帮上忙。

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

(注意: 要进入路径,从查找器菜单单击 Go 并键入 ~/Library 打开隐藏目录,然后在查找器窗口中单击控制台上显示的路径。)

这个位置又一次改变了,如果使用 Swift,使用这个来找出文件夹的位置(这是从苹果为你创建的 AppDeliate.Swift 文件中复制的,所以如果它不能在你的机器上工作,在这个文件中搜索正确的语法,这在我的使用 Xcode 6.1和 iOS 8模拟器工作) :

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

模拟器位于:

~/Library/Developer/CoreSimulator/

在这里,它们被列为具有 UUID 名称的目录。使用“修改日期”排序来查找最新的日期。内部导航:

/data/Containers/Data/Application/

在这里,您将获得该设备上所有应用程序的列表。您可以再次排序,以获得最新的应用程序。

注意: Xcode 在每次运行应用程序时都会更改目录名,所以不要依赖于在桌面上创建别名/快捷方式。

最简单的方法是使用应用程序 给你,它会自动完成所有工作。

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

SimulatorManager 作为一个图标驻留在系统托盘中,并提供了“启动登录”选项。

enter image description here

注意 : 这只适用于 Xcode 6(在我的例子中是6.1.1)及以上版本。

希望能帮上忙!

打开查找器 > 库 > 开发人员 > 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]);

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

斯威夫特:

let dirPaths = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)
println("App Path: \(dirPaths)")
 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

这对我来说很快就奏效了:

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

我创建了这个脚本,它将压缩为任何模拟器构建的最新应用程序,并将其压缩到桌面。

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,您可以使用下面的代码获取应用程序的主目录。你应用的文档目录就在里面。

    print(NSHomeDirectory())

  2. 我想你已经知道你的应用程序的主目录是可变的,所以如果你不想添加额外的代码到你的代码库,SimPholder是一个很好的工具。

  3. 此外,您可能想知道是否有一个工具,可以帮助您在每次更改应用程序的主目录后,关闭和重新打开相同的 SQLite 数据库,从而节省时间。答案是肯定的,我知道一个工具是 SQLiteFlow。从它的文件,它说:

    处理数据库文件名或目录更改。这使得 SQLiteFlow 可以在 iOS 模拟器中友好地使用 SQLite 数据库。

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

#!/bin/zsh


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


echo $lastUsedSimulatorAndApplication

在 Swift 4或者 Swift 5中你可以使用 NSHomeDirectory()

在 Xcode 10(或者 Xcode 11)中,最简单的方法就是暂停你的应用程序(比如当它遇到一个断点) ,然后在调试器控制台中运行下面这行代码:

po NSHomeDirectory()

po代表打印对象,打印大多数东西