检测第一次运行的Application

时间:2013-01-03 15:37:34

标签: ios nsuserdefaults

我想在用户第一次运行我的应用程序时显示帮助覆盖。

为此,我在didFinishLaunching中使用以下代码:

if(![[[[NSUserDefaults standardUserDefaults] dictionaryRepresentation] allKeys] containsObject:@"IPHONEFIRSTRUN"])
    [[NSUserDefaults standardUserDefaults]setBool:TRUE forKey:@"IPHONEFIRSTRUN"];

在视图控制器中,我有:

if ([[NSUserDefaults standardUserDefaults]boolForKey:@"IPHONEFIRSTRUN"]==TRUE) {
    [self HelpOverlayIphone];
    [[NSUserDefaults standardUserDefaults]setBool:FALSE forKey:@"IPHONEFIRSTRUN"];
}

但是,它也显示了第二次使用的叠加层。我怎样才能解决这个问题?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:4)

你的逻辑过于复杂。您将永久设置用户默认值以指示一次发生的事情。相反,在视图控制器中查看是否未设置该值,是否执行操作并设置变量以使代码不再运行:

if ( ! [[NSUserDefaults standardUserDefaults]boolForKey:@"IPHONEFIRSTRUNCOMPLETE"] ) {
        [self HelpOverlayIphone];
        [[NSUserDefaults standardUserDefaults]setBool:YES forKey:@"IPHONEFIRSTRUNCOMPLETE"];
        [[NSUserDefaults standardUserDefaults] synchronize];
}

取出app delegate中的所有代码。

此外,您的原始代码很可能无法正常工作,因为您正在从XCode停止应用。如果您不使用synchronize用户,则默认情况下不会保存更改(正常退出应用程序最终会永久保存更改)。

答案 1 :(得分:0)

您是否注册了在程序开始时使用的默认值?我建议重读NSUserDefaults here

的苹果文档

您需要先打电话

- (void)registerDefaults:(NSDictionary *)dictionary

仅在密钥尚不存在时才设置密钥。然后在第一次运行时检查键是否有误,并在此时设置它。

我的猜测是你的代码不起作用的原因是因为字典实际上从未以任何持久的方式保存。

答案 2 :(得分:0)

我有这个功能,当应用程序启动时会触发它 - 它总是可靠的。我有一个uniqueNameOfApp,它只是一些随机哈希,所以它不会与其他应用程序冲突。

-(void)loadSettings {
NSMutableDictionary *sttngs = [[NSUserDefaults standardUserDefaults] 
objectForKey:uniqueNameOfApp];

    if(sttngs != nil) {
    [userSettings addEntriesFromDictionary:sttngs];
    } else {
    _appFiredForFirstTime = YES;
    }
}