Swift KeyChain 存储自定义对象

Posted

技术标签:

【中文标题】Swift KeyChain 存储自定义对象【英文标题】:Swift KeyChain store custom object 【发布时间】:2021-01-05 04:18:57 【问题描述】:

我正在尝试保存这样的内容:

struct User 
    var id: String? = nil
    var name: String? = nil
    var cellPhone: String? = nil
    var email: String? = nil

进入KeyChain,根据我当前项目的指导方针,所有这些数据都是敏感的,但电子邮件除外,因此我试图将所有这些数据存储到KeyChain中。

有什么方法可以存储整个对象吗?还是我应该只信任CoreData 来存储这些对象?我需要将它们存储在设备中以验证用户是否已经注册以跳过注册过程并将它们带到应用程序的主屏幕。

我正在使用像这样的KeyChainWrapper 方法:

let saveSuccessful: Bool = KeychainWrapper.standard.set("Some String", forKey: "myKey")

但是如果我通过我的User 实例,我会得到:

No exact matches in call to instance method 'set'

我认为这是因为 KeyChainWrapperKeyChain 本身不支持将自定义对象保存到其中。

一直在努力寻找我们可以在KeyChain 中存储什么样的数据类型,也许它只是原语?

【问题讨论】:

【参考方案1】:

我设法解决了我的问题,在对KeyChainWrapper.set() 选项进行了更多研究后,我找到了Data 类型的选项。

那么,我现在要做的是:

let encodedUser = jsonUtils.encode(object: user)
KeychainWrapper.standard[.userKey] = encodedUser

在我的JSONUtils 类中,我有encodedecode 函数,所以我可以将我的User 转换为Data,反之亦然

static let shared = JSONUtilities()

func encode<T: Codable>(object: T) -> Data? 
    do 
        let encoder = JSONEncoder()
        encoder.outputFormatting = .prettyPrinted
        return try encoder.encode(object)
     catch let error 
        print(error.localizedDescription)
    
    return nil


func decode<T: Decodable>(json: Data, as clazz: T.Type) -> T? 
    do 
        let decoder = JSONDecoder()
        let data = try decoder.decode(T.self, from: json)
        
        return data
     catch 
        print("An error occurred while parsing JSON")
    
    
    return nil

这样我可以将我的 User 对象安全地存储到 KeyChain

【讨论】:

以上是关于Swift KeyChain 存储自定义对象的主要内容,如果未能解决你的问题,请参考以下文章

具有自定义类类型的 Swift CoreData 保存属性

如何在 Swift 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?

Swift中自定义对象和自定义对象数组的通用属性[重复]

如何使用 NSUserDefaults 在 Swift 中存储自定义类数组?

从数组中删除自定义对象 (Swift)

Swift:在 Core Data 中存储自定义类的数组