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

95

das mag echt NOOB klingen! Ich möchte überprüfen, ob der Benutzer meine Anwendung zum zweiten Mal aufruft, um die von mir verwendete Laufanzahl beizubehalten NSUserDefaults. Ich habe den folgenden Code in meinem implementiert rootViewController‚s - viewDidLoadMethode:

    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 erneuten 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 immer noch die vorherigen Daten angezeigt werden. Ich führe meine App auf einem iOS-Simulator mit xCode6-beta aus und ziele auf die Anwendung auf iOS 8 ab

Reza Shayestehpour
quelle
2
Haben Sie versucht, auf einem tatsächlichen Gerät zu testen?
Henry F
Sie müssen es manuell im Simulator löschen. Hier ist wie .
Dasblinkenlight
Bitte markieren Sie die richtige Antwort, damit diese Frage nicht mehr unbeantwortet bleibt
anders
1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Meine App stürzt hier in ios8 ab, obwohl sie in ios6 und ios7 einwandfrei funktioniert. Hier sind ausgewählte Listen in NSMutable Array und UserId eine Zeichenfolge.
Manthan
@Manthan Dies ist ein anderes Problem, aber ich habe das gleiche Problem woanders festgestellt und der Grund, der den Absturz verursacht hat, war Obwohl das Objekt, das ich für einen Schlüssel NSMutableArraygespeichert habe, als gespeichert wurde NSArrayund das Ändern meiner App zum Absturz brachte. .. Ich empfehle, ein zu speichern NSArrayund wenn Sie es später verwenden möchten, um es zu NSMutableArrayverwenden [NSMutableArray arrayWithArray:array];. Ich hoffe das hilft.
Reza Shayestehpour

Antworten:

169

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 nervige Lösung ist vorerst das Klicken auf iOS Simulator -> Inhalt und Einstellungen zurücksetzen.

Xcode 9.2 mit Simulator 10 weist dieses Problem weiterhin auf. Die Menüoption ist jetzt Hardware. Alle Inhalte und Einstellungen löschen

Ich habe übrigens einen Fehlerbericht eingereicht

anders
quelle
45
Getestet auf iOS 8 GM und der Fehler ist immer noch vorhanden. Sehr nervig.
Manfred Scheiner
1
Ich kann dieses fehlerhafte Verhalten auch in Xcode 6 GM Simulator und iOS 8 (12A365) bestätigen!
Boris Brdarić
1
Bestehender Open Radar Link für diejenigen
möchten
1
Es sieht so aus, als ob der Fehler in SDK 8.1 nach dem Update auf XCode 6.1 (6A1052d) behoben wurde
kas-kad
2
Für alle, die vor dem gleichen Problem stehen. Wenn Sie mehr als eine App unter derselben Gruppe haben und alle App-Gruppen verwenden (EIN unter Funktionen), müssen Sie alle Apps vom Gerät entfernen, damit die Benutzerstandards gelöscht werden. Da die Benutzerstandards gemeinsam genutzt werden, wird sie auch dann nicht gelöscht, wenn sich eine der Apps auf dem Gerät befindet, da diese App die Benutzerstandards verwendet.
Ankit Srivastava
14

Da das Zurücksetzen von Inhalten und Einstellungen eine nukleare 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 sie NSUserDefaultsgespeichert sind, manuell löschen . Dies befindet sich derzeit unter ~/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 diese Operation mit plistbuddy "operieren" ( z. B. mithilfe einer Build-Phase zum Ausführen eines Skripts), z

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

FluffulousChimp
quelle
Sie vermissen / data / after / * some_device_id * /
Der Typ
5

Für alle, die vor dem gleichen Problem stehen.

Wenn Sie mehr als eine App unter derselben Gruppe haben und alle App-Gruppen verwenden (EIN unter Funktionen), müssen Sie alle Apps vom Gerät entfernen, damit die Standardeinstellungen des Benutzers gelöscht werden.

Da die Benutzerstandards gemeinsam genutzt werden, wird sie nicht gelöscht, auch wenn sich eine der Apps auf dem Gerät befindet, da diese App die Benutzerstandards verwendet.

Ankit Srivastava
quelle
4

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

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

ppalancica
quelle
1
Das Zurücksetzen von Inhalten und Einstellungen funktioniert einwandfrei, und ich habe derzeit kein Gerät zum Überprüfen. tnx :)
Reza Shayestehpour
4

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

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

Während dies immer noch ein Fehler ist, könnte eine andere Option darin bestehen, die spezifischen Schlüssel in NSUserDefaults zu entfernen. Meistens kümmern wir uns beim Testen / Entwickeln nur um ein paar Schlüssel und nicht um alles in NSUserDefaults. Wenn Sie sich nur für ein paar Schlüssel interessieren, dann schlage ich vor, Folgendes hinzuzufügen 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];

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

AdamT
quelle
2

In meinem Fall habe ich die * .plist im folgenden 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: Löschen Sie die gefundene Datei manuell aus Pfad [1], und die NSUserDefaults sind nicht mehr vorhanden.

Das nervige Zurücksetzen des Simulators ist also nicht mehr erforderlich.

sys4tron
quelle