2009-11-02 13 views

Respuesta

69

Me gusta usar NSUserDefaults para almacenar una indicación de la primera ejecución.

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

[[NSUserDefaults standardUserDefaults] synchronize]; 

A continuación, puede probar por ello más tarde ...

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

dónde probar ?? en la aplicación terminó método de lanzamiento ?? – prajakta

+0

¿Pondría esto en 'applicationDidFinishLaunchingWithOptions'? –

+0

¿Seguirá funcionando si tiene copia de seguridad en la nube? –

5

En delegado de la aplicación registrar un valor por defecto:

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

A continuación, en la que desea comprobar:

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

¿No deberías configurar tu FirstLaunch en NO en el if..stmt para que no se ejecute en la próxima iteración de la aplicación? –

+0

@ brian.clear, solo si no necesita confirmar que el usuario vio el contenido que deseaba mostrar, no tiene la inicialización para hacer/confirmar, etc. Por ejemplo, en mi caso en la primera ejecución, quiero el usuario para confirmar que vio el tutorial o eligió omitirlo, en lugar de hacer clic en abrir, luego bloquear su teléfono y, finalmente, mi aplicación quedará fuera de la memoria. Puede sonar poco común, pero lo he hecho muchas veces cuando descargué una nueva aplicación mientras esperaba en la cola de algún sitio, lanzando la aplicación la primera vez y luego bloqueando mi teléfono inmediatamente, porque era mi turno en la fila. Por lo tanto, depende del caso de uso. ¿Tener sentido? – thephatp

1

Use NSUserDefaults. Si sharedDefault tiene una clave para su aplicación, se ejecuta antes. Por supuesto, deberá hacer que la aplicación cree al menos una entrada predeterminada la primera vez que se ejecute la aplicación.

8

Ok, lo que me confunde por los valores predeterminados del usuario.

¿DÓNDE están almacenados?

  • no te importa que varía según el iOS/Mac.
  • que acaba de getValue por KEY
  • setValue por KEY + sincronizar
  • iOS/Mac hace el resto.

Este es el caso de uso común: Comprobación de la existencia de un valor por ejemplo FirstRun. La primera vez NO EXISTE, por lo general, seguido de establecer el valor. 2ª manga - el siguiente bucle existe y otro caso de uso/else prop se desencadena

---- .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; 
    //============= 

// NOTA IMPORTANTE SI lE RootViewController comprueba appDelegate.firstRun entonces asegúrese de hacer º e Compruebe anterior antes de establecer self.window.rootViewController aquí

self.window.rootViewController = self.navController; 


    [self.window makeKeyAndVisible]; 
    return YES; 
} 

---- USO DE LA BANDERA

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

Los ejemplos anteriores me confundió un poco, ya que muestran cómo comprobar si es la primera vez pero luego mencione cómo 'verificarlo más tarde' en el mismo comentario. El problema es que cuando descubrimos que no existe lo creamos inmediatamente y sincronizamos. Por lo tanto, verificarlo tarde significa realmente reiniciar la aplicación no en la misma ejecución que la primera ejecución.

+0

¿Cuál es la forma correcta de borrar el almacenamiento (estos "valores predeterminados") del simulador de iPhone? –

+0

¡la única solución funcionó para mí, gracias! –

+0

De forma predeterminada, boolForKey devuelve falso, las cadenas serán nulas, etc. Si desea inicializar los valores predeterminados del usuario, simplemente use registerDefaults, con las claves y valores que desea usar. Si desea inicializar una fecha, podría usar [NSDate distantFuture] – shim

4

Puede implementarlo con el método estático a continuación. Creo que es mejor ya que puede llamar a este método tantas veces como quiera, a diferencia de las otras soluciones. disfrutar de: (Tenga en cuenta que no es seguro para subprocesos)

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

Se puede utilizar un método de categoría personalizada isFirstLaunch con UIViewController + FirstLaunch.

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

Y cuando necesite usarlo en el controlador

BOOL launched = [self isFirstLaunch]; 

if (launched) { 
//if launched 
} 
else { 
//if not launched 
} 
0

Swift:

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

Otro consejo:

Al utilizar NSUserDefaults, estos ajustes serán eliminados si el la aplicación se borra alguna vez Si por alguna razón necesita que estas configuraciones sigan pendientes, puede almacenarlas en el Llavero.

Cuestiones relacionadas