簡體   English   中英

如何確定哪個 Core Data 可轉換屬性未使用安全編碼

[英]How to determine which Core Data transformable attribute is not using secure coding

我有一個帶有一些可轉換屬性的核心數據模型。 當我嘗試從商店中獲取實體時,我收到一條警告

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

我理解這意味着什么 - 我們應該使用一個使用NSSecureCoding來編碼和解碼屬性的值轉換器。 問題是,據我所知道的,使用的是安全的編碼值轉換。 我在這個實體中有四個可轉換的屬性。 其中兩個使用名為NSSecureUnarchiveFromData的轉換NSSecureUnarchiveFromData 另外兩個使用通過ValueTransformer.setValueTransformer(_:forName:)注冊的自定義轉換器。

我在+[NSKeyedUnarchiver unarchiveObjectWithData:]上設置了一個斷點,果然,當我嘗試獲取實體時,我遇到了斷點。 堆棧跟蹤是

  * 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

我的問題:

  1. 在什么情況下核心數據會回退到不安全的解碼器,即使該實體中的所有可轉換屬性都專門設置了轉換器名稱?
  2. 我該如何進一步調試?

注意:我還仔細檢查了這個模型中的所有其他實體,以確保它們的可轉換屬性已經專門設置了一個安全轉換器,以防萬一這是由於關系出錯。

根據評論中的建議,我設置了propertiesToFetch來隔離問題。 我正在使用我在此評論中描述的技術https://stackoverflow.com/a/58528937/212649 ,到目前為止對我來說效果很好。 但是,當要轉換的對象在不同的​​模塊中聲明時,自動生成的轉換器名稱包括模塊名稱,這與我在核心數據模型中使用的名稱不匹配。

不幸的是,iOS 不會給出任何關於找不到您指定名稱的轉換器的警告,而是只是默默地退回到不安全的解碼。 如果它記錄了這個,我會花更少的時間來解決這個問題。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM