【发布时间】:2010-11-09 15:13:15
【问题描述】:
我有一个用于存储应用程序数据的 SQLite 数据库,我可以通过查看它来调试我遇到的问题 - 但是 iPhone 模拟器通常在哪里存储它的数据?
【问题讨论】:
标签: iphone ios-simulator
我有一个用于存储应用程序数据的 SQLite 数据库,我可以通过查看它来调试我遇到的问题 - 但是 iPhone 模拟器通常在哪里存储它的数据?
【问题讨论】:
标签: iphone ios-simulator
在某处捕捉断点。 (或暂停程序执行(在调试区域点击暂停),如 cmets 中提到的 Najdan Tomić)
在控制台窗口
中输入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
【讨论】:
po NSHomeDirectory()。
适用于 Xcode6+/iOS8+
~/Library/Developer/CoreSimulator/Devices/[DeviceID]/data/Containers/Data/Application/[AppID]/
接受的答案对于 SDK 3.2 是正确的 - SDK 4 将该路径中的 /User 文件夹替换为它可以模拟的每个旧 iPhone OS/iOS 版本的数字,因此路径变为:
~/Library/Application Support/iPhone Simulator/[OS version]/Applications/[appGUID]/
如果您同时安装了以前的 SDK,其 3.1.x 模拟器将继续将其数据保存在:
~/Library/Application Support/iPhone Simulator/User/Applications/[appGUID]/
【讨论】:
cd ~/Library/Application\ Support/iPhone\ Simulator/
po NSHomeDirectory()。剪切并粘贴到 Go>Go To Folder (Cmd-Shift-G)。
AppDelegate 的didFinishLaunchingWithOptions: 中简单地向NSLog 添加一行,或者您可以从调试器中po NSHomeDirectory()。无论哪种情况,复制字符串并在查找器中使用Cmd+Shift+G 打开它。这样做效果更好,因为您使用标准命令询问,而不是需要知道发生变化的事情。
$ open ~/Library/Developer/CoreSimulator/Profiles/Runtimes
例如:iOS 13.0、watchOS 6.0 到目前为止,这些占用的空间最多。每个最高可达 ~5GB
$ open ~/Library/Developer/CoreSimulator/Devices
例如:iPhone Xr、iPhone 11 Pro Max。这些通常每个
模拟器分为运行时和设备。如果您运行$ xcrun simctl list,您可以看到概览,但如果您想找到这些模拟器的物理位置,请查看我显示的这些目录。
删除您不支持的运行时是完全安全的。如果需要,您可以稍后重新安装。
【讨论】:
对于 macOS Catalina,我在以下位置找到了我的数据库:
~/Library/Developer/CoreSimulator/Devices/{deviceId}/data/Containers/Data/Application/{applicationId}/Documents/my.db
为了获得applicationId,我只是按修改日期对文件夹进行了排序,但我确信有更好的方法。
【讨论】:
对于不经常使用 Xcode 的 react-native 用户,你可以使用 find。打开终端并使用数据库名称进行搜索。
$ find ~/Library/Developer -name 'myname.db'
如果您不知道确切的名称,您可以使用通配符:
$ find ~/Library/Developer -name 'myname.*'
【讨论】:
只需这样做:
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 中使用“Go to Folder...”命令并指定路径“~/library”)。
字符串路径的 Swift 版本:
let docDirPath =
NSSearchPathForDirectoriesInDomains(.documentDirectory,
.userDomainMask, true).first
print(docDirPath)
和文件夹网址:
let docDirUrl =
FileManager.default.urls(for: .documentDirectory,
in: .userDomainMask).first
print(docDirUrl)
【讨论】:
我与这个程序没有任何关系,但如果你想在查找器SimPholders 中打开任何这个程序,它会非常容易。
【讨论】:
如果模拟器正在运行,您可以获得任何应用容器的路径:
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" 可以替代大多数simctl 命令在任何需要设备UDID 的地方。
您可以使用xcrun simctl list 查看设备列表,并使用xcrun simctl help 获取有关特定命令的帮助。
更新:根据 Xcode 8.3 中的流行请求,您现在可以通过附加“app”、“data”、“groups”或应用组标识符来指定所需的容器类型。
获取数据容器:
$ xcrun simctl get_app_container booted com.example.app data
【讨论】:
还有另一种(更快?)方法可以在没有终端的情况下找到您的应用数据所在的位置:
【讨论】:
NSString *uniqueIdentifier = [[[UIDevice currentDevice] identifierForVendor] UUIDString]; 为您提供设备标识符
看起来 Xcode 6.0 再次移动了这个位置,至少对于 iOS 8 模拟器而言。
~/Library/Developer/CoreSimulator/Devices/[DeviceID]/data/Containers/Data/Application/[AppID]
【讨论】:
要在模拟器上打开您在 xCode 中构建的应用所在的字典,请执行以下操作:
【讨论】:
iOS 8 ~/Library/Developer/CoreSimulator/Devices/[设备ID]/data/Applications/[appGUID]/Documents/
【讨论】:
xcrun instruments -s
Date Modified排序。您当前的构建将(可能)是最新的。
适用于 iOS 8
要找到 Documents 文件夹,您可以在 Documents 文件夹中写入一个文件:
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
【讨论】:
使用 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 应用的十六进制字符串。
【讨论】:
po NSHomeDirectory()
对于 Xcode 4.6,它存储在以下路径中...
/Users/[currentuser]/Library/Application Support/iPhone Simulator/6.1/Applications/
要以编程方式了解它,请使用以下代码
NSLog(@"path:%@",[[NSBundle mainBundle]bundlePath]);
【讨论】:
print("path: \(NSBundle.mainBundle().bundlePath)")
您可以尝试使用以下代码
NSString *fileName = @"Demo.pdf";
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *pdfFileName = [documentsDirectory stringByAppendingPathComponent:fileName];
NSLog(@"File path%@",pdfFileName);
【讨论】:
在 Lion 上,Users/[username]/Library 是隐藏的。
要简单地在 Finder 中查看,请单击屏幕顶部的“开始”菜单并按住“alt”键以显示“库”。
点击“图书馆”,可以看到之前隐藏的图书馆文件夹。
之前的建议:
使用
chflags nohidden /users/[username]/library
在终端中显示文件夹。
【讨论】:
在 iOS 5 中:
/Users/[用户名]/Library/Application Support/iPhone Simulator/5.0/Applications/[AppGUID]/
【讨论】:
如果有人在 Lion 中仍然遇到这个问题,有一篇很棒的文章,其中包含 19 个不同的技巧来查看您的 ~/Library 目录。在这里找到 Dan Frakes 的文章http://www.macworld.com/article/161156/2011/07/view_library_folder_in_lion.html
记住模拟器的目录如下
~/Library/Application Support/iPhone Simulator/User/
【讨论】:
找到了:
~/Library/Application Support/iPhone Simulator/User/
【讨论】: