2016-09-12 6 views
15

HINWEIS arbeiten: Ich habe viele andere Beiträge auf Stack-Überlauf über NSUserDefaults-UserDefaults in Swift oder nicht arbeiten Simulator, bis ein Neustart umbenannt gesehen. Das ist sowieso kein Duplikat. Viele der Fragen, gegen die SO vorgeht, sind vor 4 Jahren. Meine Frage bezieht sich speziell auf iOS 10 von diesem Jahr, da dies immer in älteren Versionen funktioniert hat. Ich habe bereits in meiner Frage erwähnt, dass meine Frage kein Duplikat dieser Fragen ist, da es sich um Simulatorfehler in swift handelte und mein Problem auf dem Geräteziel C Fehler liegt. Bitte lesen Sie die Fragen vor der Kennzeichnung als DuplikatiOS 10 mit XCode 8 GM verursacht NSUserDefaults intermittierend nicht

Mein Problem ist anders, da ich dies auf Ziel C und auf dem physischen Gerät selbst reproduzieren kann.

Ich habe ein brandneues Projekt von Grund auf für diesen Test erstellt. Ich legte diesen Code in den viewDidLoad einen View-Controller:

if (![[NSUserDefaults standardUserDefaults] valueForKey:@"checkIfInitialized"]){ 
    NSLog(@"setting checkIfInitialized as not exist"); 
    [[NSUserDefaults standardUserDefaults] setValue:@"test" forKey:@"checkIfInitialized"]; 
    [[NSUserDefaults standardUserDefaults] synchronize]; 
    self.view.backgroundColor=[UIColor redColor]; 
    [email protected]"NSUserDefaults was NOT there, try running again"; 
} else { 
    NSLog(@"checkIfInitialized exists already"); 
    self.view.backgroundColor=[UIColor blueColor]; 
    [email protected]"NSUserDefaults was already there this time, try running again"; 
} 

Nun, wenn ich die app etwa 10-mal, einige Male laufen findet es die checkIfInitialized und manchmal nicht. Keine genaue Anzahl, wie oft es fehlschlägt, da es 3 Mal funktionieren könnte, dann 2 Mal fehlschlagen, dann 4 Mal funktionieren und einmal fehlschlagen und so weiter.

Jetzt ist mir etwas aufgefallen (nicht 100% sicher), dass das Problem nur dann auftritt, wenn ich über Xcode verbunden bin. Wenn ich die App starte, indem ich auf dem Gerät ohne Xcode auf das App-Symbol klicke, scheint es zu funktionieren, aber ich kann nicht 100% ig sicher sein. manchmal

ich diesen Fehler bemerkt auftreten:

[User Defaults] Failed to write value for key checkIfInitialized in CFPrefsPlistSource<0x1700f7200> (Domain: com.xxxx.appname, User: kCFPreferencesCurrentUser, ByHost: No, Container: (null)): Path not accessible, switching to read-only 

ich dieses sehr einfaches Projekt auf meine Dropbox, wenn Sie es heraus testen möchten. Ich würde vorschlagen, 10-15 Mal zu testen, um dieses Problem zu reproduzieren.

https://www.dropbox.com/s/j7vbgl6e15s57ix/nsuserdefaultbug.zip?dl=0

Dieses auf iOS 9 so auf jeden Fall etwas ganz gut funktioniert mit iOS 10.

EDIT Bug angemeldet zu tun: 28287988

Antwort von Apple DTS-Team:

Zunächst sollten Sie zuerst feststellen, ob standardUserDefaults oder valueForKey fehlschlägt. Meine Vermutung ist, dass "standardUserDefaults" NULL zurückgibt, und wenn das der Fall ist, dann sollten Sie das allgemein schützen. Bemerkenswert ist, standardUserDefaults NULL zurück, wenn die Voreinstellungsdatei in der Umgebung verschlüsselt ist die App derzeit ausgeführt wird (beispielsweise Vorlieben wird auf „NSFileProtectionComplete“ und die App im Hintergrund läuft). Das sollte kein Problem für Standard-Vordergrund- Apps sein, aber es ist etwas zu beachten.

