webentwicklung-frage-antwort-db.com.de

CoreData-Absturzfehler Xcode 11 Beta, IOS 13 Beta

Ich versuche, meine Anwendung aus Xcode11 Beta auf dem Telefon zu erstellen IOS 13 Beta. Ich habe einen Absturz beim Laden der Anwendung.

2019-07-22 13: 58: 12.910460 + 0300 GoodWine [3738: 792501] [Fehler] 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: 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.

2019-07-22 13: 58: 12.910595 + 0300 GoodWine [3738: 792501] [Fehler] CoreData: 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 'value' für die Entität 'SFMCKeyValueEntity' verwendet nil oder einen unsicheren NSValueTransformer. Wechseln Sie stattdessen zu "NSSecureUnarchiveFromData" oder einer Unterklasse von NSSecureUnarchiveFromDataTransformer.

Ich habe diese Lösung gefunden. Die Fehler sind verschwunden und es scheint zu funktionieren. Ich teste weiter.

Für alle transformierbaren Attribute habe ich "Transformer" im Bereich "Datenmodellinspektor" auf "NSSecureUnarchiveFromData" gesetzt. (Bild zur Verdeutlichung)

BEARBEITEN:

Nach einigen Testtagen füge ich meiner vorherigen Lösung etwas hinzu.

Die vorherige Lösung funktioniert, wenn die Anwendung nach den Änderungen gelöscht wird. Andernfalls wird das Datenmodell nicht erkannt und von Grund auf neu erstellt, wobei alle historischen Informationen verloren gehen (und in der Produktion ist dies nicht akzeptabel !!!).

Die endgültige Lösung, die ich gewählt habe, bestand darin, diese Änderungen einem neuen Modell hinzuzufügen (im Anschluss an diesen Link ) und die Migration zu implementieren (immer im Link beschrieben).

In diesem Fall wird die Warnung nach dem Update nur einmal angezeigt und verschwindet dann.

25
SirOz

Meine Lösung bestand darin, bei alten Standardtransformatoren zu bleiben, um Kompatibilitätsprobleme zu vermeiden. Die Probleme können auftreten, da Standardtransformatoren (Nulltransformatoren) möglicherweise durch NSSecureUnarchiveFromData ersetzt werden. Ich bin nicht sicher, ob zuvor beibehaltene Werte ordnungsgemäß decodiert werden (sie wurden vom Standardtransformator codiert, aber nach dem Update werden sie von NSSecureUnarchiveFromDataTransformer decodiert). Ich habe einen expliziten Standardtransformator für Felder von NSDictionary-, NSArray- und NSSet-Foundation-Typen implementiert, die standardmäßig der NSCoding entsprechen:

@objc(DefaultTransformer)
class DefaultTransformer: ValueTransformer {
    override class func transformedValueClass() -> AnyClass {
        return NSData.self
    }

    override open func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let value = value as? Data else {
            return nil
        }
        return NSKeyedUnarchiver.unarchiveObject(with: value)
    }

    override class func allowsReverseTransformation() -> Bool {
        return true
    }

    override func transformedValue(_ value: Any?) -> Any? {
        guard let value = value else {
            return nil
        }
        return NSKeyedArchiver.archivedData(withRootObject: value)
    }
}

Für meine speziellen Datentypen, die der NSCoding entsprechen, habe ich bestimmte Transformatoren wie folgt implementiert:

@objc(EmailTransformer)
class EmailTransformer: ValueTransformer {
    override class func transformedValueClass() -> AnyClass {
        return NSData.self
    }

    override open func reverseTransformedValue(_ value: Any?) -> Any? {
        guard let value = value as? Data else {
            return nil
        }
        return NSKeyedUnarchiver.unarchiveObject(with: value)
    }

    override class func allowsReverseTransformation() -> Bool {
        return true
    }

    override func transformedValue(_ value: Any?) -> Any? {
        guard let value = value as? [Email] else {
            return nil
        }
        return NSKeyedArchiver.archivedData(withRootObject: value)
    }
}

Danach habe ich diese Transformatoren für die transformierbaren Felder eingestellt und mich daher explizit für den sichersten Weg entschieden. Vorteile der Lösung: Sie müssen sich nicht um die Datenmigration kümmern, sondern müssen nur explizite Transformatoren implementieren und diese auf eine bereits vorhandene Datenmodellversion setzen.

2
kas-kad