iOS 11 - Kerndaten - UIColor ist kein transformierbares Attribut

8

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.

    
George Brown 01.09.2017, 17:01
quelle

2 Antworten

4

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 Brown 13.10.2017, 21:33
quelle
1

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.

%Vor%

Jetzt kann ich meine Dateien wieder lesen. Danke George!

    
Wizard of Kneup 15.10.2017 08:57
quelle