NSUserDefaults não apagado após a desinstalação do aplicativo no simulador

95

isso pode soar real NOOB! Quero verificar se é a segunda vez que o usuário entra em meu aplicativo, para manter a contagem de execuções que estou usando NSUserDefaults. Eu tenho implementado o seguinte código no meu 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];

tudo funciona bem, mas o problema é que quando eu desinstalo (apago e reinstala) o aplicativo de acordo com aqui e aqui os dados devem ser apagados, mas não é e depois de reinstalar o aplicativo os dados anteriores ainda aparecem. Estou executando meu aplicativo no simulador iOS usando xCode6-beta e direcionando o aplicativo no iOS 8

Reza Shayestehpour
fonte
2
Você tentou testar em um dispositivo real?
Henry F
Você precisa limpá-lo manualmente no simulador. Aqui está como .
dasblinkenlight
marque a resposta correta para que esta pergunta não fique mais sem resposta
anders
1
@Reza: [[NSUserDefaults standardUserDefaults] setObject: selectedLists forKey: UserID]. Meu aplicativo trava aqui no ios8, embora funcione bem no ios6 e ios7. Aqui, as listas selecionadas em NSMutable Array e UserId são uma string.
Manthan,
@Manthan, este é um problema diferente, mas eu enfrentei o mesmo problema em outro lugar e o motivo que causou a falha foi Embora o objeto que eu estava salvando para alguma chave foi NSMutableArrayque foi salvo como um NSArraye alterá-lo fez meu aplicativo travar. .. Eu recomendo salvar um NSArraye quando quiser usá-lo mais tarde, lançando-o para NSMutableArrayusar [NSMutableArray arrayWithArray:array];. Espero que ajude.
Reza Shayestehpour

Respostas:

169

Acho que isso se deve a um bug no Simulador Beta do iOS8.

O comportamento esperado é que, quando o aplicativo for excluído, os NSUserDefaults desse aplicativo também sejam excluídos.

  • No entanto, NSUserDefaults NÃO são excluídos quando você remove um aplicativo do simulador.
  • Eles são excluídos corretamente quando você os exclui de um dispositivo físico executando iOS8.

Uma solução rápida e irritante por enquanto é clicar em Simulador de iOS -> Redefinir conteúdo e configurações.

O Xcode 9.2 com Simulador 10 ainda apresenta esse problema. A opção de menu agora é Hardware .. Apagar todo o conteúdo e configurações

Eu enviei um relatório de bug btw

Anders
fonte
45
Testei no iOS 8 GM e o bug ainda existe. Muito irritante.
Manfred Scheiner
1
Também posso confirmar esse comportamento de bug no simulador Xcode 6 GM e iOS 8 (12A365)!
Boris Brdarić
1
Link existente do Open Radar para quem deseja acompanhar o caso: openradar.appspot.com/18540702
viggio24
1
Parece que o bug foi corrigido no SDK 8.1 após a atualização para XCode 6.1 (6A1052d)
kas-kad
2
Para qualquer pessoa que enfrente o mesmo problema. Se você tiver mais de 1 aplicativo no mesmo grupo e todos estiverem usando grupos de aplicativos (ON em recursos), você terá que remover todos os aplicativos do dispositivo para que os padrões do usuário sejam apagados. Uma vez que os padrões do usuário são compartilhados, mesmo se um dos aplicativos estiver no dispositivo, ele não será excluído, pois o aplicativo estará usando os padrões do usuário.
Ankit Srivastava
14

Como Redefinir conteúdo e configurações é uma opção nuclear, você pode considerar duas outras opções até que o bug no simulador iOS 8 / Xcode 6 GM seja corrigido:

  1. Você pode excluir manualmente o arquivo plist onde NSUserDefaultsestão armazenados. Atualmente, ele está localizado em ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/Library/Preferences/com.yourcompany.yourapp.plist É um pouco tedioso encontrar o simulador certo para trabalhar entre os nomes de diretório UUID. EDIT : 2014-10-28 20-34-52 Caminho correto: ~/Library/Developer/CoreSimulator/Devices/*some_device_id*/data/Library/Preferences/com.yourcompany.yourapp.plist

  2. Você pode realizar uma "cirurgia" nesse plist (usando uma fase de construção de script de execução, talvez) usando plistbuddy, por exemplo

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

FluffulousChimp
fonte
Falta / data / after / * some_device_id * /
O cara de
5

Para qualquer pessoa que enfrente o mesmo problema.

Se você tiver mais de 1 aplicativo no mesmo grupo e todos estiverem usando grupos de aplicativos (ON em recursos), você terá que remover todos os aplicativos do dispositivo para que os padrões do usuário sejam apagados.

Uma vez que os padrões do usuário são compartilhados, mesmo se um dos aplicativos estiver no dispositivo, ele não será excluído, pois o aplicativo estará usando os padrões do usuário.

Ankit Srivastava
fonte
4

O código deve funcionar bem no dispositivo. Talvez alguns bugs no simulador.

Tente redefinir o conteúdo e as configurações do simulador.

ppalancica
fonte
1
A redefinição de conteúdo e configurações funciona bem e não tenho um dispositivo no momento para verificar. tnx :)
Reza Shayestehpour
4

é um bug, e você pode excluir NSUserDefaults com o seguinte código

 NSString *appDomain = [[NSBundle mainBundle] bundleIdentifier];
 [[NSUserDefaults standardUserDefaults] removePersistentDomainForName:appDomain];
iguérico
fonte
2

Embora ainda seja um bug, outra opção poderia ser remover a (s) chave (s) específica (s) em NSUserDefaults. Na maioria das vezes, ao testar / desenvolver, nos preocupamos apenas com algumas chaves e não tudo em NSUserDefaults. Se você se preocupa apenas com algumas chaves, proponho adicionar 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];

Adicionar removeObjectForKeysimula a primeira execução do aplicativo, comentar irá simular todas as execuções subsequentes do aplicativo.

AdamT
fonte
2

No meu caso, encontrei o * .plist no seguinte diretório:

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

Problema: Excluindo o aplicativo no xCode 6 (simulador iOS 8), mas o arquivo permanece no disco como mencionado acima.

Solução: Excluir o arquivo localizado do caminho [1] manualmente e os NSUserDefaults desaparecerão.

Portanto, a maneira irritante de reiniciar o simulador não é mais necessária.

sys4tron
fonte