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


234

我有一个用于存储应用程序数据的SQLite数据库,我可以查看其中的内容以调试遇到的问题-但是iPhone Simulator通常将数据存储在哪里?

Answers:


290

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

〜/图书馆/应用程序支持/ iPhone模拟器/ [OS版本] /应用程序/ [appGUID] /

如果同时安装了以前的SDK,则其3.1.x模拟器将继续将其数据保存在:

〜/图书馆/应用程序支持/ iPhone模拟器/用户/应用程序/ [appGUID] /

对于Xcode6和iOS8

〜/库/开发人员/ CoreSimulator /设备/ [设备ID] /数据/容器/数据/应用程序/ [AppID] /


6
cd ~/Library/Application\ Support/iPhone\ Simulator/
罗伯特

174
请注意pisca46的答案,而不是在您的GUID中查找该查找器:只需键入po NSHomeDirectory()调试器即可。剪切并粘贴到“转到”>“转到文件夹”(Cmd-Shift-G)中。
mackworth 2014年

我有点担心,当我启动模拟器时它会显示8.2,但是当我查看此文件夹时,我看到的唯一版本号是7.1。这让我担心自己在错误的地方寻找。
bugloaf 2015年


4
很难强调这个答案有多少更简单,更方便,更不易出错且更不会令人沮丧(如上述mackworth的评论所建议)。你可以简单地添加一行到NSLog这个在你AppDelegatedidFinishLaunchingWithOptions:,或者你可以po NSHomeDirectory()从调试器。无论哪种情况,都请复制该字符串,然后使用在搜索器中将其打开Cmd+Shift+G。这工作得更好,因为你要求的标准命令,而不是需要到知道的东西改变。
约翰

93

还有另一种(更快的?)方法来查找没有Terminal的应用程序数据的位置:

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

在此处输入图片说明


1
NSString *uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString];给您设备标识符
oabarca '16

@oabarca您获得的标识符与模拟器的deviceID或appFolder无关;我正在使用Xcode 11.2.1和iOS 13.2.2
DawnSong


74

iOS 8〜/库/开发人员/ CoreSimulator /设备/ [设备ID] /数据/应用程序/ [appGUID] /文档/


1
任何获取设备ID的方法?
msmq 2014年

2
@msmq tryxcrun instruments -s
Shazron 2014年

11
@msmq打开您当前的模拟器,硬件->设备->管理设备...->在“模拟器”列表中选择您的模拟器。然后在右边是“标识符”。这是设备ID。
RichX 2014年

如何在这里找到[appGUID]?
杨友

66

在狮子 Users/[username]/Library是隐藏的。

要仅在Finder中查看,请单击屏幕顶部的“转到”菜单,然后按住“ alt”键以显示“库”。

单击“库”,您可以看到以前隐藏的库文件夹。

先前建议:

chflags nohidden /users/[username]/library

在终端中显示文件夹。


1
然后,您可以在以下位置找到它:〜/ Library / Application Support / iPhone Simulator / [OS version] / Applications / [appGUID] /
Rafael Moreira

对于普通用户而言,这是一个有趣的建议,但在我看来,iOS / OS X开发人员需要定期访问库,因此不再希望将其隐藏。(然后,我想很多开发人员都使用Terminal而不是Finder?)
ArtOfWarfare 2013年

58

有史以来最简单的方法。

  1. 在某个地方捕获断点。

  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


1
如果我只是较早知道这一点。这应该是正确的答案
伊万·坎塔里诺

我认为所有其他答案也是正确的。但这对我来说似乎很容易:-]
拉里·克里希纳

37

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

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

可以simctl在需要设备UDID的任何地方将“ booted”替换为大多数命令。

您可以使用查看设备列表,xcrun simctl list并通过获取特定命令的帮助xcrun simctl help

更新资料:通过Xcode 8.3中的普遍要求,您现在可以通过附加“ app”,“ data”,“ groups”或应用程序组标识符来指定所需的容器类型。

要获取数据容器:

$ xcrun simctl get_app_container booted com.example.app data

优秀的。无需运行命令即可获取device_id和appId。迈出第一步
iamhite

应该接受这一方法,因为它是做这种事情的最“稳定”的方法。
Olha

35

对于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 2014年

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 2014年

1
如何获取AppID?
显示名称

1
我欺骗使用'ls -l'来查找应用程序ID,并弄清哪个应用程序文件是最近创建的。也可能为他人工作。
Maya Webster

1
或在finder中按“创建日期”进行排序,以使该应用程序位于列表顶部。
Ammar Mujeeb

30

查找应用程序在模拟器中位置的最简单方法之一。用户“ NSTemporaryDirectory()”

