NSUserDefaults nie zostały wyczyszczone po odinstalowaniu aplikacji na symulatorze

95

to może brzmieć naprawdę NOOB! Chcę sprawdzić, czy użytkownik po raz drugi wchodzi do mojej aplikacji, aby zachować licznik uruchomień, którego używam NSUserDefaults. I wprowadziły następujący kod w moim rootViewController„s viewDidLoadmetody:

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

wszystko działa dobrze, ale problem polega na tym, że gdy odinstaluję (skasuję i przeinstaluję) aplikację zgodnie z tu i tu dane powinny zostać wyczyszczone, ale tak nie jest i po ponownym zainstalowaniu aplikacji nadal pojawiają się poprzednie dane. Używam mojej aplikacji na symulatorze iOS przy użyciu xCode6-beta i przeznaczam aplikację na iOS 8

Reza Shayestehpour
źródło
2
Czy próbowałeś testować na rzeczywistym urządzeniu?
Henry F
Musisz to ręcznie wyczyścić w symulatorze. Oto jak .
dasblinkenlight
zaznacz poprawną odpowiedź, aby to pytanie nie było już bez odpowiedzi
anders
1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Moja aplikacja ulega awarii tutaj w ios8, chociaż działa dobrze na ios6 i ios7. Tutaj selectedlists w NSMutable Array i UserId to ciąg.
Manthan
@Manthan to jest jak inny problem, ale napotkałem ten sam problem gdzie indziej, a powodem, który spowodował awarię, był Chociaż obiekt NSMutableArray, który zapisałem dla jakiegoś klucza , został zapisany jako a, NSArraya zmiana go spowodowała awarię aplikacji. .. Zalecam zapisanie a, NSArraya gdy zechcesz użyć go później, przerzucając go na NSMutableArrayużywanie [NSMutableArray arrayWithArray:array];. Mam nadzieję że to pomogło.
Reza Shayestehpour

Odpowiedzi:

169

Myślę, że jest to spowodowane błędem w symulatorze iOS8 Beta.

Oczekiwane zachowanie polega na tym, że po usunięciu aplikacji wartości NSUserDefaults dla tej aplikacji są również usuwane.

  • Jednak NSUserDefaults są NIE usuwane po usunięciu aplikacji z symulatora.
  • Są one poprawnie usuwane po usunięciu ich z fizycznego urządzenia z systemem iOS8.

Szybkim i denerwującym rozwiązaniem na razie jest kliknięcie, Symulator iOS -> Resetuj zawartość i ustawienia.

Xcode 9.2 z Symulatorem 10 nadal przedstawia ten problem. Opcja menu to teraz Sprzęt .. Usuń całą zawartość i ustawienia

Przy okazji przesłałem raport o błędzie

Anders
źródło
45
Przetestowałem to na iOS 8 GM i błąd nadal istnieje. Bardzo irytujące.
Manfred Scheiner
1
Mogę również potwierdzić to błędne zachowanie w symulatorze Xcode 6 GM i iOS 8 (12A365)!
Boris Brdarić
1
Istniejący link Open Radar dla tych, którzy chcą śledzić sprawę: openradar.appspot.com/18540702
viggio24
1
Wygląda na to, że błąd został naprawiony w SDK 8.1 po aktualizacji do XCode 6.1 (6A1052d)
kas-kad
2
Dla każdego, kto ma ten sam problem. Jeśli masz więcej niż 1 aplikację w tej samej grupie i wszystkie używają grup aplikacji (WŁĄCZONE w ramach możliwości), będziesz musiał usunąć wszystkie aplikacje z urządzenia, aby ustawienia domyślne użytkownika zostały wyczyszczone. Ponieważ wartości domyślne użytkownika są udostępniane, nawet jeśli jedna z aplikacji znajduje się na urządzeniu, nie zostanie ona usunięta, ponieważ ta aplikacja będzie używać ustawień userdefault.
Ankit Srivastava
14

Ponieważ Resetuj zawartość i ustawienia jest opcją nuklearną, możesz rozważyć dwie inne opcje, dopóki błąd w symulatorze iOS 8 / Xcode 6 GM nie zostanie rozwiązany:

  1. Możesz ręcznie usunąć plik plist, w którym NSUserDefaultssą przechowywane. Obecnie znajduje się ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist on pod adresem Znalezienie odpowiedniego symulatora do pracy z nazwami katalogów UUID jest trochę uciążliwe. EDYCJA : 2014-10-28 20-34-52 Prawidłowa ścieżka: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Możesz wykonać "operację" na tej plistie (być może używając fazy budowania skryptu uruchamiania) używając np. Plistbuddy

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

FluffulousChimp
źródło
Brakuje / data / after / * some_device_id * /
The dude
5

Dla każdego, kto ma ten sam problem.

Jeśli masz więcej niż 1 aplikację w tej samej grupie i wszystkie używają grup aplikacji (włączone w ramach możliwości), będziesz musiał usunąć wszystkie aplikacje z urządzenia, aby ustawienia domyślne użytkownika zostały wyczyszczone.

Ponieważ wartości domyślne użytkownika są udostępniane, nawet jeśli jedna z aplikacji znajduje się na urządzeniu, nie zostanie ona usunięta, ponieważ ta aplikacja będzie używać ustawień userdefault.

Ankit Srivastava
źródło
4

Kod powinien działać poprawnie na urządzeniu. Może jakieś błędy w symulatorze.

Spróbuj zresetować zawartość i ustawienia symulatora.

ppalancica
źródło
1
Resetowanie zawartości i ustawień działa dobrze, a nie mam w tej chwili urządzenia do sprawdzenia. tnx :)
Reza Shayestehpour
4

jest to błąd i możesz usunąć NSUserDefaults za pomocą następującego kodu

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
ygweric
źródło
2

Chociaż nadal jest to błąd, inną opcją może być usunięcie określonych kluczy w NSUserDefaults. W większości przypadków podczas testowania / programowania zależy nam tylko na kilku kluczach, a nie o wszystkim w NSUserDefaults. Jeśli zależy Ci tylko na kilku klawiszach to proponuję dodać 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];

Dodanie removeObjectForKeysymuluje pierwsze uruchomienie aplikacji, a wykomentowanie spowoduje symulację wszystkich kolejnych uruchomień aplikacji.

AdamT
źródło
2

W moim przypadku znalazłem * .plist w następującym katalogu:

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

Problem: Usunięcie aplikacji w xCode 6 (symulator iOS 8), ale plik pozostaje na dysku, jak wspomniano powyżej.

Rozwiązanie: ręczne usunięcie zlokalizowanego pliku ze ścieżki [1] i usunięcie NSUserDefaults.

Tak więc irytujący sposób resetowania symulatora nie jest już potrzebny.

sys4tron
źródło