iPhone模拟器存储其数据的位置在哪里?

280

我有一个SQLite数据库,用于存储应用程序数据,我需要查看其中的内容以调试遇到的问题。但是iPhone模拟器通常将其数据存储在哪个位置呢?

21个回答

323

针对 Xcode6+/iOS8+:

~/Library/Developer/CoreSimulator/Devices/[设备ID]/data/Containers/Data/Application/[应用ID]/

对于SDK 3.2,接受的答案是正确的 - SDK 4将路径中的/User文件夹替换为每个旧版iPhone OS/iOS版本可以模拟的编号,因此路径变为:

~/Library/Application Support/iPhone Simulator/[操作系统版本]/Applications/[应用程序GUID]/

如果您旁边安装了先前的SDK,则其3.1.x模拟器将继续在以下位置保存数据:

~/Library/Application Support/iPhone Simulator/User/Applications/[应用程序GUID]/


6
进入iPhone模拟器应用程序支持文件夹的命令是:cd ~/Library/Application\ Support/iPhone\ Simulator/ - Robert
212
不要在 Finder 中搜索哪个 GUID 是你的,注意下面 pisca46 的答案:只需在调试器中输入 po NSHomeDirectory(),然后将结果复制并粘贴到 Go > 转到文件夹(Cmd-Shift-G)中即可。 - mackworth
我有点担心,当我启动模拟器时,它显示的是8.2,但是当我查看这个文件夹时,我只看到了7.1版本号。这让我担心我可能在错误的地方查找。 - bugloaf
1
@bugloaf 请查看此问题 或者下面的答案 - Raviprakash
4
强调起来很难,但这个答案(如上面mackworth的评论所推荐的)更加简单、方便、少出错且不那么令人沮丧。您只需在AppDelegatedidFinishLaunchingWithOptions:中添加一行代码以使用NSLog输出它,或者您可以从调试器中键入po NSHomeDirectory()。无论哪种情况,都要复制字符串并使用Cmd + Shift + G组合键在finder中打开它。这样做更好,因为您是通过标准命令进行“询问”,而不需要了解某个变化的具体内容。 - Benjohn
显示剩余3条评论

136

最简单的方法。

  1. 在某个断点处中断程序执行。 (或者像Najdan Tomić在评论中提到的那样,在调试区域上点击暂停)

  2. 控制台窗口中输入po NSHomeDirectory()

结果:

(lldb) po NSHomeDirectory() /Users/usernam/Library/Developer/CoreSimulator/Devices/4734F8C7-B90F-4566-8E89-5060505E387F/data/Containers/Data/Application/395818BB-6D0F-499F-AAFE-068A783D9753


5
如果我早知道这件事情就好了。这应该是正确答案。 - Ivan Cantarino
我认为其他所有答案也是正确的。但这对我来说似乎很容易 :-] - Lal Krishna
8
您可以在不捕获断点的情况下使它更容易。暂停程序执行(在调试区域中点击暂停按钮),然后在调试导航器中点击“main”,在lldb窗口中执行“po NSHomeDirectory()”。 - Najdan Tomić
如果你将这个文件夹拖到Dock栏,它会自动更新引用,因为每次新的构建都会改变App-ID。 - Hardy_Germany
我在VSCode的调试控制台中输入了这段代码,但在断点处出现了错误:错误:预期一个表达式,但发现了额外的输入。 po NSHomeDirectory() ^^^^^^^^^^^^^^^po本身并不存在作为一个命令。 - undefined
@Dominic 不太确定在VSCode中如何操作。但是在Xcode中应该可以正常运行。 - undefined

124

除了使用终端之外,还有一种(更快的?)方式可以找到应用程序数据所在的位置:

  1. 在模拟器中启动应用程序
  2. 打开“活动监视器”
  3. 在CPU选项卡中找到应用程序名称
  4. 双击它并打开“打开文件和端口”

输入图像描述


2
NSString *uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 可以获取设备标识符。 - dev4life
@oabarca,你获取的标识符与模拟器的deviceID或appFolder无关;我正在使用Xcode 11.2.1和iOS 13.2.2。 - DawnSong

77

找到了:

~/Library/Application Support/iPhone Simulator/User/

16
如何搜索:在Finder中按下CMD+SHIFT+G - rohan-patel
请查看dsmudger的最新回复,这是目前正确的答案。 - Tom Susel
2
过时了- 不再起作用 - stoefln

75

