Beachten Sie diesen Fall, wenn Ihre App im Hintergrund ausgeführt wird und Sie nicht auf Ihre in NSUserDefaults gespeicherten Werte zugreifen können:
Es gab viele Threads und Fehler, aber es passiert mir wieder in iOS 9. Ich habe eine App, die im Hintergrund als Reaktion auf NSURLSession-Aufgaben und inhaltsverfügbare Pushs gestartet wird. Wenn ich mein Telefon neu starte und auf einen Hintergrundstart meiner App warte, stelle ich reproduzierbar fest, dass [[NSUserDefaults standardUserDefaults] dictionaryRepresentation] alle Systemwerte enthält, z. B. AppleITunesStoreItemKinds usw., jedoch nicht einen der von mir eingestellten Werte. Wenn ich die App zwangsweise beende und neu starte, kehren alle meine Werte zurück. Gibt es eine Möglichkeit zu vermeiden, dass die "leeren" standardUserDefaults zwischengespeichert werden, bevor das Telefon entsperrt wird, oder zumindest festzustellen, wann sie durcheinander sind, und sie zu beheben, ohne die App zwangsweise beenden zu müssen?
Das Problem hierbei ist, dass NSUserDefaults letztendlich durch eine Datei im Container Ihrer App gesichert wird und der Container Ihrer App dem Datenschutz unterliegt. Wenn Sie unter iOS 7 und höher nichts Besonderes tun, verwendet Ihr Container NSFileProtectionCompleteUntilFirstUserAuthentication, einen Wert, der vom NSUserDefaults-Sicherungsspeicher geerbt wird, sodass Sie vor dem ersten Entsperren nicht darauf zugreifen können.
IMO ist der beste Weg, dies zu umgehen, NSUserDefaults für Dinge zu vermeiden, auf die Sie sich in Codepfaden verlassen, die im Hintergrund ausgeführt werden können. Speichern Sie diese Einstellungen stattdessen in Ihrer eigenen Einstellungsdatei, deren Datenschutz Sie explizit verwalten können (in diesem Fall bedeutet dies "Auf NSFileProtectionNone setzen").
Es gibt zwei Probleme mit NSUserDefaults in einem Datenschutzkontext:
Es handelt sich um eine vollständig abstrakte API: Das Vorhandensein und der Speicherort des Sicherungsspeichers werden nicht als Teil dieser API betrachtet, sodass Sie den Datenschutz nicht explizit verwalten können.
Hinweis In neueren Versionen von OS X wird NSUserDefaults von einem Daemon verwaltet, und Leute, die versuchen, den Sicherungsspeicher direkt zu manipulieren, sind auf Probleme gestoßen. Es ist leicht vorstellbar, dass irgendwann auf iOS dasselbe passiert.
Selbst wenn eine Änderung des Datenschutzes möglich wäre, verfügt NSUserDefaults über keinen Mechanismus zum Klassifizieren von Daten basierend auf dem Kontext, in dem Sie sie verwenden. Es ist eine "Alles oder Nichts" -API. In Ihrem Fall möchten Sie den Schutz nicht vor allen Standardeinstellungen Ihrer Benutzer entfernen, sondern nur vor denen, auf die Sie vor dem ersten Entsperren im Hintergrund zugreifen müssen.
Wenn eines dieser Daten wirklich vertraulich ist, sollten Sie es in den Schlüsselbund einfügen. Insbesondere kann der Schlüsselbund den Datenschutz Artikel für Artikel festlegen.