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'
我认为这是因为 KeyChainWrapper
或 KeyChain
本身不支持将自定义对象保存到其中。
一直在努力寻找我们可以在KeyChain
中存储什么样的数据类型,也许它只是原语?
【问题讨论】:
【参考方案1】:我设法解决了我的问题,在对KeyChainWrapper
的.set()
选项进行了更多研究后,我找到了Data
类型的选项。
那么,我现在要做的是:
let encodedUser = jsonUtils.encode(object: user)
KeychainWrapper.standard[.userKey] = encodedUser
在我的JSONUtils
类中,我有encode
和decode
函数,所以我可以将我的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 中归档和取消归档自定义对象?或者如何在 Swift 中将自定义对象保存到 NSUserDefaults?