iOS 8 ~/Library/Developer/CoreSimulator/Devices/[设备ID]/data/Applications/[应用GUID]/Documents/


1
有没有获取设备ID的方法? - msmq
2
尝试使用 xcrun instruments -s 命令。 - Shazron
如何在这里找到[appGUID]? - Yang You
按“修改日期”排序。您当前的构建将(很可能)是最新的。 - Matt
无论是在Xcode还是模拟器中,都没有“硬件”菜单。 - Andrew Koster

65

在 Lion 系统中,Users/[username]/Library 是被隐藏的。

要在 Finder 中查看,点击屏幕顶部的“前往”菜单,并按住“option”键以显示“Library”选项。

点击“Library”即可查看之前被隐藏的库文件夹。

之前建议:

使用

chflags nohidden /users/[username]/library
在终端中显示文件夹。

1
然后你可以在以下位置找到它: ~/Library/Application Support/iPhone Simulator/[操作系统版本]/Applications/[应用程序GUID]/ - Rafael Moreira
这是一个有趣的建议,适用于普通用户,但我认为iOS / OS X开发人员需要经常访问库,因此不希望它再次隐藏。(不过,我猜很多开发人员使用终端而不是Finder?) - ArtOfWarfare

52

如果模拟器正在运行,您可以获取任何应用程序容器的路径:

xcrun simctl get_app_container booted <app bundle identifier>

示例输出:

$ xcrun simctl get_app_container booted com.example.app
/Users/jappleseed/Library/Developer/CoreSimulator/Devices/7FB6CB8F-63CB-4F27-BDAB-884814DA6FE0/data/Containers/Bundle/Application/466AE987-76BC-47CF-A207-266E65E7DE0A/example.app

“booted”可以替换为大多数需要设备UDID的simctl命令。

您可以使用xcrun simctl list查看设备列表,并使用xcrun simctl help获取有关特定命令的帮助信息。

更新:应广大用户要求,Xcode 8.3中现在可以通过添加“app”、“data”、“groups”或应用程序组标识符来指定所需的容器类型。

要获取数据容器:

$ xcrun simctl get_app_container booted com.example.app data

1
优秀的程序。不需要运行命令获取设备ID和应用ID。一步即可获取全部信息。 - iamhite
1
这个应该被接受,因为这是做这种事情最“稳定”的方式。 - olha
强烈推荐...这比其他答案简单多了。 - stuckj

37

使用 Xcode 5,您可以使用以下代码:

#import <Foundation/NSFileManager.h>

并且:

NSString *homeDir = NSHomeDirectory();
NSLog(@"%@",homeDir);
结果可能看起来像:
"/Users/<your user name>/Library/Application Support/iPhone Simulator/7.1/Applications/hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh"

其中hhhhhhhh-hhhh-hhhh-hhhh-hhhhhhhhhhhh是一个十六进制字符串,用于标识您的iOS应用程序。


16
在调试器中也可以使用这个命令:po NSHomeDirectory() - mackworth

32

寻找应用程序在模拟器中所在位置最简单的方法之一是使用 "NSTemporaryDirectory()"

步骤如下:

  1. 在应用程序中的任何位置设置断点并运行应用程序。
  2. 当应用程序停止在断点处时,在Xcode控制台中键入以下命令。

    po NSTemporaryDirectory()

请参见下面的图片以获得更好的理解enter image description here

现在你可以精确地找到临时文件夹所在的路径。 你可以返回并查看所有与应用程序相关的文件夹。

希望这也有所帮助。 Happy Coding :)


1
很棒的提示,但为什么不用 po NSHomeDirectory() 呢? - Code Roadie

30

看起来Xcode 6.0又一次将此位置移动了,至少对于iOS 8模拟器来说。

~/Library/Developer/CoreSimulator/Devices/[DeviceID]/data/Containers/Data/Application/[AppID]


4
在路径~/Library/Developer/CoreSimulator/Devices/[DeviceID]/下,还有一个名为"device.plist"的 .plist 文件。如果你打开这个文件,你就能找到设备名称,比如 iphone-6 或者 iphone-5s。由于 deviceID 很容易混淆,所以我建议你查看一下 .plist 文件的内容。 - EFE
1
如何获取AppID? - Display Name
1
我作弊地使用了“ls -l”命令,找到了应用程序的ID,并推断出哪个应用程序的文件是最近创建的。这种方法可能对其他人也有用。 - Maya Webster
1
或者在Finder中按“创建日期”排序,以使应用程序位于列表顶部。 - Ammar Mujeeb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接