在iPhone OS 4.0上加载在后台应用程序时更改的用户默认值

时间:2010-06-23 18:51:30

标签: background nsuserdefaults ios4

我的应用中设置了几个用户默认值:

快照开/关 启动/启动启动提示 游戏音乐开/关 iPod音乐开/关 音效开/关 重置所有玩偶开启/关闭

当我的应用程序进入backgound(在OS 4.0中)时,我的saveDefaults:方法将从applicationWillResignActive:(UIApplication *)方法调用。

然后在applicationWillEnterForeground:方法中,我再次加载我的用户默认值。然后我调用一个启动menuMusic的方法,如果它已启用。

使用相当简单的保存默认方法:

- (void)saveGameDefaults {

 [[NSUserDefaults standardUserDefaults] setObject:(NSString *)myDoll.currentDoll forKey:@"DollName"];
 [[NSUserDefaults standardUserDefaults] setInteger:[gameState intValue] forKey:@"GameState"];
 [[NSUserDefaults standardUserDefaults] setInteger:[startScreen intValue] forKey:@"StartScreen"];
 [[NSUserDefaults standardUserDefaults] setBool:snapShots forKey:@"SnapShots"];
 [[NSUserDefaults standardUserDefaults] setBool:resetDolls forKey:@"Reset"];
 [[NSUserDefaults standardUserDefaults] synchronize];


}

以下是我的加载默认方法的一小部分:

{
    if ([[NSUserDefaults standardUserDefaults] objectForKey:@"GameState"] == nil) gameState = [NSNumber numberWithInt:MENU_VIEW];
 else gameState = [[NSUserDefaults standardUserDefaults] objectForKey:@"GameState"];


 if ([[NSUserDefaults standardUserDefaults] objectForKey:@"StartScreen"] == nil) startScreen = [NSNumber numberWithInt:SHOW_START_SCREEN];
 else startScreen = [[NSUserDefaults standardUserDefaults] objectForKey:@"StartScreen"];



 if ([[NSUserDefaults standardUserDefaults] objectForKey:@"GameSound"] == nil) gameSound = [NSNumber numberWithInt:SOUNDS_ON];
 else gameSound = [[NSUserDefaults standardUserDefaults] objectForKey:@"GameSound"];
}

看起来,当应用程序从后台返回时,默认值不会更新或可供应用程序使用。我通过直接切换到iPhone设置,更改设置,然后通过双击主页按钮并选择我的应用程序直接切换回到后台。但是,如果我再次返回并重新登录,它将会读取已设置的新设置。

例如: 1.我启用了音乐,然后启动了应用程序。音乐正在菜单上播放。 2.我双击主页按钮,然后选择我的设置应用程序&将菜单音乐设置更改为NO。 3.双击主页按钮并返回游戏。音乐还在播放。 4.再次双击主页并返回设置应用程序。菜单音乐仍设为NO。 5.第二次切换回我的应用程序,现在音乐不再播放了。

当app在后台时,其他任何人在更新用户设置时遇到问题吗?

提前致谢 - 马克

2 个答案:

答案 0 :(得分:2)

发现从Background返回后,我需要在获取key的对象之前执行standardUserDefaults的同步。

答案 1 :(得分:1)

感谢小费。对于任何寻找代码的人:

- (void)applicationDidBecomeActive:(UIApplication *)application {
[[NSUserDefaults standardUserDefaults] synchronize];
}