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.
Réponses
Trop de publicités?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...
}
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.
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];
}
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;
}