Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查iPhone应用程序是否首次运行的最佳方法_Iphone_Iphone Sdk 3.0 - Fatal编程技术网

检查iPhone应用程序是否首次运行的最佳方法

检查iPhone应用程序是否首次运行的最佳方法,iphone,iphone-sdk-3.0,Iphone,Iphone Sdk 3.0,我想检查我的iPhone应用程序是否第一次运行。我可以在documents文件夹中创建一个文件,并检查该文件,以查看这是否是应用程序第一次运行,但我想知道是否有更好的方法来执行此操作。我喜欢使用NSUserDefaults来存储第一次运行的指示 NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults]; if (![defaults objectForKey:@"firstRun"]) [defaults setOb

我想检查我的iPhone应用程序是否第一次运行。我可以在documents文件夹中创建一个文件,并检查该文件,以查看这是否是应用程序第一次运行,但我想知道是否有更好的方法来执行此操作。

我喜欢使用NSUserDefaults来存储第一次运行的指示

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
if (![defaults objectForKey:@"firstRun"])
  [defaults setObject:[NSDate date] forKey:@"firstRun"];

[[NSUserDefaults standardUserDefaults] synchronize];
您可以稍后测试它

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];        
if([defaults objectForKey:@"firstRun"])           
{
  // do something or not...
}

在应用程序中,委托注册默认值:

NSDictionary *defaultsDict = 
[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"FirstLaunch", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDict];
[defaultsDict release];
然后在要检查的位置:

NSUserDefaults *sharedDefaults = [NSUserDefaults standardUserDefaults];
if ([sharedDefaults boolForKey:@"FirstLaunch"]) {
  //Do the stuff you want to do on first launch
  [sharedDefaults setBool:NO forKey:@"FirstLaunch"];
  [sharedDefaults synchronize];
}

使用默认值。如果sharedDefault具有应用程序的密钥,则它将在之前运行。当然,你必须让应用程序在第一次运行时创建至少一个默认条目

好吧,是什么让我对用户默认设置感到困惑

它们存放在哪里

  • 你不在乎它随iOS/Mac的不同而变化
  • 您只需按键获取值
  • 按键设置值+同步
  • iOS/Mac将完成其余部分
这是常见的用例: 检查是否存在值,例如firstRun。 第一次它将不存在,因此通常随后设置值。 第二轮 -在下一个循环中,它确实存在,并且触发了其他用例/else stmt

----h


//注意重要事项:如果您是ROOTVIEWCONTROLLER,请检查appDelegate.firstRun,然后确保在此处设置self.window.ROOTVIEWCONTROLLER之前执行上述检查

self.window.rootViewController = self.navController;


    [self.window makeKeyAndVisible];
    return YES;
}
----使用国旗

MyAppDelegate *appDelegate = (MyAppDelegate *)[[UIApplication sharedApplication] delegate];

if (appDelegate.firstRun){
    NSLog(@"IS FIRST RUN - Do something: e.g. set up password");

}else {
     NSLog(@"FPMyMusicScreenViewController: IS NOT FIRST RUN - Prompt for password");
}
上面的例子让我有点困惑,因为它们第一次展示了如何检查,但在同一条评论中提到了如何“稍后检查”。 问题是当我们发现它不存在时,我们会立即创建它并进行同步。
因此,延迟检查实际上意味着当您重新启动应用程序时,与第一次运行的运行方式不同。

您可以使用下面的静态方法来实现它。我认为这是更好的,因为你可以调用这个方法很多次,你喜欢,不像其他的解决方案。享受:(记住它不是线程安全的)

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  
if (![defaults objectForKey:@"firstRun"])
  [defaults setObject:[NSDate date] forKey:@"firstRun"];

[[NSUserDefaults standardUserDefaults] synchronize];

您可以将自定义类别方法isFirstLaunch与UIViewController+FirstLaunch一起使用

- (BOOL)isFirstLaunch
{
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"kFirstLaunch"]) {
        return YES;
    }
    else {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kFirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return NO;
    }
}
当您需要在控制器中使用它时

BOOL launched = [self isFirstLaunch];

if (launched) {
//if launched
}
else {
//if not launched
}
斯威夫特:

另一个提示:


使用NSUserDefaults时,如果删除应用程序,这些设置将被删除。如果出于某种原因,您要求这些设置仍然挂起,您可以将它们存储在钥匙链中。

在哪里测试??应用程序内是否完成了启动方法??请将其放入
applicationdFinishLaunchingwithoptions
?@paultenerd避免使用速记!在这种情况下。即使具有键firstRun的对象存在且具有布尔值NO,它也会失败。如果该对象不存在,则返回nil,因此如果此处要使用([]!=nil)。如果用户更新应用程序,然后启动应用程序,会怎么样?是否应在If..stmt中将FirstLaunch设置为NO,以便它不会在下一次应用程序迭代中运行?@brian.clear,仅当您不需要确认用户看到了您想要显示的内容,不需要进行初始化/确认等。例如,在我第一次运行时,我希望用户确认他们看到了教程或选择跳过教程,而不是单击“打开”,然后锁定他们的手机,最终我的应用程序被挤出内存。听起来可能不太常见,但我在某处排队时下载了一个新应用程序,第一次启动该应用程序,然后立即锁定手机。b/c轮到我排队了。所以,这取决于用例。有意义吗?从iPhone模拟器中清除存储(这些“默认值”)的正确方法是什么?默认情况下,boolForKey将返回false,字符串将为nil等。如果要初始化用户默认值,只需使用registerDefaults以及要使用的键和值。如果要初始化日期,可以使用[NSDate distantFuture]
+ (BOOL)isFirstTime{
    static BOOL flag=NO;
    static BOOL result;
    if(!flag){
        if ([[NSUserDefaults standardUserDefaults] boolForKey:@"hasLaunchedOnce"])
        {
            result=NO;
        } else
        {
            [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"hasLaunchedOnce"];
            [[NSUserDefaults standardUserDefaults] synchronize];
            result=YES;
        }

    flag=YES;
    }
    return result;
}
- (BOOL)isFirstLaunch
{
    if ([[NSUserDefaults standardUserDefaults] boolForKey:@"kFirstLaunch"]) {
        return YES;
    }
    else {
        [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"kFirstLaunch"];
        [[NSUserDefaults standardUserDefaults] synchronize];
        return NO;
    }
}
BOOL launched = [self isFirstLaunch];

if (launched) {
//if launched
}
else {
//if not launched
}
var isFirstLaunch: Bool {
    get {
        if (NSUserDefaults.standardUserDefaults().objectForKey("firstLaunchDate") == nil) {
            NSUserDefaults.standardUserDefaults().setObject(NSDate(), forKey: "firstLaunchDate")
            NSUserDefaults.standardUserDefaults().synchronize()
            return true
        }
        return false
    }
}