清理 iPhone 模拟器

114

在为iPhone模拟器构建应用程序时,有没有简单的方法清理Xcode部署应用程序的目录?如果需要,在启动时会将sqlite数据库复制到文档文件夹中。问题是,如果我更改了架构,则不会复制新的数据库,因为已经存在一个。

理想情况下,每次构建时都会删除先前的内容。这是可能的吗,还是我必须手动执行此操作?


模拟器是否支持AppleScript? - Rog
是的,我已经编写了一个AppleScript来迭代每个设备和操作系统版本的所有iOS模拟器,并重置它们的内容和设置:https://github.com/michaelpatzer/ResetAllSimulators - M-P
18个回答

136

来自苹果开发资源:

要将模拟器的用户内容和设置还原为出厂状态并删除已安装的应用程序,请选择设备 > 擦除所有内容和设置

(在旧版本上:iPhone 模拟器 > 重置内容和设置。)


3
这个似乎无法清除SQLite。 - Asped
1
这并不清除浏览器的缓存,例如。 - Mau
2
现在这个设置位于“硬件 > 重置内容和设置”中。 - Haseeb A
1
此设置现在位于“设备 > 擦除所有内容和设置”中。 - tidalwave

93

这个模拟器将应用程序安装到:

"$HOME/Library/Application Support/iPhone Simulator/User/Applications"

另外还要检查:

"$HOME/Library/Developer/CoreSimulator/Devices"

GUID文件和目录与模拟器安装的应用程序相匹配。

手动删除所有这些文件/目录以从模拟器中删除所有应用程序。

我知道有一种方法可以在XCode的构建过程中添加脚本。

此外,看起来XCode每次构建时都会更改它所使用的GUID(我的应用程序所在的目录在XCode的每次构建之间都会更改),因此尝试始终删除相同的目录将不起作用。如果您一次只处理一个应用程序,则清除整个目录可能是一个选项。


2
请务必查看下面@idStar的答案。它包含有关Lion/Xcode4的更新信息和一个很好的小脚本来帮助自动化处理事情。 - PyjamaSam
我正在测试添加/删除日历订阅。在真实设备上,您可以在“设置”>“帐户”中删除日历订阅,但是在iOS模拟器上不存在此菜单,我不想重置整个模拟器。因此,我最终使用git本地版本控制我的_Device_文件夹,并执行git reset HEAD --hard && git clean -f以在添加后删除日历订阅。 - Thibault D.

22

我做这个的方法很简单,只需在模拟器中点击并长按我的应用程序图标,然后当它开始摇晃时,点击黑白(x)按钮。会弹出一个消息询问您是否真的要删除,您只需要点击是即可。下次构建和部署应用程序时,将毫无问题地使用新的sqlite数据库,而无需在文件系统中混乱地操作。


这似乎不起作用 - 它实际上没有从模拟器中删除数据? - Adam
1
我的错误 - 这个很好用(通过阅读被接受的答案中的目录进行确认)。我只是忘记了苹果不友好的设计,即NSUserDefaults(未设置的值没有以任何明智的方式报告)。 - Adam
@quadelirus,我认为你的答案在这种情况下是最合适的。 - datnt
这就是我所做的,但我不确定如何关闭已经在模拟器中打开的应用程序。除非我关闭应用程序,否则我无法控制模拟器。 - Wanna Coffee
1
@WannaCoffee 请参见以下链接:https://dev59.com/l2Ml5IYBdhLWcg3wTlYl - John
谢谢,这个评论真的很有帮助!快捷键是⌘+⇧+H,但你需要连续按两次H才能模拟显示应用程序的双击。 - Wanna Coffee

12

iOS 5及其之后版本,在Mac OS X Lion上,你可以尝试以下步骤:

  1. 创建一个名为RemoveSimulatorApps.command的脚本,并包含以下内容:
    rm -rf "$HOME/Library/Application Support/iPhone Simulator/5.0/Applications/*"
  2. 将该脚本保存到PATH中的某个目录下。
  3. 使文件具有执行权限,如:
    chmod +x RemoveSimulatorApps.command

假设条件

  • 你可能希望从键盘收藏夹按钮中调用此文件,例如使用Logitech或Microsoft键盘上的可编程按键(因此,将其保存为.command文件而不是.sh文件)。
  • 如果你只想要激活其中一个应用程序,可以直接删除iOS模拟器中的所有内容。
  • 所有其他开发者注意事项仍然适用(例如,保持可升级性等)。尽管如此,这对我来说仍然很有用,因为我有一些开发模式切换可以重新加载特定状态的数据库,以便在进行一些一致的鲁棒性/错误处理时使用。

1
这个完美地工作,只要记得将正确的IOS版本添加到路径中 :) - Asped
1
将 ~ 添加到绝对路径中是否有意义? - Nikita Leonov

8

虽然可能有些过度,但是...

你也可以使用菜单和“重置内容和设置...”


7
如果您正在使用Xcode 9 -> 菜单栏 -> 硬件 -> 删除所有内容和设置

Xcode -> Hardware -> Erase All Content and Settings


7
您真正想做的是在更改模式后清除数据库。一种方法是检查SQLite表的版本,如果已更改,则丢弃旧文件并使用捆绑包中的新文件。这样,当您开始发布应用程序的2.0、3.0等版本时,它会让您更加满意。
找到清理模拟器的方法不会帮助解决如何在向客户提供具有新模式的新版本时清理其iPhone的真实问题。
额外加分的是,在确定遇到旧模式后,您可能希望将新数据库复制到旧数据库上而不破坏旧数据库,并从旧数据库中加载任何有趣的数据到新数据库中。然后删除旧数据库。这样可以保留用户对数据库的添加。

总的来说,当你谈论发布升级时,我同意你的观点,但在任何特定版本的开发过程中,这比必要的工作量要大得多。数据库模式可以根据每个构建进行更改,需要为每个构建编写转换代码是错误的。 - Travis Jensen

7

对于Xcode >= 6版本

xcrun simctl list | grep -oh '[A-Z0-9]\{8\}-[A-Z0-9]\{4\}-[A-Z0-9]\{4\}-[A-Z0-9]\{4\}-[A-Z0-9]\{12\}' | xargs -n1 xcrun simctl erase

6
以下终端中的命令将删除所有模拟器,就像您刚刚安装它们一样。在运行此命令之前,请先关闭模拟器。 $xcrun simctl erase all

5

从Xcode 6开始,你可以通过命令行执行以下操作:xcrun simctl erase

iOS模拟器应用程序(包括Xcode 6版本和早期版本)还有一个名为“重置内容和设置”的菜单项,可用于擦除当前启动的设备。


但它可以在每次构建时自动执行吗?例如用于测试? - Daniel Gomez Rico
假设您正在使用脚本进行测试,您可以在适当的位置将“xcrun simctl erase <UDID>”添加到该脚本中... - Jeremy Huddleston Sequoia
是的,那正是我所说的。 - Jeremy Huddleston Sequoia

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