ChatGPT解决这个技术问题 Extra ChatGPT

Cleaning up the iPhone simulator

Is there a straightforward way to clean up the directory where xcode deploys an app when building for the iPhone simulator? I have a sqlite database that gets copied into the Documents folder on startup if necessary. The problem is that I might change my schema, but the new database won't get copied, because one already exists.

Ideally, every time I build, it would nuke the previous contents. Is this possible, or do I have to manually do it?

Does the simulator support AppleScript?
Yes it does. I've written an AppleScript to iterate through all of the iOS simulators for each device and OS version and reset their Contents & Settings: github.com/michaelpatzer/ResetAllSimulators

j
j7nn7k

From Apples Dev Resources:

To set the user content and settings of the simulator to their factory state and remove the applications you have installed, choose Device > Erase All Content and Settings.

(On older versions: iPhone Simulator > Reset Content and Settings.)


This one does not seem to clean the SQLite
this doesn't clear the cache of the browser for instance
Now this setting is located in Hardware > Reset Content and Settings
This setting is now located in Device > Erase All Content and Settings
D
Dave Jarvis

The simulator installs apps into:

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

Also check:

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

The GUID files and directories match up to the simulator's installed apps.

Manually delete all those files/directories to remove all applications from the simulator.

I know there is some way to add scripts to the build process in XCode.

Also it looks as if XCode changes the GUID it uses each build (the directory where my app sits changes between builds in XCode), so trying to delete the same directory all the time won't work. If you are only working on one app at a time then clearing out the entire directory would be an option.


Be sure to check out @idStar's answer down below. It has updated information regarding Lion/Xcode4 and a nice little script to help automate things.
I was testing adding/removing calendar subscriptions. On a real device, you can remove a calendar subscription in Settings > Accounts but this menu does not exist on iOS Simulator and I did not want to reset the whole simulator. So I ended up locally versioning my Device folder with git and perform a git reset HEAD --hard && git clean -f to remove a calendar subscription after I added it.
J
John

The way I do this is to simply click and hold on the icon for my app in the simulator--then when it starts to wiggle click the black and white (x). A message will pop up asking whether you really want to delete and you just click yes. The next time you build and deploy your app it will use the new sqlite db without a hitch and you don't have to go muck around in the filesystem.


This doesn't seem to work - it doesn't ACTUALLY delete data from the simulator?
My mistake - this works fine (confirmed by reading the directory in the accepted answer. I'd just forgotten Apple's user-unfriendly design of NSUserDefaults (unset values aren't reported by any sensible manner)
@quadelirus, I think your answer is the most appropriate in this situation.
This is what exactly i did, but i'm not sure how to close the app which has open already in simulator. Until unless I close the app, i could't get control on simulator.
B
BryanH

After iOS 5 on Mac OS X Lion, you can try:

Create a script called RemoveSimulatorApps.command that contains: rm -rf "$HOME/Library/Application Support/iPhone Simulator/5.0/Applications/*" Save this script to a directory in your PATH. Make the file executable, such as: chmod +x RemoveSimulatorApps.command

Assumptions

You may want to invoke this from a keyboard favorites buttons, such as on a Logitech or Microsoft keyboard with programmable keys (hence, saving it as a .command file instead of say, .sh)

You are okay with blowing away everything in the iOS simulator (ideal if you're just actively working on one app)

All the notes from others apply about being a good upgradable app etc. (I personally found this useful nonetheless b/c I have development mode switches that reload a database in a specific state I was trying to do some consistent robustness/error handling on)


This one works perfectly, just remember to add your right IOS version into the path :)
Would it makes sense to add ~ instead of absolute path?
S
ShoeLace

it may be overkill but..

you can also use the menu and 'Reset Content and Settings...'


m
mahboudz

What you are really trying to do is to clear out your database, if you've changed the schema. One way to do this, and it would make you happier in the long run when you start shipping version 2.0, 3.0, etc. of your app, is to check the version of your sqlite table, and if it has changed, then discard the old file and use the one in your bundle.

Finding a way to clean up the Simulator won't help the real world problem of how to clean up a customer's iPhone when you ship a new version with a new schema.

For extra points, after determining that you have encountered an old schema, you may want to copy the new database over without destroying the old one, and load any interesting data out of the old database, into the new one. Then blow away the old database. That way you can preserve your user's additions to the database.


In general, I agree with you when you are talking about release upgrades, but in the midst of development of any particular version, this is far more overhead than is necessary. Database schema can change on a per-build basis, and needing to write conversion code for every build is just wrong.
C
Community

for 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

H
Harald

If you are using Xcode 9 -> Menubar -> Hardware -> Erase All Content and Settings

https://i.stack.imgur.com/p7Q5o.png


J
Jeremy Huddleston Sequoia

As of Xcode 6, you can do this from the command line with: xcrun simctl erase

Also, the iOS Simulator app (both the Xcode 6 version and older versions) has a menu item called "Reset Content and Settings" that can be used to erase the currently booted device.


but it can be executed on each build automatically? for example for tests?
Assuming you are doing your tests using a script, you could certainly just add 'xcrun simctl erase ' to that script where appropriate...
Yes, that's exactly what I said.
T
Thomas T

This works with 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 -I{} xcrun simctl erase {}

For .bash_profile

alias cleansim="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 -I{} xcrun simctl erase {}"

T
TinyTimZamboni

As of Xcode 6:

xcrun simctl erase <sim udid> <- resets the simulator.


A
Albert Renshaw

The following run in terminal will wipe all of your simulators clean as if you had just installed them.

$xcrun simctl erase all

I close simulators/xcode before running it.


H
Huseyin

Clear Xcode Cache;

Command+Option+Shift+K Command+Shift+K

(Use both of them because they have different functionality)

Clear Derived Data content ;

Menu Bar -> Window -> Organizer -> Projects -> Select Your Project

Right Pane shows the name of folder and also delete button at the right side allows you to delete all derived data contents.

Clear Simulator Cache;

Menu Bar -> iOS Simulator -> Reset Contents And Settings


C
Community

As I was explaining in a comment under the validated answer:

I was testing adding and removing calendar subscriptions. On a real device, you can remove a calendar subscription in Settings, Accounts but this menu does not exist in iOS Simulator and I did not want to reset the whole simulator.

So I ended up locally versioning my Device folder with git and perform the following commands to remove a calendar subscription after I added it:

$ git reset HEAD --hard
$ git clean -f

So the steps are:

Install your application on the iOS Simulator and do what you have to do Identify your device in ~/Library/Developer/CoreSimulator/Devices/ and do a cd to it, then git init to create a git repository Once you want to save the state, perform git commit -a "Message" Do whatever changes the settings (ex: adding a calendar subscription) and perform your tests Shutdown the simulator Do git reset --hard HEAD Start the simulator, all changes done after git commit are gone.


S
Simon

In XCode, go to the Window menu option, select Devices and then you can just delete the ones you no longer need.


w
wfbarksdale

For Xcode <= 5

I added the following to my ~/.bash_profile

alias cleansim='rm -r ~/Library/Application\ Support/iPhone\ Simulator/5.1/Applications/*'

It just nukes all of the apps on the sim.


This is no longer applicable with Xcode 6 and above.