Swift KeyChain 存储自定义对象

Swift KeyChain store custom object

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

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,也许它只是基元?

我设法解决了我的问题,在仔细研究了 KeyChainWrapper.set() 选项后,我找到了一个 Data 类型的选项。

所以,我现在正在做的是:

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

在我的 JSONUtils class 中我有 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