iOS - Not able to store NSDate into NSUserDefaults

2019-04-28 03:54发布

问题:

In my application, i want to store the date at which the app is started for the first time.
I'm using following code in application:didFinishLaunchingWithOptions method

NSDate* today = [NSDate date];
[[NSUserDefaults standardUserDefaults] registerDefaults: @{@"CONSCIENCE_START_DATE" : today}];

NSLog(@"%@", [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"]);

But every time when i start the application, its printing the time at which the app is starting. Its not printing the date at which i started the app.

I tried to reset the simulator and ran the code again. Still no success. Can some one point me the error in my code please?

回答1:

Since your goal to is keep track of the very first time a user starts your app, you need something like this in application:didFinishLaunchingWithOptions:

NSDate *date = [[NSUserDefaults standardUserDefaults] objectForKey:@"CONSCIENCE_START_DATE"];
if (!date) {
    // This is the 1st run of the app
    date = [NSDate date];
    [[NSUserDefaults standardUserDefaults] setObject:date forKey:@"CONSCIENCE_START_DATE"]; // Save date
}

NSLog(@"First run was %@", date);


回答2:

You need to call [[NSUserDefaults standardDefaults] synchronize] after you set the value.

From the Apple Docs:

At runtime, you use an NSUserDefaults object to read the defaults that your application uses from a user’s defaults database. NSUserDefaults caches the information to avoid having to open the user’s defaults database each time you need a default value. The synchronize method, which is automatically invoked at periodic intervals, keeps the in-memory cache in sync with

a user’s defaults database.