web-dev-qa-db-de.com

NSUserDefaults wurde nach der Deinstallation der App im Simulator nicht gelöscht

das mag echt NOOB klingen! Ich möchte überprüfen, ob der Benutzer meine Anwendung zum zweiten Mal aufruft. Daher verwende ich NSUserDefaults, um die Anzahl der ausgeführten Aktionen zu erhalten. Ich habe den folgenden Code in die rootViewController-Methode meiner viewDidLoad implementiert:

    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];

alles funktioniert einwandfrei, aber das Problem ist, dass beim Deinstallieren (Löschen und erneutes Installieren) der Anwendung gemäß hier und hier die Daten gelöscht werden sollten, dies jedoch nicht der Fall ist und nach der erneuten Installation der App werden immer noch die vorherigen Daten angezeigt. Ich führe meine App mit xCode6-beta auf dem iOS-Simulator aus und richte sie auf iOS 8 aus

92

Ich denke, das liegt an einem Fehler im iOS8 Beta Simulator.

Das erwartete Verhalten ist, dass beim Löschen der App auch die NSUserDefaults für diese App gelöscht werden.

  • NSUserDefaults werden jedoch NICHT gelöscht, wenn Sie eine App aus dem Simulator entfernen.
  • Sie werden korrekt gelöscht, wenn Sie sie von einem physischen Gerät mit iOS8 löschen.

Eine schnelle und ärgerliche Lösung fürs Erste ist, auf iOS Simulator -> Inhalte und Einstellungen zurücksetzen zu klicken.

Xcode 9.2 mit Simulator 10 zeigt dieses Problem weiterhin an. Die Menüoption lautet jetzt Hardware. Alle Inhalte und Einstellungen löschen

Ich habe übrigens einen Fehlerbericht eingereicht

166
anders

Da das Zurücksetzen von Inhalten und Einstellungen eine wichtige Option ist, können Sie zwei weitere Optionen in Betracht ziehen, bis der Fehler im iOS 8/Xcode 6 GM Simulator behoben ist:

  1. Sie können die plist-Datei, in der die NSUserDefaults gespeichert sind, manuell löschen. Dies befindet sich derzeit bei ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist Es ist etwas mühsam, unter den UUID-Verzeichnisnamen den richtigen Simulator für die Arbeit zu finden. [~ # ~] edit [~ # ~] : 2014-10-28 20-34-52 Richtiger Pfad: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Sie könnten eine "Operation" an dieser Plist durchführen (möglicherweise unter Verwendung einer Ausführungsskript-Erstellungsphase), indem Sie plistbuddy z.

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

14
FluffulousChimp

es ist ein Fehler und Sie können NSUserDefaults mit folgendem Code löschen

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

Der Code sollte auf dem Gerät einwandfrei funktionieren. Vielleicht ein paar Bugs im Simulator.

Versuchen Sie, Inhalte und Einstellungen für den Simulator zurückzusetzen.

4
ppalancica

Für alle, die das gleiche Problem haben.

Wenn Sie mehr als eine App in derselben Gruppe haben und alle von ihnen App-Gruppen verwenden (unter Funktionen aktiviert), müssen Sie alle Apps vom Gerät entfernen, damit die Benutzerstandards gelöscht werden.

Da die Benutzervorgaben gemeinsam genutzt werden, wird eine App, die sich auf dem Gerät befindet, nicht gelöscht, da diese App die Benutzervorgaben verwendet.

2

In meinem Fall habe ich die * .plist in folgendem Verzeichnis gefunden:

[1]/Users/ SOME-USERNAME /Library/Developer/CoreSimulator/Devices/ SOME-DEVICE-ID /data/Library/Preferences/SP.UserDefaultsTest.plist

Problem: Löschen der App in xCode 6 (iOS 8-Simulator), aber die Datei bleibt wie oben erwähnt auf der Festplatte.

Lösung: Das manuelle Löschen der gefundenen Datei aus Pfad [1] und die NSUserDefaults sind weg.

Das lästige Zurücksetzen des Simulators entfällt somit.

2
sys4tron

Während dies immer noch ein Fehler ist, besteht eine andere Möglichkeit darin, die spezifischen Schlüssel in NSUserDefaults zu entfernen. Die meiste Zeit, wenn wir testen/entwickeln, kümmern wir uns nur um ein paar Schlüssel und nicht um alles in NSUserDefaults. Wenn Ihnen nur ein paar Schlüssel wichtig sind, dann schlage ich vor, removeObjectForKey hinzuzufügen:

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];

Durch Hinzufügen von removeObjectForKey wird der erste Lauf der App simuliert, durch Auskommentieren werden alle nachfolgenden App-Ausführungen simuliert.

2
AdamT