Bleiben NSUserDefaults durch ein Update einer App im Appstore bestehen?

106

Ist das der Fall? Werden NSUserDefaults zurückgesetzt, wenn Sie ein Update an eine App im App Store senden, oder werden sie zurückgesetzt?

Meine App stürzt beim Aktualisieren ab, beim vollständigen Herunterladen jedoch nicht ab. Daher versuche ich festzustellen, was in der aktualisierten Sitzung möglicherweise von der frisch heruntergeladenen Sitzung abweichen kann.

Prost, Nick.

Nick Cartwright
quelle
Die Dateien in Dokumenten und Bibliothek werden erhalten , wie die Dokumentation Ansprüche: developer.apple.com/library/ios/#DOCUMENTATION/iPhone/...
Geri Borbás

Antworten:

116

Sie werden normalerweise nicht zurückgesetzt, es sei denn, der Benutzer löscht die App. Für Basisdaten ist NSUserDefaults der beste Weg, um Daten wie Einstellungen, Daten, Zeichenfolgen usw. zu speichern. Wenn Sie Bilder und Dateien speichern möchten, ist das Dateisystem die bessere Wahl.

coneybeare
quelle
5
Gibt es irgendwo in der Apple-Dokumentation, dass dies erwähnt wird?
Nick Cartwright
1
Entschuldigung - ich habe vergessen, Ihnen für Ihre schnelle Antwort zu danken! - Wenn jemand einen Link zu einer Apple-Dokumentation finden kann, die dies sagt, wäre dies hervorragend. In der Dokumentation zu NSUserDefaults wird nichts darüber angegeben. Ich glaube, ich hatte (fälschlicherweise) angenommen, dass die Standardeinstellungen gelöscht werden. Dies scheint der sicherste Weg für Apple zu sein, Apps sicher zu aktualisieren!
Nick Cartwright
Es mag der sicherste Weg sein, aber es wäre unglaublich ärgerlich für Benutzer, wenn sie alle ihre Einstellungen neu festlegen müssten, wenn eine App aktualisiert wird. Ich habe normalerweise drei oder vier App-Updates pro Tag. Ich bin sicher, dass andere iPhone-Nutzer noch mehr haben. Das Löschen der Einstellungen für jedes Update würde mein iPhone grundsätzlich unbrauchbar machen.
Kristopher Johnson
1
Daten im Dokumentenordner können genauso leicht verschwinden wie die NSUserDefaults. Sie sind jedoch beide seltene
Fälle
1
Danke Kristopher - und ja, ich stimme zu. Mein Problem war, dass ich die NSUserDefaults zum Speichern programmatischer Ereignisse verwendet und mich darauf verlassen hatte, dass sie bei der Installation der App zurückgesetzt wurden. Alle meine Tests auf dem iPhone-Gerät (und Apples-Tests) haben die App als Neuinstallation getestet. Ohne Dokumentation oder Möglichkeit zum Testen als Update konnte ich den Update-Absturz, den alle unsere Kunden jetzt erleben, nicht wiederholen. Zusammenfassend - wahrscheinlich hat eine Lektion auf die harte Tour gelernt !!
Nick Cartwright
7

Ich glaube, die Antwort ist JA, sie wird bestehen bleiben. Dies ist auch im Kapitel "Anwendungsverzeichnis" im Apple iPhone OS-Programmierhandbuch vollständig dokumentiert.

Leon
quelle
4
  1. Direkte Antwort auf die gestellte Frage: JA.
  2. Ihr Problem: Ihre App stürzt aufgrund logischer Probleme ab. Angenommen, Sie speichern ein Objekt in den Standardwerten und die App überprüft seinen Wert beim Start (oder anderswo). In Ihrem Update können Sie die Art und Weise ändern, in der es überprüft oder verwendet wird, z. B. wenn Sie einen Wert erwarten, das Objekt jedoch Null ist oder umgekehrt. Dies kann zu SIGABRT oder EXC_BAD_ACCESS führen.
John Smith
quelle
2

Wenn Sie ein CoreData-Modell hatten und etwas an Ihrem Modell und Update geändert haben, ohne die Migration zu verwalten, ist dies wahrscheinlich der Grund, warum Ihre App beim Update abstürzt ...

Bojan Bozovic
quelle
Ich würde erwarten, dass es ein Fall sein könnte :) kein NSUserdefault
Julian Król
1

Ich habe eine ähnliche Erfahrung. Unsere App speichert eine Versionsnummer in Settings.Bundle / Root.Plist. Dies wird über die iPhone-Einstellungs-App angezeigt. Wir stellen fest, dass bei einer Installation die Versionsnummer aus dem App-Bundle geladen wird - daher ist die Versionsnummer korrekt. Bei einem Update ändert sich die Versionsnummer jedoch nicht. Dies vermittelt den Eindruck, dass der Benutzer eine frühere Version der App ausführt. Wir haben keine Logik mit der Versionsnummer verknüpft, sie dient nur zur Anzeige (sie kann von Contact Center-Mitarbeitern bei der Fehlerdiagnose verwendet werden).

Wir haben die Erfahrung gemacht, dass NSUserDefaults nicht gelöscht wird, wenn ein Benutzer unsere App aktualisiert, aber die Anzeige der Einstellungen wird auch nicht aktualisiert.

Derek Knight
quelle
0

Beachten Sie diesen Fall, wenn Ihre App im Hintergrund ausgeführt wird und Sie nicht auf Ihre in NSUserDefaults gespeicherten Werte zugreifen können:

Eric:

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?

Eskimo ([email protected]):

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.

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

Grand M.
quelle