NSUserDefaults persiste por meio de uma atualização para um aplicativo na Appstore?

106

É este o caso? Os NSUserDefaults são redefinidos quando você envia uma atualização para um aplicativo na App Store ou eles são redefinidos?

Meu aplicativo está travando quando atualizado, mas não travando quando baixado completamente - então estou tentando determinar o que poderia ser diferente na sessão atualizada para a sessão recém-baixada.

Saúde, Nick.

Nick Cartwright
fonte
Os arquivos em Documentos e Biblioteca serão preservados conforme afirma a documentação: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/…
Geri Borbás

Respostas:

116

Eles geralmente não são redefinidos, a menos que o usuário exclua o aplicativo. Para dados básicos, NSUserDefaults é a melhor maneira de salvar dados como preferências, datas, strings etc. Se você está procurando salvar imagens e arquivos, o sistema de arquivos é uma aposta melhor.

Coneybeare
fonte
5
Há algum lugar na documentação da Apple que isso é mencionado?
Nick Cartwright,
1
Desculpe - esqueci de agradecer sua resposta rápida! - Se alguém puder encontrar um link para qualquer forma de documentação da Apple que diga isso, seria excelente .... Na documentação para NSUserDefaults não diz nada sobre isso, então eu acho que (incorretamente) assumi que os padrões foram apagados. Esta parece ser a maneira mais segura para a Apple atualizar aplicativos!
Nick Cartwright,
Pode ser a maneira mais segura, mas seria extremamente irritante para os usuários se eles tivessem que redefinir todas as suas preferências sempre que um aplicativo fosse atualizado. Geralmente, tenho três ou quatro atualizações de aplicativos por dia; Tenho certeza de que outros usuários do iPhone têm ainda mais. Limpar as preferências de cada atualização basicamente tornaria meu iPhone inutilizável.
Kristopher Johnson
1
Os dados na pasta de documentos podem desaparecer tão facilmente quanto os NSUserDefaults. No entanto, ambas são ocasiões raras e não têm absolutamente nada a ver com o processo normal de atualização
coneybeare
1
Obrigado Kristopher - e sim, eu concordo. Meu problema era que eu havia usado NSUserDefaults para armazenar eventos programáticos e confiava em que eles fossem redefinidos quando o aplicativo fosse instalado. Todos os meus testes no dispositivo iPhone (e os testes da Apple) testaram o aplicativo como uma nova instalação. Sem qualquer documentação ou forma de testar como uma atualização, não consegui repetir a falha de atualização que todos os nossos clientes estão experimentando. Para resumir - provavelmente uma lição aprendida da maneira mais difícil !!
Nick Cartwright
7

Eu acredito que a resposta é SIM, vai persistir. Isso também está totalmente documentado no capítulo Application Directory do Apple iPhone OS Programming Guide.

leon
fonte
4
  1. Resposta direta à pergunta postada: SIM.
  2. Seu problema: Seu aplicativo falha devido a problemas de lógica. Suponha que você armazene um objeto em padrões e o aplicativo verifique seu valor na inicialização (ou em outro lugar). Na sua atualização, você pode alterar a forma como ele é verificado ou usado, por exemplo, você espera um valor, mas o objeto é nulo, ou vice-versa. Isso pode causar um SIGABRT ou EXC_BAD_ACCESS.
John smith
fonte
2

Se você tinha o modelo CoreData e mudou algo em seu modelo e atualizou, sem gerenciar a migração, esse é provavelmente o motivo pelo qual seu aplicativo trava na atualização ...

Bojan Bozovic
fonte
Eu esperaria que fosse um caso :) não um NSUserdefault
Julian Król
1

Eu tenho uma experiência semelhante. Nosso aplicativo armazena um número de versão em Settings.Bundle / Root.Plist. Isso é exibido por meio do aplicativo Configurações do iPhone. O que descobrimos é que em uma instalação, o número da versão é carregado do pacote de aplicativos - portanto, o número da versão está correto. Em uma atualização, no entanto, o número da versão não muda. Isso dá a impressão de que o usuário está executando uma versão anterior do aplicativo. Não temos nenhuma lógica vinculada ao número da versão, é apenas para exibição (pode ser usado pela equipe do contact center no diagnóstico de falhas).

Nossa experiência é que NSUserDefaults não é apagado quando um usuário atualiza nosso aplicativo, mas a tela Configurações também não é atualizada.

Derek Knight
fonte
0

Esteja ciente deste caso, quando seu aplicativo está sendo executado em segundo plano e você não pode acessar seus valores armazenados em NSUserDefaults:

Eric:

Houve muitos tópicos e bugs sobre isso, mas está acontecendo comigo novamente no ios 9. Eu tenho um aplicativo que é iniciado em segundo plano em resposta a tarefas NSURLSession e pushes de conteúdo disponível. Reproduzivelmente, se eu reiniciar meu telefone e esperar por uma inicialização em segundo plano do meu aplicativo, então, quando eu abrir o aplicativo, descubro que [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] contém todos os valores do sistema, por exemplo, AppleITunesStoreItemKinds, etc., mas não contém qualquer um dos valores que defini. Se eu forçar o encerramento e reiniciar o aplicativo, todos os meus valores voltam. Existe alguma maneira de evitar o armazenamento em cache dos standardUserDefaults "vazios" antes de o telefone ser desbloqueado, ou pelo menos determinar quando eles estão bagunçados e corrigi-los sem ter que forçar o encerramento do aplicativo?

Eskimo ([email protected]):

O problema aqui é que NSUserDefaults é basicamente feito por um arquivo no contêiner do seu aplicativo e o contêiner do seu aplicativo está sujeito à proteção de dados. Se você não fizer nada de especial, no iOS 7 e posterior, seu contêiner usará NSFileProtectionCompleteUntilFirstUserAuthentication, um valor que é herdado pelo armazenamento de apoio NSUserDefaults e, portanto, você não pode acessá-lo antes do primeiro desbloqueio.

IMO, a melhor maneira de contornar isso é evitar NSUserDefaults para coisas que você confia em caminhos de código que podem ser executados em segundo plano. Em vez disso, armazene essas configurações em seu próprio arquivo de preferências, cuja proteção de dados você pode gerenciar explicitamente (neste caso, isso significa 'definir como NSFileProtectionNone').

Existem dois problemas com NSUserDefaults em um contexto de proteção de dados:

É uma API totalmente abstrata: a presença e a localização de seu armazenamento de apoio não são consideradas parte dessa API, portanto, você não pode gerenciar explicitamente sua proteção de dados.

Nota Em versões recentes do OS X, NSUserDefaults é gerenciado por um daemon e as pessoas que tentam manipular seu armazenamento de apoio diretamente têm problemas. É fácil imaginar o mesmo tipo de coisa chegando ao iOS em algum ponto.

Mesmo se alterar a proteção de dados fosse possível, NSUserDefaults não tem mecanismo para classificar os dados com base no contexto em que você os está usando; é uma API 'tudo ou nada'. No seu caso, você não deseja remover a proteção de todos os seus padrões de usuário, apenas aqueles que você precisa acessar em segundo plano antes do primeiro desbloqueio.

Finalmente, se algum desses dados for realmente sensível, você deve colocá-lo nas chaves. Notavelmente, o chaveiro tem a capacidade de definir a proteção de dados item por item.

Fonte: https://webcache.googleusercontent.com/search?q=cache:sR9eZNHpZtwJ:https://forums.developer.apple.com/thread/15685

Grand M
fonte