32 votes

Meilleur moyen de vérifier si une application iPhone est en cours d'exécution pour la première fois

Je veux vérifier si mon application iPhone est en cours d'exécution pour la première fois. Je peux créer un fichier dans le dossier de documents et vérifier ce fichier pour voir si c'est la première fois que l'application est en cours d'exécution, mais je voulais savoir s'il existe un meilleur moyen de le faire.

69voto

paulthenerd Points 6568

J'aime utiliser NSUserDefaults pour stocker une indication de la première exécution.

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

[[NSUserDefaults standardUserDefaults] synchronize];
 

Vous pourrez ensuite le tester plus tard ...

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

8voto

brian.clear Points 2424

Ok ce qui confond l'enfer hors de moi à propos de l'Utilisateur par Défaut.

OÙ sont-ils stockés?

  • vous n'avez pas de soins, il varie par iOS/Mac.
  • vous venez de getVALUE par CLÉ
  • setVALUE par CLÉ + synchroniser
  • iOS/Mac fait le reste.

C'est le cas d'utilisation: La vérification de l'existence d'une valeur e.g firstRun. La première fois qu'il N'existera donc généralement suivies par la mise en valeur. 2e terme - sur le côté de la boucle, il existe d'autres cas d'utilisation/d'autre stmt est déclenchée

---- .h

@interface MyAppDelegate : UIResponder <UIApplicationDelegate>

//flag to denote if this is first time the app is run
@property(nonatomic) BOOL firstRun;

------ .m

@implementation MyAppDelegate

@synthesize firstRun = _firstRun;

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{

    //============== 
    //Check to see if this is first time app is run by checking flag we set in the defaults

    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];  

    if (![defaults objectForKey:@"firstRun"]){
        //flag doesnt exist then this IS the first run
        self.firstRun = TRUE;
        //store the flag so it exists the next time the app starts
        [defaults setObject:[NSDate date] forKey:@"firstRun"];
    }else{
        //flag does exist so this ISNT the first run
        self.firstRun = FALSE; 
    }        
    //call synchronize to save default - where its saved is managed by iOS - varies by device and iOS/Mac
    [[NSUserDefaults standardUserDefaults] synchronize];
    //TO TEST: delete the app on the device/simulator
    //run it - should be the first run
    //close it - make sure you kill it and its not just in the background else didFinishLaunchingWithOptions wont be called
    //just applicationDidBecomeActive
    //2nd run it should  self.firstRun = FALSE;
    //=============

//REMARQUE IMPORTANTE SI VOUS êtes ROOTVIEWCONTROLLER vérifie appDelegate.firstRun alors assurez-vous de ne la case ci-dessus AVANT de l'auto.de la fenêtre.rootViewController ici

self.window.rootViewController = self.navController;


    [self.window makeKeyAndVisible];
    return YES;
}

---- EN UTILISANT LE DRAPEAU

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");
}

Les exemples ci-dessus qui me confond un peu, car ils montrent comment vérifier pour la première fois, mais ensuite, parler de la façon dont pour " vérifier plus tard dans le même commentaire. Le problème, c'est quand nous trouvons qu'il n'existe pas, nous avons immédiatement de le créer et de le synchroniser. Afin de vérifier que c'est la fin signifie réellement lorsque vous REDÉMARREZ L'APPLICATION pas dans la même course que la première exécution.

5voto

Louis Gerbarg Points 33025

Dans votre application, les délégués enregistrent une valeur par défaut:

 NSDictionary *defaultsDict = 
[[NSDictionary alloc] initWithObjectsAndKeys:[NSNumber numberWithBool:YES], @"FirstLaunch", nil];
[[NSUserDefaults standardUserDefaults] registerDefaults:defaultsDict];
[defaultsDict release];
 

Alors où vous voulez le vérifier:

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

4voto

Mati Bot Points 370

Vous pouvez l'implémenter avec la méthode statique ci-dessous. Je pense que c'est mieux puisque vous pouvez appeler cette méthode autant de fois que vous le souhaitez, contrairement aux autres solutions. profiter: (Gardez à l'esprit que ce n'est pas thread-safe)

 + (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;
}
 

1voto

TechZen Points 52692

Utilisez NSUserDefaults. Si sharedDefault a une clé pour votre application, elle s'exécute avant. Bien entendu, vous devrez demander à l'application de créer au moins une entrée par défaut lors de la première exécution de l'application.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X