Es ist sehr wahrscheinlich, dass Xcode hier tatsächlich das Problem verursacht. Xcode verkompliziert erheblich die Startumgebung der App in einer Weise, die SEHR anders als eine Standard-App-Start ist.Meine Vermutung ist, dass dies grundsätzlich ausgelöst wird durch Xcode Timing induzieren eine erwartete Situation während der App starten, aber wenn Sie einen formelleren Test von wollen, versuchen Sie einen einzelnen Haltepunkt in applicationDidFinishLaunch setzen und im Debugger so bald weiter wie du es getroffen hast. Meine Vermutung ist nur hinzufügen, dass das Timing genug stört, um das Problem von passiert zu stoppen. Irgendwie. Es ist iOS 10 nur in dem Sinne, dass iOS 9 wird nie diese Protokollnachricht drucken, aber das ist, weil die Protokollnachricht in iOS 10 hinzugefügt wurde. Der Code selbst ist ähnlich genug zu iOS 9.3, die ich verdächtige genau das gleiche Verhalten ist (zumindest in der Theorie) möglich in iOS 9.

+0

@Hamish das ist sowieso kein Duplikat. Diese Frage ist vor 4 Jahren. Meine Frage bezieht sich speziell auf iOS 10 von diesem Jahr, da dies immer in älteren Versionen funktioniert hat. –

+1

Mögliches Duplikat von [iOS 10, NSUserDefaults funktioniert nicht] (http://stackoverflow.com/questions/37840288/ios-10-nsuserdefaults-does-not-work) – JAL

+0

@JAL Ich habe in meiner Frage bereits erwähnt, dass meine Frage ist kein Duplikat dieser Fragen, da es sich um Simulatorfehler in swift handelt und mein Problem auf dem Geräteziel C-Fehler liegt. Bitte lesen Sie die Fragen vor der Markierung als Duplikat –

Antwort

8

Ja, das ist definitiv ein reproduzierbarer Fehler.

  • kommt es vor, mit dem GM-Version von Xcode 8 und iOS 10.
  • Es nicht die verknüpfte Frage zu Swift Bezug ist.
  • Es ist nicht die verknüpfte Frage bezieht sich auf Beta-Versionen des Simulators.

Der Fehler passiert auf Geräten und auf dem Simulator. Es ist zeitweise: Das Speichern wird sechs Mal ausgeführt und schlägt dann fehl. Im Gegensatz zu Ihnen habe ich die Nachricht "Schreiben fehlgeschlagen" nicht erhalten.

Der Fehler tritt auch auf, wenn direkt auf dem Gerät ohne Xcode gearbeitet wird. Das ist in der Tat, wie ich es entdeckt habe.

Sie sollten report a bug to Apple, vor allem, da Sie ein kurzes Programm haben, das es reproduzieren wird. Ich werde dasselbe tun.

Ein wesentlicher Unterschied: In meinem Fall ist das Scheitern in Schreiben die Standardeinstellung. Der zuvor geschriebene Wert verbleibt in NSUserDefaults. Manchmal wird ein Schlüssel erfolgreich geschrieben, während ein anderer unverändert ist.

+0

danke für das Update! Ich habe gerade vor ein paar Minuten eine DTS mit Apple paar geloggt, da ich jetzt weiß, dass ich nicht die Einzige bin, die das Problem angeht. Wenn sie denken, dass dies auch ein Fehler sein sollte, dann wird dies ein ziemlich großer Fehler sein und viele Probleme in den Apps verursachen. –

+1

Ich habe gerade einen Fehler 28287988 gemeldet und ein DTS auch protokolliert. Will update was ich finde. –

+0

Bug 28289469 hier. – nugae

0

Eine ähnlich sehr intelligente DTS Antwort von meiner eigenen Supportanfrage. Grundsätzlich ist das Töten mit Xcode mörderischer als alles, was auf dem Gerät passieren würde (selbst die Double-Home-Click-and-Upswipe-Methode) und da alles abrupt abgestürzt ist, wenn Xcode es anhält, kann das faule Schreiben von NSUserDefaults fehlschlagen. oder nur halb fertig sein.

Und in der Tat, reine On-Device-Tests der App, ohne Xcode beteiligt, zeigt, dass alles korrekt auf NSUserDefaults geschrieben wird, wenn die App beendet wird.

Ich habe meinen eigenen Fehlerbericht geschlossen.

+0

FYI - es tritt auch auf MacOS mit Xcode 8.2.1. –

Verwandte Themen