仅在应用程序获得更新时重置特定的 NSUserDefaults 键

Posted

技术标签:

【中文标题】仅在应用程序获得更新时重置特定的 NSUserDefaults 键【英文标题】:Reset a specific NSUserDefaults key only when app gets an update 【发布时间】:2012-02-09 00:37:17 【问题描述】:

我有两个 NSUserDefaults 键:第一个是与显示小介绍窗口相关的一个,第二个是与前 3 个会话更改 tableView 中的单元格背景颜色相关的一个。

现在,当我更新我的应用程序时,我希望重置第二个键,以便为前 3 个会话显示不同的单元格背景颜色。

这是我的应用委托中的代码:

[[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]);    
    

(注意:runNumber 是存储 3 个会话的单元格背景颜色的键)

它检查 lastVersion 是否等于 bundle 版本,并重置 runNum 的键(给它值 0)。然后,如果runNum为0,则增加runNumbers。

但是有一个问题!

当 lastVersion 与版本不同时,它会重置密钥,但我不知道如何再次增加 runNum,而无需再次重置运行次数,因为每次打开应用程序时都会重置 runNum!

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..

当我关闭并重新打开应用程序时,runNum 键再次为 0!

如何只重置一次 runNum 键,然后再增加一次?

编辑

我做了以下更改:

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"]; 
    

这是在前 3 个会话中使单元格背景发生变化的代码:

    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?

现在:当用户第一次下载应用程序(3 个会话)和用户更新应用程序时(即使在 N 个会话之后),如何让应用程序显示不同的单元格背景?我被困在这里了。

有什么想法吗?

【问题讨论】:

【参考方案1】:

我自己解决了!

 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]);    
    

【讨论】:

这几乎是我的建议,很好地找出了我没有包含在我的答案中的代码;)+1!【参考方案2】:

当最后一个版本不等于当前版本时,您应该重置运行号。这将在您的新版本的第一次运行中。因此,在将用户默认值更新为捆绑包中的版本号之前,请在此时重置运行号。

【讨论】:

我不明白的是:新用户(那些在应用程序是 1.3.3 版本时下载应用程序的用户)是否仍然可以看到介绍窗口和不同的背景细胞?当他们更新应用程序时(即在 1.3.4 时),单元格是否会在 3 个会话中改变颜色(正如我在代码中所写的那样)?【参考方案3】:

虽然您的问题不是很清楚,但我只是根据我能理解的内容提供帮助。请编辑您的问题,以便更清楚地描述您的问题。

你能记录下你的 NSString *version 的值吗?

即紧随其后:

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

放一个

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

这应该确保您的

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

执行与否。

此外,您不必为了更新它而从 NSUserDefaults 中删除密钥。您可以安全地从代码中删除此行:

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

只需进行这些更改,让我知道它是否有效。

【讨论】:

我编辑了我的问题。希望现在更清楚!顺便说一句,日志给出了“版本 1.3.4”(应用程序的实际版本)。现在,如果我将我的应用程序更新到 1.3.5,我怎样才能使密钥“runNum”重置并从 0 重新开始?应用如何知道何时更新并更改键值?

以上是关于仅在应用程序获得更新时重置特定的 NSUserDefaults 键的主要内容,如果未能解决你的问题,请参考以下文章

组件更新时重置 Snackbar 上的 autoHideDuration 计时器

仅在特定时间范围内显示指标

STM32F030F4P6 仅在从闪存启动时运行中断处理程序。从引导加载程序启动时重置

如何在使用 opsworks 部署时仅在特定层中的第一个实例上运行命令?

重置密码且未配置两因素设备时如何获得两因素身份验证

仅在针对特定路线时应用 CSS