98

this may sound real NOOB! I want to check if it's the second time the user enters my application, so to keep the run count I'm using NSUserDefaults. I have implemented the following code in my rootViewController's viewDidLoad method:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

everything works fine, but the problem is that when I uninstall(delete and re-install) the application according to here and here the data should be cleared, but it is not and after re-installing the app previous data is still showing up. I'm running my app on iOS simulator using xCode6-beta and targeting the application on iOS 8

Community
  • 1
  • 1
Reza Shayestehpour
  • 1,693
  • 3
  • 19
  • 27
  • 2
    Have you tried testing on an actual device? – Henry F Jul 27 '14 at 21:27
  • You need to clear it out manually on the simulator. [Here is how](http://stackoverflow.com/q/898498/335858). – Sergey Kalinichenko Jul 27 '14 at 21:30
  • please mark the correct answer so this question is no longer unanswered – anders Aug 07 '14 at 16:39
  • 1
    @Reza:[[NSUserDefaults standardUserDefaults]setObject:selectedLists forKey:UserID]. My app crashes here in ios8 although works fine in ios6 and ios7. Here **selectedlists** in NSMutable Array and **UserId** is a string. – Manthan Oct 09 '14 at 07:27
  • @Manthan this is some how a different issue, but I have faced the same problem somewhere else and the reason that caused the crash was Although the object I was saving for some key was `NSMutableArray` it was saved as a `NSArray` and changing it made my app crash... I recommend saving a `NSArray` and when you want to use it later casting it to `NSMutableArray` using `[NSMutableArray arrayWithArray:array];`. I hope that helps. – Reza Shayestehpour Oct 09 '14 at 16:10

7 Answers7

173

I think this is due to a bug in the iOS8 Beta Simulator.

The expected behavior is that when the app is deleted, the NSUserDefaults for that app are deleted as well.

  • However, NSUserDefaults are NOT deleted when you remove an app from the simulator.
  • They are correctly deleted when you delete them from a physical device running iOS8.

A quick and annoying solution for now is to click, iOS Simulator -> Reset Content and Settings.

Xcode 9.2 with Simulator 10 still presents this issue. Menu option is now Hardware .. Erase All Content and Settings

I submitted a bug report btw

Telmo Pimentel Mota
  • 4,033
  • 16
  • 22
anders
  • 4,168
  • 2
  • 23
  • 31
14

Since Reset Content and Settings is a nuclear option, you could consider two other options until the bug on the iOS 8/Xcode 6 GM simulator is addressed:

  1. You could manually delete the plist file where the NSUserDefaults are stored. This is currently located at ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist It's a little tedious to find the right simulator to work with among the UUID directory names. EDIT: 2014-10-28 20-34-52 Correct path: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. You could perform "surgery" on that plist (using a run script build phase perhaps) using plistbuddy e.g.

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist

FluffulousChimp
  • 9,157
  • 3
  • 35
  • 42
8

For anyone facing the same issue.

If you have more than 1 app under the same group and all of them are using app groups (ON under capabilities), then you will have to remove all the apps from the device in order for the user defaults to be cleared.

Since the user defaults are shared, even if one of the app is on the device then it will not be deleted, as that app will be using the userdefaults.

Ankit Srivastava
  • 12,347
  • 11
  • 63
  • 115
4

The code should work fine on the device. Maybe some bugs in the simulator.

Try to Reset Contents and Settings for the Simulator.

ppalancica
  • 4,236
  • 4
  • 27
  • 42
4

it is a bug, and you can delete NSUserDefaults with following code

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
ygweric
  • 1,002
  • 1
  • 7
  • 22
2

While this is still a bug another option could be to remove the specific key(s) in NSUserDefaults. Most of the time, when testing/developing, we only care about a few keys and not everything in NSUserDefaults. If you do only care about a few keys than I propose adding removeObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

Adding removeObjectForKey simulates the first run of the app, commenting it out will simulate all subsequent app executions.

AdamT
  • 6,405
  • 10
  • 49
  • 75
2

In my case i found the *.plist in the following directory:

[1] /Users/SOME-USERNAME/Library/Developer/CoreSimulator/Devices/SOME-DEVICE-ID/data/Library/Preferences/SP.UserDefaultsTest.plist

Problem: Deleting the app in xCode 6(iOS 8 simulator) but the file stays on disk like mentioned above.

Solution: Deleting the located file from path [1] manually and the NSUserDefaults are gone.

So the annoying way to reset the simulator is no longer necessary.

sys4tron
  • 51
  • 2