2012-01-06 19 views
8

Tengo una aplicación actualmente en la tienda de aplicaciones a la que me propongo enviar una actualización pronto.¿Cómo saber si una aplicación iOS se ha instalado o actualizado recientemente?

Con esta actualización Quiero añadir un código que le dirá a la aplicación cuando se ejecuta por primera vez application:didFinishLaunchingWithOptions si se trata de:

  1. Una nueva instalación desde la tienda de aplicaciones.
  2. recién actualizado desde una versión anterior

No hay ningún código en la aplicación actualmente en la tienda de aplicaciones para manejar esto.
La aplicación usa una base de datos SQLite, pero por razones que no entraré aquí no quiero usar una verificación de su existencia como una solución a este problema.

Como una pregunta adicional, sin almacenar los datos manualmente, ¿hay un SDK que pueda usar para consultar cuándo se instaló una aplicación en un dispositivo? (Preferiblemente compatible con iOS 3.0)

He visto un similar question, pero ninguna de las respuestas se aplica a trabajar con el código de tienda de aplicaciones existente.

Respuesta

7

Puede guardar un número de versión en NSUserDefaults y actualizarlo en consecuencia.

Si eso no funciona, es posible que pueda liberar una versión intermedia que presente el esquema de control de versiones.

Si esa no es una opción, es posible que pueda verificar si hay rastros de ejecuciones anteriores a partir de los archivos que crea o las preferencias que establece de forma condicional o perezosa.

+4

¿Cuál es el problema? Sin número de versión == versión anterior. – Krizz

+0

En algunos casos, podría introducir el esquema de versión en una versión intermedia en ese escenario. ¿Puedes pensar en datos persistentes o claves de preferencia que no existan en el primer lanzamiento? – justin

+0

genial - He ampliado la respuesta con esos detalles. – justin

18

El siguiente código puede ayudar a responder su pregunta acerca de cuándo se instaló una aplicación. No estoy seguro si la fecha de creación del paquete de la aplicación es la fecha de compilación de XCode o la fecha de descarga, ya que no se ha probado desde la tienda de aplicaciones.

NSString *bundleRoot = [[NSBundle mainBundle] bundlePath]; // e.g. /var/mobile/Applications/<GUID>/<AppName>.app 
NSFileManager *manager = [NSFileManager defaultManager]; 
NSDictionary* attrs = [manager attributesOfItemAtPath:bundleRoot error:nil]; 
NSLog(@"Build or download Date/Time of first version to be installed: %@", [attrs fileCreationDate]); 
NSLog(@"Date/Time of last install (unless bundle changed by code): %@", [attrs fileModificationDate]); 
NSString *rootPath = [bundleRoot substringToIndex:[bundleRoot rangeOfString:@"/" options:NSBackwardsSearch].location]; // e.g /var/mobile/Applications/<GUID> 
attrs = [manager attributesOfItemAtPath:rootPath error:nil]; 
NSLog(@"Date/Time first installed (or first reinstalled after deletion): %@", [attrs fileCreationDate]); 
+0

Gracias por esta nueva forma de encontrar si hay una nueva instalación o no, incluso si no tenemos la configuración NSUserDefaults en la versión anterior. – Alex

+2

Pruebo con una aplicación de tienda de aplicaciones existente, y parece que el primer registro proporciona la fecha/hora de descarga y no la fecha/hora de compilación. – Alex

+2

¡Esta es una muy buena respuesta! Debería marcarse con razón la respuesta correcta. –

3

prueba este código, sé que soy demasiado tarde para esta respuesta, pero para compartir knwoldge aquí voy.

-(void) checkIsAppUpdated 
{ 
NSString *urlString = @"http://itunes.apple.com/lookup?id=995558215"; 
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:urlString]]; 

[request setHTTPMethod:@"GET"]; 

NSError *error = nil; 
NSURLResponse *response = nil; 
NSData *data = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&error]; 

//NSString *stringReply = (NSString *)[[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding]; 

if (error) 
{ 
    // NSLog(@"Error: %@", stringReply); 
    //error reviced 

} 
else 
{ 
    //The response is in data 
    //NSLog(@"Success: %@", stringReply); 
    NSDictionary *dictResponse = [NSJSONSerialization JSONObjectWithData:data options:NSJSONReadingMutableContainers error:nil]; 
    float appStoreVersion=[[[[dictResponse objectForKey:@"results"] firstObject] objectForKey:@"version"] floatValue]; 

    NSLog(@"app stroe version=%f",appStoreVersion); 

    NSString *strLocalVersion=[[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleShortVersionString"]; 
    float localAppVersion=[strLocalVersion floatValue]; 
    if (localAppVersion!=appStoreVersion) 
    { 
     //open app store url 
     // NSString *iTunesLink = @"itms://itunes.apple.com/us/app/apple-store/id375380948?mt=8"; 
     [[UIApplication sharedApplication] openURL:[NSURL URLWithString:@"https://itunes.apple.com/app/washthenfold/id995558215?mt=8"]]; 
    } 
} 

} 

nota

Identificación: Identificación del -replace con su propio ID de aplicación. puede obtener el ID de la aplicación desde itune conectar la aplicación seleccionada-> más información-> metadatos

dado que el simulador no tiene aplicación de tienda de aplicaciones, este código no funcionará en el simulador.

0

GBVersionTracking is good pod para rastrear todo el historial de versiones.

[GBVersionTracking isFirstLaunchEver]; 
0

Aquí es un simple código para saber si la versión actual es diferente

-(BOOL) needsUpdate 
{ 
    NSDictionary* infoDictionary = [[NSBundle mainBundle] infoDictionary]; 
    NSString* appID = infoDictionary[@"CFBundleIdentifier"]; 
    NSURL* url = [NSURL URLWithString:[NSString stringWithFormat:@"http://itunes.apple.com/lookup?bundleId=%@", appID]]; 
    NSData* data = [NSData dataWithContentsOfURL:url]; 
    NSDictionary* lookup = [NSJSONSerialization JSONObjectWithData:data options:0 error:nil]; 

    if ([lookup[@"resultCount"] integerValue] == 1) 
    { 
     NSString* appStoreVersion = lookup[@"results"][0][@"version"]; 
     NSString* currentVersion = infoDictionary[@"CFBundleShortVersionString"]; 
     if (![appStoreVersion isEqualToString:currentVersion]) 
     { 
      NSLog(@"Need to update [%@ != %@]", appStoreVersion, currentVersion); 
      return YES; 
     } 
    } 
    return NO; 
} 

Nota (funciona este código en el simulador también.): Asegúrese de que al entrar en la nueva versión de iTunes, esto coincide con la versión en la aplicación que está lanzando. De lo contrario, el código anterior siempre devolverá SÍ, independientemente de si el usuario se actualiza.

Cuestiones relacionadas