Enviaré una actualización de mi aplicación con una nueva estructura de datos, por lo tanto, si un usuario está actualizando mi aplicación, necesito actualizar sus datos actuales. Entonces me preguntaba cómo puedo saber programáticamente si el usuario actualizó mi aplicación o instaló una nueva copia (si hay una nueva copia instalada, no necesito actualizar nada).¿Cómo saber si el usuario ha actualizado la aplicación o ha instalado una copia nueva?
Respuesta
Eso depende del tipo de estructura de datos que esté utilizando.
En general, te aconsejaría no depender de la comprobación de su versión de la aplicación: un usuario utilizando 2,0 podría haber acaba de actualizar o que podría ser un nuevo usuario.
Prefiero comprobar si ya hay una estructura de datos, y actuar en consecuencia. Asumiendo que está usando un almacenamiento de Datos Core respaldado por Sqlite, puede verificar si el archivo .sqlite existe o verificar si hay objetos en su almacenamiento.
Sólo tiene que guardar la versión del paquete en algún lugar y comprobar si se diferencia de
[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleVersion"]]
en cada inicio de aplicaciones.
Verificar la estructura de datos es una solución sólida. Empecé a preocuparme en mis propias aplicaciones sobre personas que no actualizan para varias versiones. Sentí que esto llevaría a una miríada de controles de estructura. El código que muestro a continuación determina y almacena la versión y la versión anterior en el NSUserDefaults
. Podría codificar los diferentes escenarios de diferencias de versión si fuera necesario.
NSUserDefaults *prefs = [NSUserDefaults standardUserDefaults];
BOOL versionUpgraded;
NSString *version = [[[NSBundle mainBundle] infoDictionary] objectForKey:@"CFBundleVersion"];
NSString *preVersion = [prefs stringForKey:@"appVersion"];
if ([prefs stringForKey:@"appVersion"] != nil) {
//see if version is the same as prior
//if not it is an Upgraded
versionUpgraded = !([preVersion isEqualToString: version]);
} else {
//nil means new install
//This needs to be YES for the case that
//"appVersion" is not set anywhere else.
versionUpgraded = YES;
}
if (versionUpgraded) {
[prefs setObject:version forKey:@"appVersion"];
[prefs setObject:preVersion forKey:@"prevAppVersion"];
[prefs synchronize];
}
He creado una categoría para esto. Simplemente implemente las dos nuevas llamadas de delegado encontradas en el encabezado. Se basa bastante en las bibliotecas de tiempo de ejecución obj-c, así que asegúrese de tener confianza con ellos antes de usar esto.
.h
#import <UIKit/UIKit.h>
@protocol UIApplicationDelegate <UIApplicationDelegate>
@optional
- (void) application:(UIApplication *)application willUpdateToVersion: (NSString*) newVersion fromVersion: (NSString*) previousVersion;
- (void) application:(UIApplication *)application didUpdateToVersion: (NSString*) newVersion fromVersion: (NSString*) previousVersion;
@end
@interface UIApplication (Versioning)
@end
.m
#import "UIApplication+Versioning.h"
#import <objc/message.h>
#import <objc/runtime.h>
static NSString* UIApplicationVersionFileName = @"app.ver";
@implementation UIApplication (Versioning)
+ (void) load {
Method original, swizzled;
original = class_getInstanceMethod(self, @selector(setDelegate:));
swizzled = class_getInstanceMethod(self, @selector(swizzled_setDelegate:));
method_exchangeImplementations(original, swizzled);
}
- (void) swizzled_setDelegate: (id<UIApplicationDelegate>) delegate {
IMP implementation = class_getMethodImplementation([self class], @selector(swizzled_application:didFinishLaunchingWithOptions:));
class_addMethod([delegate class], @selector(swizzled_application:didFinishLaunchingWithOptions:), implementation, "[email protected]:@@");
Method original, swizzled;
original = class_getInstanceMethod([delegate class], @selector(application:didFinishLaunchingWithOptions:));
swizzled = class_getInstanceMethod([delegate class], @selector(swizzled_application:didFinishLaunchingWithOptions:));
method_exchangeImplementations(original, swizzled);
[self swizzled_setDelegate: delegate];
}
- (BOOL)swizzled_application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {
//Check for a version change
NSError* error;
NSArray* directories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString* versionFilePath = [[directories objectAtIndex: 0] stringByAppendingPathComponent: UIApplicationVersionFileName];
NSString* oldVersion = [NSString stringWithContentsOfFile: versionFilePath
encoding: NSUTF8StringEncoding
error: &error];
NSString* currentVersion = [[[NSBundle mainBundle] infoDictionary] objectForKey: @"CFBundleVersion"];
switch (error.code) {
case NSFileReadNoSuchFileError:
{
//Delegate methods will not be called first time
oldVersion = [currentVersion copy];
[currentVersion writeToFile: versionFilePath
atomically: YES
encoding: NSUTF8StringEncoding
error: &error];
break;
}
default:
{
NSLog(@"Warning: An error occured will loading the application version file -> Recreating file");
[[NSFileManager defaultManager] removeItemAtPath: versionFilePath
error: nil];
oldVersion = [currentVersion copy];
[currentVersion writeToFile: versionFilePath
atomically: YES
encoding: NSUTF8StringEncoding
error: &error];
break;
}
}
if(![oldVersion isEqualToString: currentVersion]) {
if ([[application delegate] respondsToSelector: @selector(application:willUpdateToVersion:fromVersion:)]) {
objc_msgSend([application delegate], @selector(application:willUpdateToVersion:fromVersion:), currentVersion, oldVersion);
}
[currentVersion writeToFile: versionFilePath
atomically: YES
encoding: NSUTF8StringEncoding
error: &error];
if ([[application delegate] respondsToSelector: @selector(application:didUpdateToVersion:fromVersion:)]) {
objc_msgSend([application delegate], @selector(application:willUpdateToVersion:fromVersion:), currentVersion, oldVersion);
}
}
SEL realSelector = @selector(swizzled_application:didFinishLaunchingWithOptions:);
return (BOOL) objc_msgSend([application delegate], realSelector, application, launchOptions);
}
@end
- 1. ¿Cómo saber si una aplicación iOS se ha instalado o actualizado recientemente?
- 2. Cómo saber cuando un usuario ha salido de la página y actualizado la página
- 3. Cómo saber si el cliente ha cerrado la conexión
- 4. ¿Cómo saber si un usuario específico ha calificado una aplicación de Android?
- 5. ¿Cómo puedo saber si la computadora se ha reiniciado?
- 6. inotify - ¿cómo saber qué usuario ha modificado el archivo?
- 7. ¿Cómo puedo saber si el SP1 se ha instalado en VS2008?
- 8. ¿Cómo saber si una entidad JPA separada ya ha sido persistente o no?
- 9. ¿Cómo comprobar si gcc ha fallado, ha devuelto una advertencia o ha tenido éxito? (en bash)
- 10. Cómo saber si el registro ha cambiado en Postgres
- 11. Compras integradas de iOS: la mejor manera de saber si el usuario ha comprado
- 12. Cómo saber si una aplicación se ha movido a la tarjeta SD en Android
- 13. ¿Cómo puedo saber si un Arrastramiento ha finalizado en Winforms?
- 14. ¿Cómo saber si el cliente ha terminado en los zócalos
- 15. Cómo saber si Proguard ha hecho su trabajo
- 16. Idea: rememberable significa que last_sign_in_at no se ha actualizado rastreable
- 17. ¿Cómo sé que mi aplicación Android se ha actualizado para restablecer una alarma?
- 18. ¿Cómo puedo saber si una punta de Globo en la bandeja del sistema se ha cerrado?
- 19. Manera correcta de saber si una actividad ha sido destruida
- 20. Cómo saber si el usuario ha seleccionado un tema claro u oscuro
- 21. ¿Cómo saber qué objeto ha sido eliminado?
- 22. Cómo saber si sys.stdout se ha eliminado en Python
- 23. El método de formulario predeterminado IE7 es "GET". ¿Cómo puedo saber si el usuario ha ingresado o está predeterminado?
- 24. ¿Cómo puedo saber si se ha eliminado un `NSManagedObject`?
- 25. cómo comprobar si la tostada se ha descartado o no
- 26. ¿Cómo programar una tarea si el usuario ha iniciado sesión o no en PowerShell?
- 27. Cómo detectar si un usuario ha cerrado sesión, en php?
- 28. Detectar si el salvapantallas está activo y/o el usuario ha bloqueado la pantalla en Windows
- 29. Detectar si el usuario ha usado el botón Atrás
- 30. ¿Cómo saber si una imagen se ha subido o no? - Paperclip
¿Qué estructura de datos 'está usando? Datos básicos? – magma