在iOS模拟器中包含应用程序数据

9
我有一个应用程序,可以将加速度计数据记录和存储为核心数据管理对象。我想在模拟器中包含一些示例保存的录音,以在不同平台上测试该应用程序,因为模拟器无法从加速度计记录。我已成功地将*.xcappdata文件包含在构建方案中,并且在设备上运行正常,但是模拟器获取为空。 Apple documentation似乎表明在模拟器中包含应用程序数据是可能的,但我还没有使其工作。我已经测试了在另一个设备上保存的数据是否可以正常使用,这也没有问题。我没有收到错误消息,只是一个空的获取结果。
我知道我可以在应用程序中以文本文件的形式包含数据,在启动时读取并格式化它们,然后将它们保存为管理对象,但这会在项目中创建大量附录代码和文件,我宁愿更干净地工作。
2个回答

6
您可以在终端窗口中运行 xcrun simctl get_app_container <device> <bundle identifier> data 命令来查找应用程序的数据容器路径。设备可以是名称(加引号)或UDID(参见 xcrun simctl list)。要使此命令正常运行,相关模拟器必须正在运行,并且在其中安装了应用程序的版本。
右键单击 .appdata 文件以显示软件包内容。将从 AppData/* 文件夹中获取的核心数据文件复制到相应的目录中,然后在模拟器中启动您的应用程序。
当前 Xcode 没有像对待物理设备一样管理模拟器容器的 GUI 界面。如果您不介意,请在“设备和模拟器”窗口中提出增强请求,网址为 https://bugreport.apple.com/

为了尝试这个解决方案,我想要进行一些小的澄清:1. 你必须已经在相关模拟器上安装了你的应用程序(否则数据容器不存在)。2. 相关模拟器必须正在运行中(否则会返回关闭错误)。3. 命令在终端中运行。然而,对我来说似乎并没有起作用。我正确地识别了数据容器,在其中放置了.appdata文件(每次安装时文件夹都会更改但文件会被移动)。我在方案中包含了数据。但是应用程序中仍然没有数据。 - AlexMath
顺便说一下,我按照你的建议向苹果提交了一个请求。ID是36256124。 - AlexMath
感谢您提出请求。您可能需要将.appdata文件夹中的内容(例如Documents或Caches中的文件)取出并放入模拟器中您的应用程序容器目录中。您不能只是将“appdata”捆绑包放在那里。 - russbishop
相关文件位于.appdata内容的AppData/Documents文件夹中,分别被称为Model.sqlite、Model.sqlite-shm和Model.sqlite-wal。 - AlexMath

5
我刚刚想到了一个解决方法,至少对于Xcode 9.2/iOS 11.2模拟器来说,你可以在启动参数中设置(HOME/CFFIXED_USER_HOME)(我不确定哪个实际上起作用)环境变量为 .xcappdata/AppData 的路径,如下所示(我仅使用SRCROOT相对路径说明可能性 - 它与任何其他路径类型(例如绝对路径等)都可以一起使用)。请注意,应用程序数据的更改将直接反映在该文件夹中,因此如果您不希望如此,则将其指向副本是有意义的。
环境变量的设置:Environment for .xcappdata

我在Xcode 12.3上没有什么好运气。有什么想法吗? - CommaToast
1
它在那里不起作用。但是你可以尝试使用xcrun simctl install_app_data来安装数据(模拟器中安装应用程序之后)- 一眼看去它有效吗?在这里查看更多信息:https://github.com/lionheart/openradar-mirror/issues/6578#issuecomment-808282851 - Grigory Entin
好的,假设我要使用 xcrun simctl install_app_data... 那么如何根据选择的 .xctestplan 设置要使用哪个 .xcappdata?在我看来,构建脚本和预测试操作都不知道哪个测试计划是活动的。除了为每个 .xcappdata 制作单独的方案之外,我们还能做什么呢...? - CommaToast

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