Phillip
Phillip

Reputation: 4306

Reset a specific NSUserDefaults key only when app gets an update

I have two NSUserDefaults keys: the first is the one related to show a little intro window, the second is the one related to change the cells background color in my tableView for the first 3 sessions.

Now, when i update my app, i want the second key to reset, in order to show a different cells background color for the first 3 sessions.

This is my code in my app delegate:

[[NSUserDefaults standardUserDefaults] setObject: @"1.3.5" forKey:@"lastVer"];//in memory
    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"];
    NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

    NSLog(@"**** Version: %@",version);

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
   if(![lastVersion isEqualToString: version]){
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
    }
    else { 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"This is Run Number: %d", [runNumber intValue]);    
    }

    if (runNumber == [NSNumber numberWithInt:0]){
       [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@"Run number: %d", [runNumber intValue]);    
    }

(Note: the runNumber is the key that stores the cells background color for 3 sessions)

it checks if the lastVersion is equal to the bundle version and it resets the key for runNum (giving it the value 0). Then, if the runNum is 0, it increase the runNumbers.

But there's a problem!

When the lastVersion is different from version, it resets the key, but i don't know how to increment runNum again, without resetting again the number of the runs, because runNum is being reset everytime i open the app!

i.e.

lastVersion = 1.3.4
version = 1.3.5
if lastVersion is different from version, then runNum == 0
and if runNum == 0, runNum = runNum + 1
//CLOSING AND REOPENING THE APP
runNum = 0 
runNum = runNum +1
//CLOSING AND REOPENING THE APP
runNum = 0
runNum = runNum + 1
//and so on..

When i close and reopen the app, the runNum key is 0 again!

How can i reset the runNum key ONLY one time and then increment it again?

EDIT

I made the following changes:

NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

    // get the current bundle version. 
    NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 


    NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

    NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 
    NSInteger runNumberValue = [runNumber integerValue]; 


    if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        NSInteger newRunNumberValue = runNumberValue++; 
        if(newRunNumberValue > 2) { 
            newRunNumberValue = 0; 
        } 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:newRunNumberValue] forKey:@"runNum"]; 
    }

And this is the code that makes the cells background change on the first 3 sessions:

    NSString *lastVersion = [[NSUserDefaults standardUserDefaults] objectForKey:@"lastVer"]; 

// get the current bundle version. 
NSString *currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"]; 

NSLog(@"Last Version: %@, New Version: %@", lastVersion, currentVersion); 

NSNumber *runNumber = [[NSUserDefaults standardUserDefaults] objectForKey:@"runNum"]; 

if (!runNumber) { 
    NSLog(@"**** Resetting Run Number to zero ****"); 
    NSNumber *runNumber = [NSNumber numberWithInt:0]; 
    [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
} else { 
    [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
    NSLog(@"This is Run Number: %d", [runNumber intValue]); 
} 


if(![lastVersion isEqualToString: currentVersion]){ 
    NSLog(@"Last Version and Version are not same."); 
    [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
    NSLog(@"last Version is: %@",lastVersion);
    //What should i do here to make the updated app show the different cells background?
} 
else { 
    NSLog(@"Last Version and Version are same."); 
    //What should i do here to make the updated app show the different cells background?
}

Now: how can i make the app show the different cells background when the user downloads it for the first time (3 sessions) and when the user updates the app (even after N sessions)? I'm stuck here.

Any ideas?

Upvotes: 1

Views: 1484

Answers (3)

Phillip
Phillip

Reputation: 4306

I solved it myself!

 if(![lastVersion isEqualToString: currentVersion]){ 
        NSLog(@"Last Version and Version are not same."); 
        [[NSUserDefaults standardUserDefaults] setObject:currentVersion forKey:@"lastVer"]; 
        NSLog(@"last Version is: %@",lastVersion);
        NSNumber *runNumber = [NSNumber numberWithInt:0]; 
        [[NSUserDefaults standardUserDefaults] setObject:runNumber forKey:@"runNum"]; 
        NSLog(@"runNumber is: %d",[runNumber intValue]);

    } 
    else { 
        NSLog(@"Last Version and Version are same."); 
        [[NSUserDefaults standardUserDefaults] setObject:[NSNumber numberWithInt:([runNumber intValue] + 1)] forKey:@"runNum"]; 
        NSLog(@" Run Number: %d", [runNumber intValue]);    
    }

Upvotes: 3

jrturton
jrturton

Reputation: 119242

You should reset the run number when the last version is not equal to the current version. This will be at the first run of your new version. So, before you update user defaults to the version number from your bundle, reset the run number at that point.

Upvotes: 2

Raunak
Raunak

Reputation: 3414

Although your question is not very clear, I'm just trying to help based on what I could understand. Please edit your question so as to describe your issue more clearly.

Can you log the value of your NSString *version.

i.e just after:

NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];

put a

NSLog(@"version %@", version);

This should ensure whether your

if([lastVersion isEqualToString: version]){ 
...
}

is executed or not.

Moreover you don't have to remove a key from NSUserDefaults simply to update it. You can safely remove this line from your code:

[[NSUserDefaults standardUserDefaults] removeObjectForKey:@"runNum"];

Just make these changes and let me know if it works.

Upvotes: 0

Related Questions