webentwicklung-frage-antwort-db.com.de

Kerndaten & Xcode 11: Bitte wechseln Sie zu "NSSecureUnarchiveFromData" oder einer Unterklasse von NSSecureUnarchiveFromDataTransformer

Ich bin gerade zu Xcode 11 gewechselt und habe beim Start den folgenden Absturz erhalten:

CoreData: Fehler: Ein oder mehrere Modelle in dieser Anwendung verwenden transformierbare Eigenschaften mit Transformatornamen, die entweder nicht festgelegt oder auf NSKeyedUnarchiveFromDataTransformerName festgelegt sind. Wechseln Sie stattdessen zu "NSSecureUnarchiveFromData" oder einer Unterklasse von NSSecureUnarchiveFromDataTransformer. Irgendwann verwendet Core Data standardmäßig "NSSecureUnarchiveFromData", wenn nil angegeben wird, und transformierbare Eigenschaften, die Klassen enthalten, die NSSecureCoding nicht unterstützen, werden unlesbar.

CoreData: Warnung: Die Eigenschaft 'color' in der Entity 'Group' verwendet nil oder einen unsicheren NSValueTransformer. Wechseln Sie stattdessen zu "NSSecureUnarchiveFromData" oder einer Unterklasse von NSSecureUnarchiveFromDataTransformer.

Ich erstelle beim Start ein NSPersistentContainer mit dem folgenden Code:

private let container: NSPersistentContainer = {
    let container = NSPersistentContainer(name: "MyApp", managedObjectModel: MyAppModelVersion.current.managedObjectModel())
    let storeDescription = NSPersistentStoreDescription(url: getStoreURLWithUserName())
    storeDescription.shouldMigrateStoreAutomatically = true
    storeDescription.shouldInferMappingModelAutomatically = true
    container.persistentStoreDescriptions = [storeDescription]
    return container
}()

Der Fehler tritt direkt nach der Ausführung dieser Zeile auf:

let container = NSPersistentContainer(name: "MyApp", managedObjectModel: MyAppModelVersion.current.managedObjectModel())

Ich habe auch eine Eigenschaft namens 'Colorin aGroup` Entität, die transformierbar ist:

@NSManaged public var color: UIColor?
@NSManaged public var hexColorValue: String?

Im Folgenden wird beschrieben, wie die Eigenschaft festgelegt wird:

public var hexColor: String? {
    get {
        return self.hexColorValue
    }
    set {
        self.hexColorValue = newValue
        if let str = newValue {
            self.color = UIColor(hex: str)
        }
    }
}

So sieht die Eigenschaft in Core Data aus:

(enter image description here

Ich bin nicht sicher, wie ich mich von diesem Absturz erholen soll. Dies funktionierte gut mit Xcode 10

9
user1107173

Ich habe beim Aktualisieren auf Xcode 11 die gleichen Warnmeldungen erhalten, in meinem Fall handelt es sich jedoch nur um Warnungen, aber nicht um einen Absturz.

Um die beste Lösung zu finden, habe ich versucht, eine abgespeckte Beispiel-App mit nur einer Entität zu erstellen, die ein transformierbares Attribut enthält. Aber es scheint, dass ich das Problem nicht reproduzieren konnte, egal was ich versuchte. Ich habe die Modelldatei von meiner Haupt-App in die Demo-App kopiert, und das ist natürlich fehlgeschlagen.

So kam ich zu dem Punkt, an dem ich gerade zwei Modelldateien und einen einfachen Komponententest hatte, der nichts weiter tut, als das Modell zu öffnen und einen dauerhaften Speichercontainer zu erstellen:

 func testDataModels() {
     openDataModel(named: "samplemodel")
     openDataModel(named: "appmodel")
 }

 func openDataModel(named name: String) {
    print("Opening \(name)")
     guard let url = findFile(forResource: name, withExtension: "momd"),
           let managedObjectModel = NSManagedObjectModel(contentsOf: url)
     else {
         XCTFail("Unable to find \(name) data model")
         return
     }
    print(url)
     _ = NSPersistentStoreCoordinator(managedObjectModel: managedObjectModel)
 }

 func findFile(forResource name: String, withExtension ext: String) -> URL? {
     if let url = Bundle(for: type(of: self)).url(forResource: name, withExtension: ext) {
         return url
     }
     return Bundle.main.url(forResource: name, withExtension: ext)
 }

Das App-Modell verursacht die Fehlermeldungen, das Beispielmodell jedoch nicht. Selbst wenn ich das App-Modell auf eine einzelne Entität reduziert habe, werden die Fehler weiterhin generiert.

Wenn Sie den Inhalt des Samplemodels mit dem App-Modell vergleichen (Paketinhalt im Finder anzeigen), gibt es im Samplemodel eine versteckte Datei namens .xccurrentversion, jedoch nicht im App-Modell. Die Datei sieht folgendermaßen aus:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.Apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>_XCCurrentVersionName</key>
    <string>samplemodel.xcdatamodel</string>
</dict>
</plist>

Also habe ich eine ähnliche Datei für das App-Modell erstellt und in den Paketordner gelegt. Überraschenderweise bringt das die Warnmeldungen zum Schweigen! Umgekehrt werden beim Löschen der .xccurrentversion-Datei aus dem Beispielmodell die Fehlermeldungen generiert. Dies ermöglicht das isolierte Testen des Problems.

Dies kann also eine kurzfristige Lösung sein. In der Zwischenzeit muss ich herausfinden, wie ich auf sichere Codierung migrieren kann.

1
Dale

Durch Festlegen der Transformer-Eigenschaft auf NSSecureUnarchiveFromDataTransformer wurde die Warnung in meinem Fall behoben. Wählen Sie dazu das Attribut aus und setzen Sie den Transformatortyp auf NSSecureUnarchiveFromDataTransformer. Führen Sie es erneut aus, indem Sie commond + R drücken.

Danke, Ratneshwar

1

Für das transformierbare Attribut müssen Sie seinen Typ im Feld Benutzerdefinierte Klasse festlegen.

Zum Beispiel habe ich ein transformierbares Feld, in dem ein Array von Zahlen gespeichert ist und dessen benutzerdefinierte Klasse als [Int16] Deklariert ist. Dies ist höchstwahrscheinlich die Ursache des Absturzes. Und wie bereits erwähnt, benötigen Sie nicht beide Felder.

Nachdem Ihr Absturz behoben wurde, können Sie die Warnung entfernen, indem Sie das Transformer-Feld auf NSSecureUnarchiveFromData setzen (geben Sie dies einfach in das Feld ein).

0
Angel Olvera