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'
我认为这是因为 KeyChainWrapper
或 KeyChain
本身不支持将自定义对象保存到其中。
一直在寻找我们可以在里面存储什么样的数据类型 KeyChain
,也许它只是基元?
我设法解决了我的问题,在仔细研究了 KeyChainWrapper
的 .set()
选项后,我找到了一个 Data
类型的选项。
所以,我现在正在做的是:
let encodedUser = jsonUtils.encode(object: user)
KeychainWrapper.standard[.userKey] = encodedUser
在我的 JSONUtils
class 中我有 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
我正在尝试保存这样的内容:
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
,也许它只是基元?
我设法解决了我的问题,在仔细研究了 KeyChainWrapper
的 .set()
选项后,我找到了一个 Data
类型的选项。
所以,我现在正在做的是:
let encodedUser = jsonUtils.encode(object: user)
KeychainWrapper.standard[.userKey] = encodedUser
在我的 JSONUtils
class 中我有 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