Esteja ciente deste caso, quando seu aplicativo está sendo executado em segundo plano e você não pode acessar seus valores armazenados em NSUserDefaults:
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?
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.