6

我将如何检查它是否是我的应用程序第一次启动,在我的应用程序NSUserDefaults第一次打开时使用并运行一些代码?

4

4 回答 4

20

这应该为您指明正确的方向:

static NSString* const hasRunAppOnceKey = @"hasRunAppOnceKey";
NSUserDefaults* defaults = [NSUserDefaults standardUserDefaults];
if ([defaults boolForKey:hasRunAppOnceKey] == NO)
{
    // Some code you want to run on first use...
    [defaults setBool:YES forKey:hasRunAppOnceKey];
}
于 2012-07-07T00:42:39.033 回答
2

NSUserDefaults 的答案是我脑海中浮现的第一件事,但经过反思,我会提出另一个建议。更多的工作,但值得考虑。动机是:有时在对应用程序进行故障排除时,Apple 建议删除该应用程序的 plist 文件。这是一种相当普遍的故障排除技术。我建议将您的布尔值存储在您的 plist 文件中,而不是 NSUserDefaults 中。

免责声明:我只做 iOS 开发,所以我不确定 NSUserDefaults 和 plists 在 Mac 上是如何交互的,而且我不知道让你的 plist 存在于 ~/Library/Application\ Support/Preferences/ 中所涉及的一切com.mycompany.MyAppName.plist

无论如何,我想这需要一些代码,这些代码实际上可以创建一个“新鲜”的 plist(可能是你的包中模板文件的副本),如果它启动并且没有看到 plist,你的应用程序就会这样做。默认 plist 不应包含允许您的用户跳过“第一次”代码的标志,但如果他们之前打开过应用程序,然后删除 plist,他们应该恢复默认行为。

这是一个重要的行为,在可能的情况下支持,如果我们的应用给他们带来麻烦,可以帮助我们的用户。

于 2012-07-07T00:52:58.913 回答
2
if (![[NSUserDefaults standardUserDefaults] boolForKey:@"hasBeenLaunched"]) {
    // Run code on the first launch only ...
    [defaults setBool:YES forKey:@"hasBeenLaunched"];
}

您可以使用 NSUserDefaults 将布尔值、整数、对象保存到程序中,并在您打开程序时让它们可用。您可以使用“boolForKey”设置一个名为“hasBeenLaunched”的标志。默认情况下,该值在未设置时为 NO。一旦将其更改为 YES,则 if 条件中的代码将永远不会再次执行。

于 2014-12-26T21:43:18.270 回答
1

在您的主控制器类中,实现如下内容:

static NSString * const MDFirstRunKey  = @"MDFirstRun";


@implementation MDAppController

+ (void)initialize {
   NSMutableDictionary *defaults = [NSMutableDictionary dictionary];
   [defaults setObject:[NSNumber numberWithBool:YES] forKey:MDFirstRunKey];
   [[NSUserDefaults standardUserDefaults] registerDefaults:defaults];
   // the following if on Mac and is necessary:
   [[NSUserDefaultsController sharedUserDefaultsController] setInitialValues:defaults];
}

- (void)applicationDidFinishLaunching:(NSNotification *)notification {

  BOOL firstRun = [[[NSUserDefaults standardUserDefaults]
                      objectForKey:MDFirstRunKey] boolValue];

  if (firstRun) {
     // do something

     [[NSUserDefaults standardUserDefaults] setObject:
                [NSNumber numberWithBool:NO] forKey:MDFirstRunKey];

  } else {
     // do something else

  }
}

@end

在创建它所在的+initialize类的实例之前调用类方法;换句话说,它很早就被调用,是设置默认值的好地方。

有关详细信息,请参阅首选项和设置编程指南:注册您的应用程序的默认首选项

于 2012-07-07T01:30:49.410 回答