NSUserDefaults non cancellati dopo la disinstallazione dell'app sul simulatore


95

questo può sembrare vero NOOB! Voglio controllare se è la seconda volta che l'utente accede alla mia applicazione, in modo da mantenere il conteggio delle esecuzioni che sto utilizzando NSUserDefaults. Ho implementato il seguente codice nel mio rootViewControllers' viewDidLoadmetodo:

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

tutto funziona bene, ma il problema è che quando disinstallo (elimino e reinstallo) l'applicazione secondo qui e qui i dati dovrebbero essere cancellati, ma non lo è e dopo aver reinstallato l'app i dati precedenti vengono ancora visualizzati. Sto eseguendo la mia app sul simulatore iOS utilizzando xCode6-beta e indirizzando l'applicazione su iOS 8


2
Hai provato a testare su un dispositivo reale?
Henry F

Devi cancellarlo manualmente sul simulatore. Ecco come .
dasblinkenlight

si prega di contrassegnare la risposta corretta in modo che questa domanda non sia più senza risposta
anders

1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. La mia app si arresta in modo anomalo qui in ios8 sebbene funzioni bene in ios6 e ios7. Qui selectedlists in NSMutable Array e UserId è una stringa.
Manthan

@Manthan questo è in qualche modo un problema diverso, ma ho affrontato lo stesso problema da qualche altra parte e il motivo che ha causato l'arresto anomalo era Sebbene l'oggetto che stavo salvando per una chiave fosse NSMutableArraystato salvato come NSArraye cambiarlo ha causato il crash della mia app. .. vi consiglio il salvataggio di una NSArraye quando si desidera utilizzare in un secondo momento il cast a NSMutableArrayutilizzare [NSMutableArray arrayWithArray:array];. Spero che aiuti.
Reza Shayestehpour

Risposte:


169

Penso che ciò sia dovuto a un bug nel simulatore beta di iOS8.

Il comportamento previsto è che quando l'app viene eliminata, vengono eliminati anche i NSUserDefaults per quell'app.

  • Tuttavia, NSUserDefaults NON vengono eliminati quando rimuovi un'app dal simulatore.
  • Vengono eliminati correttamente quando vengono eliminati da un dispositivo fisico con iOS8.

Una soluzione rapida e fastidiosa per ora è fare clic su Simulatore iOS -> Ripristina contenuto e impostazioni.

Xcode 9.2 con Simulator 10 presenta ancora questo problema. L'opzione di menu ora è Hardware .. Cancella tutto il contenuto e le impostazioni

Ho inviato una segnalazione di bug tra l'altro


45
L'ho testato su iOS 8 GM e il bug è ancora presente. Molto noioso.
Manfred Scheiner

1
Posso anche confermare questo comportamento difettoso nel simulatore GM di Xcode 6 e iOS 8 (12A365)!
Boris Brdarić

1
Collegamento Open Radar esistente per chi vuole seguire il caso: openradar.appspot.com/18540702
viggio24

1
Sembra che il bug sia stato risolto su SDK 8.1 dopo l'aggiornamento a XCode 6.1 (6A1052d)
kas-kad

2
Per chiunque abbia lo stesso problema. Se hai più di 1 app nello stesso gruppo e tutte utilizzano gruppi di app (ON sotto le funzionalità), dovrai rimuovere tutte le app dal dispositivo per cancellare le impostazioni predefinite dell'utente. Poiché le impostazioni predefinite dell'utente sono condivise, anche se una delle app è sul dispositivo, non verrà eliminata, poiché quell'app utilizzerà le impostazioni predefinite dell'utente.
Ankit Srivastava

14

Poiché Ripristina contenuto e impostazioni è un'opzione nucleare, potresti prendere in considerazione altre due opzioni fino a quando non viene risolto il bug sul simulatore GM di iOS 8 / Xcode 6:

  1. È possibile eliminare manualmente il file plist in cui NSUserDefaultssono archiviati. Questo si trova attualmente in ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist È un po 'noioso trovare il simulatore giusto con cui lavorare tra i nomi delle directory UUID. EDIT : 2014-10-28 20-34-52 Percorso corretto: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Potresti eseguire un "intervento chirurgico" su quel plist (usando forse una fase di creazione dello script di esecuzione) usando plistbuddy es

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


Ti manca / data / dopo / * some_device_id * /
The dude

5

Per chiunque abbia lo stesso problema.

Se hai più di 1 app nello stesso gruppo e tutte utilizzano gruppi di app (ON sotto le funzionalità), dovrai rimuovere tutte le app dal dispositivo per cancellare le impostazioni predefinite dell'utente.

Poiché le impostazioni predefinite dell'utente sono condivise, anche se una delle app è sul dispositivo, non verrà eliminata, poiché l'app utilizzerà le impostazioni predefinite dell'utente.


4

Il codice dovrebbe funzionare correttamente sul dispositivo. Forse alcuni bug nel simulatore.

Prova a ripristinare i contenuti e le impostazioni per il simulatore.


1
Il ripristino di contenuti e impostazioni funziona correttamente e al momento non ho un dispositivo da controllare. tnx :)
Reza Shayestehpour

4

è un bug e puoi eliminare NSUserDefaults con il codice seguente

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

2

Anche se questo è ancora un bug, un'altra opzione potrebbe essere quella di rimuovere le chiavi specifiche in NSUserDefaults. La maggior parte delle volte, durante il test / sviluppo, ci preoccupiamo solo di poche chiavi e non di tutto in NSUserDefaults. Se ti interessano solo poche chiavi di quanto propongo di aggiungere 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];

L'aggiunta removeObjectForKeysimula la prima esecuzione dell'app, commentandola simulerà tutte le successive esecuzioni dell'app.


2

Nel mio caso ho trovato * .plist nella seguente directory:

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

Problema: eliminazione dell'app in xCode 6 (simulatore iOS 8) ma il file rimane su disco come menzionato sopra.

Soluzione: l' eliminazione manuale del file individuato dal percorso [1] e NSUserDefaults non sono più disponibili.

Quindi il modo fastidioso per resettare il simulatore non è più necessario.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.