2008-11-21 14 views

Respuesta

80

Más o menos lo que Marc y Chris dijo, aunque yo prefiero cambiar el valor cuando la aplicación se cierra en caso de que haya varias áreas de la aplicación que necesiten saber al respecto. En código:

// -applicationDidFinishLaunching: 
[[NSUserDefaults standardUserDefaults] registerDefaults:[NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithBool:YES],@"firstLaunch",nil]]; 
// to check it: 
[[NSUserDefaults standardUserDefaults] boolForKey:@"firstLaunch"]; 
// -applicationWillTerminate: 
[[NSUserDefaults standardUserDefaults] setBool:NO forKey:@"firstLaunch"]; 
+1

¿Las entradas de la base de datos predeterminadas que están asociadas con una aplicación se vacían cuando se desinstala la aplicación? – xyzzycoder

+1

@xyzzycoder: sí –

+13

Con la creación de fondos ahora disponible, '-applicationWillTerminate:' generalmente no se llama cuando el usuario sale de la aplicación. En cambio, se llama '-applicationWillResignActive'. Entonces firstLaunch debe establecerse en ambos métodos. – memmons

2

Puede establecer un valor booleano en los valores predeterminados del usuario para hacer esto. Establezca la clave en falso cuando llame al registerDefaults:, y luego configúrelo en true, cámbielo a verdadero después de que haya mostrado su pantalla de ayuda inicial o lo que sea que deba hacer.

Si tiene un archivo de datos persistentes que siempre se guarda después de que se cierra la aplicación, verificando si existe podría ser de otra manera.

2

guardarlo como un user preference, por ejemplo had_first_launch, se define como true en el arranque, sólo será falsa en la primera vez ...

29

normalmente uso el número versión de la aplicación en lugar de un valor booleano para el valor firstLaunch en valores predeterminados del usuario. De esta forma, puede distinguir entre el primer lanzamiento de una nueva instalación y el primer lanzamiento de una actualización. Puede ser útil en versiones futuras ...

59

Me doy cuenta de que esta pregunta es bastante antigua, pero la utilicé para encontrar un método para detectar el primer inicio después de una "instalación nueva" una actualización/degradación) y pensé que compartiría el código aquí para futuros espectadores en caso de que sea útil.

// Get current version ("Bundle Version") from the default Info.plist file 
NSString *currentVersion = (NSString*)[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]; 
NSArray *prevStartupVersions = [[NSUserDefaults standardUserDefaults] arrayForKey:@"prevStartupVersions"]; 
if (prevStartupVersions == nil) 
{ 
    // Starting up for first time with NO pre-existing installs (e.g., fresh 
    // install of some version) 
    [self firstStartAfterFreshInstall]; 
    [[NSUserDefaults standardUserDefaults] setObject:[NSArray arrayWithObject:currentVersion] forKey:@"prevStartupVersions"]; 
} 
else 
{ 
    if (![prevStartupVersions containsObject:currentVersion]) 
    { 
     // Starting up for first time with this version of the app. This 
     // means a different version of the app was alread installed once 
     // and started. 
     [self firstStartAfterUpgradeDowngrade]; 
     NSMutableArray *updatedPrevStartVersions = [NSMutableArray arrayWithArray:prevStartupVersions]; 
     [updatedPrevStartVersions addObject:currentVersion]; 
     [[NSUserDefaults standardUserDefaults] setObject:updatedPrevStartVersions forKey:@"prevStartupVersions"]; 
    } 
} 

// Save changes to disk 
[[NSUserDefaults standardUserDefaults] synchronize]; 
+0

im siempre usando este código de "verificar para el primer lanzamiento", ¡así que esta es una gran adición! gracias por el trabajo Clint! – nickthedude

+1

Nunca pensé en detectar actualizaciones y degradaciones. +1. – JoePasq

+2

Es realmente una buena manera de realizar un seguimiento de las versiones. – Ansari

2

Esto no funcionará correctamente si desea detectar en otros lugares del código si es su primer lanzamiento. El "applicationWillTerminate" no funcionará desde iOS 4.0 debido a la multitarea. este enlace ofrece una buena solución: http://mobiledevblog.metalcompass.com/?p=43

4

Este es un atajo muy simple, pero me encontré con que NSUserDefault pares de valores clave siempre son nulas la primera vez que se ejecuta una aplicación para

// Check to see if its the first time 
if ([[NSUserDefaults standardUserDefaults] valueForKey:@"firstTime"] == NULL) { 
    [[NSUserDefaults standardUserDefaults] setValue:@"Not" forKey:@"firstTime"]; 
} 

y colocar este código en el awakeFromNib del controlador de vista que aparece cuando se inicia la aplicación. No sé si alguna de las otras respuestas funciona para su problema, pero esta es la forma en que lo resolví.

Cuestiones relacionadas