Ich speichere Farben in meinem binären Core Data Store unter Verwendung eines transformierbaren Attributs und spezifiziere die Klasse des Attributs als UIColor wie folgt:
%Vor%In der Betaversion von iOS 11 funktioniert das nicht mehr mit folgendem Fehler:
%Vor%Ich habe es geschafft, das spezifische Problem in einem XCode-Projekt auf GitHub zu replizieren (Muss zweimal mit dem XCode Beta ausgeführt werden, um den Fehler).
Im Demoprojekt wird der Speichertyp von NSPersistentStoreDescription gesteuert und auf NSBinaryStoreType gesetzt, was ich in dem AppDelegate im exanple-Projekt mache, und ich füge Objekte in der Anwendung didFinishLaunchingWithOptions hinzu, ansonsten ist es die Standardvorlage aus einer iOS11 App mit Core Daten. Plus ein kleines Datenmodell und Klassen.
Wenn Sie das Projekt zweimal ausführen, erstellt es das erste Mal den Datenspeicher und alles ist in Ordnung. Beim zweiten Mal versucht der Datenspeicher die App zu öffnen und stürzt ab. Dieses Problem scheint nur mit binären Datenspeichern verbunden zu sein, was ich sagen kann, wenn ich einen SQL-gestützten Datenspeicher verwende, funktioniert es. Allerdings ist meine App in der Wildnis und verwendet binär.
Ich habe es Apple als einen Fehler gemeldet und Hilfe in den Entwicklerforen gesucht, aber Apple hat den Fehler nicht erkannt und keine Hilfe kam.
Ich mache mir ein bisschen Sorgen, da das iOS11-Veröffentlichungsdatum näher rückt und ich keine Lösung habe, meine App wird einfach nicht in iOS11 funktionieren.
Ich habe versucht, die Eigenschaft in NSData zu ändern und zu sehen, ob es möglich ist, die Daten einfach zu entpacken, aber es scheint, dass sie immer noch intern als UIColor gespeichert wird und die Datenbank einfach nicht geöffnet wird.
Kann jemand einen Workaround sehen? Ich habe die App in freier Wildbahn und möglicherweise ein Update zum Konvertieren der Datenspeicher, bevor iOS11 könnte für einige arbeiten, aber das wird nicht garantieren, dass alle Benutzer die Fehlerbehebung erhalten und sie könnten ihre Daten verlieren.
EDIT 1: Radarnummer: 33895450
EDIT 2: Es ist mir gerade aufgefallen, dass dies für any transformierbare Attribute in Kerndaten gilt, die von der Fehlermeldung unterstützten Werte sind nur die Standard-Eigenschaftstypen.
EDIT 3: Nur aus Neugierde habe ich alle Felder für das transformierbare Attribut ausgefüllt (es wurde vorher nie benötigt). Ich habe "NSKeyedUnarchiveFromData" hinzugefügt, um den Transformer-Namen der Core-Datenentität anzugeben. Es sollte der Standardwert sein, aber Sie wissen nie. Kein Effekt. Es muss sowieso den Werttransformator verwenden, um zu wissen, dass es ein UIColor ist. Ich füllte das benutzerdefinierte Klassenfeld aus, um UIColor, keine Wirkung zu sein.
Edit 5: Ich habe früher bemerkt, dass UIColor nun NSSecureCoding unterstützt, sollte Sicherheit irgendwie das Problem sein, das in dem anderen Store irgendwie übersehen wird.
Bearbeiten: Jetzt, da iOS veröffentlicht wurde, habe ich eine meiner TSIs verwendet, um dies weiter zu eskalieren. Bekomme ich sie zurück, wenn ich eine brauche, um sie dazu zu bringen, ihre Software zu reparieren?
Edit: Apple hat auf meiner TSI zu mir zurückgerufen, sie sagten, es wird untersucht, es gibt keine Workaround, und auf den Fehler warten. Sie haben meine TSI erstattet, weil sie nicht helfen konnten.
Edit 8: Das gleiche Problem auf macOS High Sierra, mit NSColor anstelle von UIColor.
Apple hat mir immer noch keine Rückmeldung zu meinem aktuellen Fehlerbericht gegeben.
Nun, Apple hat es mir gesagt, es gibt neue persistentStore-Optionen!
Der Text, den ich von Apple bekommen habe:
/ * Ermöglicht Entwicklern, einen zusätzlichen Satz von Klassen bereitzustellen (die muss NSSecureCoding implementieren), das beim Dekodieren von a verwendet werden soll Binärspeicher. Diese Option ist der Verwendung vorzuziehen NSBinaryStoreInsecureDecodingCompatibilityOption. * / COREDATA_EXTERN NSString * const NSBinaryStoreSecureDecodingClasses API_AVAILABLE (macosx (10.13), ios (11.0), tvos (11.0), Watchos (4.0));
/ * Geben Sie an, dass der Binärspeicher unsicher decodiert werden soll. Dies Dies kann erforderlich sein, wenn ein Geschäft Metadaten oder transformierbare Eigenschaften aufweist enthält nicht standardisierte Klassen. Wenn möglich, sollten Entwickler verwenden die NSBinaryStoreSecureDecodingClasses-Option, um das Enthaltene anzugeben Klassen, damit der Binärspeicher sicher decodiert werden kann. Anwendungen, die vor dem Verfügbarkeitsdatum verknüpft sind, werden standardmäßig verwendet diese Option. * / COREDATA_EXTERN NSString * const NSBinaryStoreInsecureDecodingCompatibilityOption API_AVAILABLE (Macosx (10.13), iOS (11.0), TVOS (11.0), Watchos (4.0));
Es ist nicht sofort klar, aber im Grunde müssen Sie ein NSSet von Klassen angeben, die Sie als transformierbare Attribute verwenden, die mit NSSecureCoding als Option beim Öffnen Ihres persistenten Speichers übereinstimmen.
Ein Beispiel für meine Verwendung des UIColor:
%Vor%BEARBEITEN: Hinzufügen einer Lösung für die neuere Methode zum Öffnen von persistenten Stammdatenspeichern mithilfe von NSPersistentStoreDescription. Dieser Code basiert auf der aktuellen Kerndatenvorlage.
%Vor%Ich habe auch mein gitHub-Projekt mit dem Update in einem Zweig aktualisiert
George hat die ganze harte Arbeit gemacht. Ich habe es nur auf Swift angewendet. Hier ist meine Lösung. Ich habe es in meinen Nachkommen NSPersistentDocument
eingefügt.
Jetzt kann ich meine Dateien wieder lesen. Danke George!
Tags und Links objective-c xcode core-data ios11 macos-high-sierra