Quiero verificar si mi aplicación para iPhone se está ejecutando por primera vez. Puedo crear un archivo en la carpeta de documentos y verificar ese archivo para ver si es la primera vez que se ejecuta la aplicación, pero quería saber si hay una mejor manera de hacerlo.La mejor manera de verificar si una aplicación de iPhone se está ejecutando por primera vez
Respuesta
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...
}
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];
}
¿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? –
@ 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
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.
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.
¿Cuál es la forma correcta de borrar el almacenamiento (estos "valores predeterminados") del simulador de iPhone? –
¡la única solución funcionó para mí, gracias! –
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
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;
}
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
}
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.
- 1. ¿Cómo puedo verificar si un programa se está ejecutando por primera vez?
- 2. ¿Está usando GetProcessesByName la mejor manera de verificar si un proceso se está ejecutando?
- 3. Cómo determinar si una aplicación web se está ejecutando actualmente
- 4. Comprobando si mi aplicación de Windows se está ejecutando
- 5. ¿Cómo verificar si un SWF se está ejecutando como una aplicación de AIR?
- 6. Cómo detectar si el iphone está sincronizado cuando la aplicación no se está ejecutando
- 7. ¿Cómo verificar si el servidor X se está ejecutando?
- 8. ¿La mejor manera de verificar si una variable es nula?
- 9. ¿Puedo verificar si el iPhone está acoplado?
- 10. Detectar usuario por primera vez en la aplicación Java
- 11. ¿Cómo verificar si un proceso se está ejecutando con Delphi?
- 12. ¿Cómo comprobar si una aplicación WPF ya se está ejecutando?
- 13. ¿Cómo iniciar actividad solo una vez cuando la aplicación se abre por primera vez?
- 14. La mejor manera de hacer una aplicación de iPhone multilingüe
- 15. ¿Cómo puedo saber si mi aplicación para iPhone se está ejecutando cuando se recibe una notificación push?
- 16. ¿Mejor manera de verificar si hay elementos en la lista?
- 17. ¿Cuál es una mejor manera de verificar si una cadena es un número entero en iPhone?
- 18. C# en VS2005: ¿cuál es la mejor manera de verificar si una cadena está vacía?
- 19. mejor manera de verificar el rendimiento de la aplicación web
- 20. ¿La mejor manera de verificar si existe un objeto PowerShell?
- 21. ¿ApplicationDidFinishLaunching: recibe una llamada cuando la aplicación se actualiza y se inicia por primera vez?
- 22. ¿La mejor manera de saber si la aplicación está inactiva en cocoa mac OSX?
- 23. ¿La manera más fácil en C# para averiguar si una aplicación se está ejecutando desde una unidad de red?
- 24. La mejor manera de detectar si el código se está ejecutando en un servidor de aplicaciones java
- 25. Cómo verificar si una NSWindow está visible
- 26. Comprobar si el proceso se está ejecutando
- 27. ¿Cuál es la mejor manera de detectar si una aplicación se inicia con Webstart
- 28. ¿Por qué el servicio de datos WCF funciona mejor mientras se está ejecutando Fiddler?
- 29. Descubriendo si la actividad de Android se está ejecutando
- 30. Android denegación de permisos si otra aplicación en la que no instala por primera vez
dónde probar ?? en la aplicación terminó método de lanzamiento ?? – prajakta
¿Pondría esto en 'applicationDidFinishLaunchingWithOptions'? –
¿Seguirá funcionando si tiene copia de seguridad en la nube? –