2 votes

Comment déterminer quel attribut transformable des données de base n'utilise pas le codage sécurisé ?

J'ai un modèle de données de base avec quelques attributs transformables. Lorsque j'essaie de récupérer une entité du magasin, j'obtiens un avertissement

'NSKeyedUnarchiveFromData' should not be used to for un-archiving and will be removed in a future release

Je comprends ce que cela signifie - nous sommes censés utiliser un transformateur de valeur qui utilise la fonction NSSecureCoding pour coder et décoder l'attribut. Le problème est que, pour autant que je puisse en juger, je am en utilisant un transformateur de valeur de codage sécurisé. J'ai quatre attributs transformables dans cette entité. Deux d'entre eux utilisent un transformateur nommé NSSecureUnarchiveFromData . Les deux autres utilisent des transformateurs personnalisés qui sont enregistrés auprès de ValueTransformer.setValueTransformer(_:forName:) .

J'ai placé un point d'arrêt sur +[NSKeyedUnarchiver unarchiveObjectWithData:] et bien sûr, j'ai touché le point d'arrêt lorsque j'ai essayé de récupérer l'entité. La trace de la pile est la suivante

  * frame #0: 0x00007fff207e4abf Foundation`+[NSKeyedUnarchiver unarchiveObjectWithData:]
    frame #1: 0x00007fff2516b4ef CoreData`+[_PFRoutines retainedDecodeValue:forTransformableAttribute:] + 58
    frame #2: 0x00007fff250fdf78 CoreData`_prepareResultsFromResultSet + 2535
    frame #3: 0x00007fff250fbddf CoreData`newFetchedRowsForFetchPlan_MT + 2095
    frame #4: 0x00007fff253486f1 CoreData`_executeFetchRequest + 55
    frame #5: 0x00007fff2529b56a CoreData`-[NSSQLFetchRequestContext executeRequestCore:] + 41
    frame #6: 0x00007fff25310b4e CoreData`-[NSSQLStoreRequestContext executeRequestUsingConnection:] + 405
    frame #7: 0x00007fff252e28cb CoreData`__52-[NSSQLDefaultConnectionManager handleStoreRequest:]_block_invoke + 56
    frame #8: 0x00007fff2524b3c1 CoreData`__37-[NSSQLiteConnection performAndWait:]_block_invoke + 28
    frame #9: 0x0000000108ee6a88 libdispatch.dylib`_dispatch_client_callout + 8
    frame #10: 0x0000000108ef5cac libdispatch.dylib`_dispatch_lane_barrier_sync_invoke_and_complete + 132
    frame #11: 0x00007fff2524b2a7 CoreData`-[NSSQLiteConnection performAndWait:] + 134
    frame #12: 0x00007fff252e27e0 CoreData`-[NSSQLDefaultConnectionManager handleStoreRequest:] + 273
    frame #13: 0x00007fff252e9214 CoreData`-[NSSQLCoreDispatchManager routeStoreRequest:] + 283
    frame #14: 0x00007fff2521a994 CoreData`-[NSSQLCore dispatchRequest:withRetries:] + 161
    frame #15: 0x00007fff25215f2e CoreData`-[NSSQLCore processFetchRequest:inContext:] + 88
    frame #16: 0x00007fff250eaf31 CoreData`-[NSSQLCore executeRequest:withContext:error:] + 1072
    frame #17: 0x00007fff251f50a2 CoreData`__65-[NSPersistentStoreCoordinator executeRequest:withContext:error:]_block_invoke.797 + 3219
    frame #18: 0x00007fff251ed772 CoreData`-[NSPersistentStoreCoordinator _routeHeavyweightBlock:] + 222
    frame #19: 0x00007fff250ea40e CoreData`-[NSPersistentStoreCoordinator executeRequest:withContext:error:] + 1684
    frame #20: 0x00007fff250e89c2 CoreData`-[NSManagedObjectContext executeFetchRequest:error:] + 885
    frame #21: 0x00007fff539b2903 libswiftCoreData.dylib`(extension in CoreData):__C.NSManagedObjectContext.fetch<A where A: __C.NSFetchRequestResult>(__C.NSFetchRequest<A>) throws -> Swift.Array<A> + 51
    frame #22: 0x0000000106bbd7c8 TouchpointLibrary`static TPLibrary.fetchLibrary(moc=0x00006000007dc750, self=TouchpointLibrary.TPLibrary) at TPLibrary+CoreDataClass.swift:26:29

Mes questions :

  1. Dans quelles circonstances Core Data reviendrait-il au décodeur non sécurisé alors que tous les attributs transformables de cette entité ont spécifiquement défini le nom du transformateur ?
  2. Comment puis-je déboguer ce problème ?

Note : J'ai également vérifié toutes les autres entités de ce modèle pour m'assurer que leurs attributs transformables ont spécifiquement défini un transformateur sécurisé, juste au cas où cela serait dû à une relation défectueuse.

2voto

Rudedog Points 1017

Conformément à la suggestion faite dans les commentaires, j'ai mis propertiesToFetch pour isoler le problème. J'ai utilisé la technique que j'ai décrite dans ce commentaire https://stackoverflow.com/a/58528937/212649 qui a bien fonctionné pour moi jusqu'à présent. Cependant, lorsque l'objet à transformer est déclaré dans un module différent, le nom du transformateur généré automatiquement inclut le nom du module, ce qui ne correspond pas au nom que j'utilisais dans le modèle de données central.

Malheureusement, iOS ne donne aucun avertissement sur le fait qu'il ne trouve pas de transformateur pour le nom que vous spécifiez, mais se contente de revenir silencieusement à un décodage non sécurisé. S'il l'avait signalé, j'aurais passé beaucoup moins de temps à identifier le problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X