NSUserDefaults no se borra después de desinstalar la aplicación en el simulador

95

esto puede sonar real NOOB! Quiero verificar si es la segunda vez que el usuario ingresa a mi aplicación, para mantener el recuento de ejecuciones que estoy usando NSUserDefaults. He implementado el código siguiente en mi rootViewController's viewDidLoadmétodo:

    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];

    NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

    if ([userDefaults integerForKey:@"runCount"] != 1) {
        //not the 2nd run
        [userDefaults setInteger:1 forKey:@"runCount"];
        NSLog(@"not 2nd run");
    } else {
        //second run or more
        NSLog(@"2nd run");
    }

    [userDefaults synchronize];

todo funciona bien, pero el problema es que cuando desinstalo (elimino y reinstalo) la aplicación según aquí y aquí, los datos deben borrarse, pero no es así y después de reinstalar la aplicación, los datos anteriores siguen apareciendo. Estoy ejecutando mi aplicación en un simulador de iOS usando xCode6-beta y apuntándome a la aplicación en iOS 8

Reza Shayestehpour
fuente
2
¿Ha intentado realizar pruebas en un dispositivo real?
Henry F
Debe borrarlo manualmente en el simulador. He aquí cómo .
dasblinkenlight
Por favor marque la respuesta correcta para esta pregunta sin respuesta ya no es
Anders
1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Mi aplicación falla aquí en ios8 aunque funciona bien en ios6 e ios7. Aquí selectedlists en NSMutable Array y UserId es una cadena.
Manthan
@Manthan, este es de alguna manera un problema diferente, pero me he enfrentado al mismo problema en otro lugar y la razón que causó el bloqueo fue Aunque el objeto que estaba guardando para alguna clave era NSMutableArrayque se guardó como un NSArrayy cambiarlo hizo que mi aplicación fallara. .. Recomiendo guardar un NSArrayy cuando quieras usarlo, luego lo conviertes en NSMutableArrayusing [NSMutableArray arrayWithArray:array];. Espero que eso ayude.
Reza Shayestehpour

Respuestas:

169

Creo que esto se debe a un error en el simulador Beta de iOS8.

El comportamiento esperado es que cuando se elimina la aplicación, los NSUserDefaults para esa aplicación también se eliminan.

  • Sin embargo, NSUserDefaults NO se eliminan cuando elimina una aplicación del simulador.
  • Se eliminan correctamente cuando los elimina de un dispositivo físico que ejecuta iOS8.

Una solución rápida y molesta por ahora es hacer clic en Simulador de iOS -> Restablecer contenido y configuración.

Xcode 9.2 con Simulator 10 todavía presenta este problema. La opción de menú ahora es Hardware ... Borrar todo el contenido y la configuración

Envié un informe de error por cierto

anders
fuente
45
Lo probé en iOS 8 GM y el error aún existe. Muy molesto.
Manfred Scheiner
1
¡También puedo confirmar este comportamiento erróneo en el simulador Xcode 6 GM y iOS 8 (12A365)!
Boris Brdarić
1
Enlace existente de Open Radar para quien quiera seguir el caso: openradar.appspot.com/18540702
viggio24
1
Parece que el error se corrigió en SDK 8.1 después de la actualización a XCode 6.1 (6A1052d)
kas-kad
2
Para cualquiera que enfrente el mismo problema. Si tiene más de una aplicación en el mismo grupo y todas están usando grupos de aplicaciones (ACTIVADO en las capacidades), tendrá que eliminar todas las aplicaciones del dispositivo para que se borren los valores predeterminados del usuario. Dado que los valores predeterminados del usuario se comparten, incluso si una de las aplicaciones está en el dispositivo, no se eliminará, ya que esa aplicación utilizará los valores predeterminados del usuario.
Ankit Srivastava
14

Dado que Restablecer contenido y configuración es una opción nuclear, podría considerar otras dos opciones hasta que se solucione el error en el simulador de iOS 8 / Xcode 6 GM:

  1. Puede eliminar manualmente el archivo plist donde NSUserDefaultsse almacenan. Actualmente se encuentra en ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist Es un poco tedioso encontrar el simulador adecuado para trabajar entre los nombres de directorio de UUID. EDITAR : 2014-10-28 20-34-52 Ruta correcta: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Podrías realizar una "cirugía" en ese plist (quizás usando una fase de construcción del script de ejecución) usando plistbuddy eg

/usr/libexec/plistbuddy -c "Set :BSDidMoveSqliteDb 0" path_to_plist

FluffulousChimp
fuente
Falta / data / after / * some_device_id * /
El tipo
5

Para cualquiera que enfrente el mismo problema.

Si tiene más de 1 aplicación en el mismo grupo y todas están usando grupos de aplicaciones (ACTIVADO en las capacidades), deberá eliminar todas las aplicaciones del dispositivo para que se borren los valores predeterminados del usuario.

Dado que los valores predeterminados del usuario se comparten, incluso si una de las aplicaciones está en el dispositivo, no se eliminará, ya que esa aplicación utilizará los valores predeterminados del usuario.

Ankit Srivastava
fuente
4

El código debería funcionar bien en el dispositivo. Quizás algunos errores en el simulador.

Intente restablecer los contenidos y la configuración del simulador.

ppalancica
fuente
1
Restablecer contenido y configuración funciona bien, y no tengo un dispositivo en este momento para verificar. tnx :)
Reza Shayestehpour
4

es un error, y puede eliminar NSUserDefaults con el siguiente código

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
ygweric
fuente
2

Si bien esto sigue siendo un error, otra opción podría ser eliminar las claves específicas en NSUserDefaults. La mayoría de las veces, al probar / desarrollar, solo nos interesan unas pocas claves y no todo en NSUserDefaults. Si solo le importan algunas claves, le propongo agregar removeObjectForKey:

NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
// ADD THIS TO SIMULATE CLEAN/EMPTY DEFAULTS, COMMENT OUT AFTER INITIAL EXECUTION.
// This will cause the TRUE case to be executed.
[userDefaults removeObjectForKey:@"runCount"]

NSLog(@"hello %ld", (long)[userDefaults integerForKey:@"runCount"]);

if ([userDefaults integerForKey:@"runCount"] != 1) {
    //not the 2nd run
    [userDefaults setInteger:1 forKey:@"runCount"];
    NSLog(@"not 2nd run");
} else {
    //second run or more
    NSLog(@"2nd run");
}

[userDefaults synchronize];

Agregar removeObjectForKeysimula la primera ejecución de la aplicación, comentarla simulará todas las ejecuciones posteriores de la aplicación.

AdamT
fuente
2

En mi caso encontré el * .plist en el siguiente directorio:

[1] / Usuarios / ALGUNO-NOMBRE DE USUARIO / Biblioteca / Desarrollador / CoreSimulator / Dispositivos / ALGUNO-ID-DISPOSITIVO /data/Library/Preferences/SP.UserDefaultsTest.plist

Problema: Eliminando la aplicación en xCode 6 (simulador de iOS 8) pero el archivo permanece en el disco como se mencionó anteriormente.

Solución: Eliminar el archivo ubicado de la ruta [1] manualmente y los valores predeterminados de NSUser desaparecen.

Entonces, la molesta forma de reiniciar el simulador ya no es necesaria.

sys4tron
fuente