脚步-

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

    po NSTemporaryDirectory()

请参阅下图以获得正确的见解在此处输入图片说明

现在,您拥有到临时文件夹的确切路径。您可以返回并查看所有与应用程序相关的文件夹。

希望这也能有所帮助。快乐编码:)


1
酷提示,但为什么不po NSHomeDirectory()呢?
Code Roadie

9

Xcode在2019+ Catalina,Xcode 11.0中存储模拟器的位置

运行时间

$ open /Library/Developer/CoreSimulator/Profiles/Runtimes

例如:iOS 13.0watchOS 6.0到目前为止,这些占用最多的空间。每个可以高达〜5GB

设备

$ open ~/Library/Developer/CoreSimulator/Devices

例如:iPhone XriPhone 11 Pro Max。这些通常每个<15 mb。

说明

模拟器在运行时和设备之间分配。如果你跑$ xcrun simctl list,则可以看到概述,但是,如果要查找这些模拟器的物理位置,请查看我显示的这些目录。

删除不支持的运行时是完全安全的。如果需要,可以稍后重新安装它们。


8

只需执行以下操作:

NSString *docDirPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)objectAtIndex:0];
NSLog(@"%@", docDirPath);

这样您会得到如下想法:

/ Users / admin / Library / Developer / CoreSimulator / Devices / 58B5B431-D2BB-46F1-AFF3-DFC789D189E8 / data / Containers / Data / Application / 6F3B985F-351E-468F-9CFD-BCBE217A25FB / Documents

转到那里,无论XCode的版本如何,您都将看到应用程序的文档文件夹。(在Finder中使用“转到文件夹...”命令,并指定路径“〜/ library”)。

字符串路径的Swift版本:

let docDirPath =
NSSearchPathForDirectoriesInDomains(.documentDirectory,
                                    .userDomainMask, true).first
print(docDirPath)

和文件夹URL:

let docDirUrl =
    FileManager.default.urls(for: .documentDirectory,
                             in: .userDomainMask).first
print(docDirUrl)

即将发布几乎相同的答案。在任何版本的iOS模拟器上,此方法都具有始终提供正确路径的优势。顺便说一句,如果您不想记录它,也可以在调试器中复制url变量的值;)
Moose

7

在iOS 5中:

/ Users / [用户名] /库/应用程序支持/ iPhone Simulator / 5.0 / Applications / [AppGUID] /


6

对于Xcode 4.6,它存储在以下路径中...

/用户/ [当前用户] /库/应用程序支持/ iPhone模拟器/6.1/应用程序/

要以编程方式知道它,请使用以下代码

  NSLog(@"path:%@",[[NSBundle mainBundle]bundlePath]);

2
斯威夫特print("path: \(NSBundle.mainBundle().bundlePath)")
-SwiftArchitect

4

对于iOS 8

要找到“ 文档”文件夹,可以在“文档”文件夹中写入一个文件:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *fileName = [documentsDirectory stringByAppendingPathComponent:@"Words.txt"];
NSString *content = @"Apple";
[content writeToFile:fileName atomically:NO encoding:NSStringEncodingConversionAllowLossy error:nil];

在中说didFinishLaunchingWithOptions

然后,您可以打开终端并找到文件夹:

$ find ~/Library -name Words.txt


2

对于macOS Catalina,我在以下位置找到了我的数据库:

~/Library/Developer/CoreSimulator/Devices/{deviceId}/data/Containers/Data/Application/{applicationId}/Documents/my.db

要获取applicationId,我只是按修改日期对文件夹进行了排序,尽管我确定有更好的方法。


1

对于不经常使用Xcode的本地用户,您可以使用find。打开终端,并使用数据库名称搜索。

$ find ~/Library/Developer -name 'myname.db'

如果您不知道确切名称,则可以使用通配符:

$ find ~/Library/Developer -name 'myname.*'


0

您可以尝试使用以下代码

NSString *fileName = @"Demo.pdf";
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName];
    NSLog(@"File path%@",pdfFileName);

0

要打开在模拟器上的xCode中构建的App所在的词典,请执行以下操作:

  1. 打开Finder Windor(笑脸图标)
  2. 然后单击转到->转到文件夹
  3. 类型:〜/ Library / Application Support / iPhone Simulator
  4. 目录是不同模拟器的iOS版本
  5. 子目录是在模拟器上安装的Apps
  6. 用户生成内容的文档文件夹是将其备份到iCloud上的位置

0

我与该程序没有任何关系,但是如果您要在查找程序中打开其中任何一个,SimPholders都将使其变得异常简单。

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.