Keychain是一个易于使用的系统钥匙串封装类,它提供了一个简单的接口来存储用户凭据,同时提供更多高级功能。
功能
KeychainItem
类,允许您将密钥串中的项以类的实例形式保存和加载,使使用系统密钥串变得更加简易。 (更多信息见下文)。有几种方法可以将项保存到密钥串。最基本的方法是调用类的函数save(_:forKey:)
。这会将指定的值保存到密钥串,以后可以通过传递给forKey
参数的值检索。
// To save some value to the keychain use:
Keychain.save("some value", forKey: "Some key")
// You can retrieve it by using the same key:
let data = Keychain.load("Some Key")
print(data)
// Prints "some value"
从密钥串中删除项遵循相同的逻辑
if Keychain.delete("Some Key") {
// Success!
}
如果您需要创建自定义属性字典(例如,如果您想自己设置服务和/或帐户属性,而不是让包装器处理),Keychain也允许更高级的操作。
(注意:高级保存/加载/删除方法需要您创建属性/搜索字典。更多信息和Keychain Service Reference。)
高级的save(_:)
函数返回一个包含两个成员的元组: (成功:布尔值,statusCode:OSStatus)。
let value = "Some value"
let attributes: [String: AnyObject] = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrAccount as String : "Some Account",
kSecAttrService as String : "Some Service",
kSecValueData as String : value.dataUsingEncoding(NSUTF8StringEncoding, allowLossyConversion: false)!
]
let result = Keychain.save(attributes)
if result.success {
// Success!
} else {
// Failure!
// Check OSStatus
print(result.statusCode)
}
高级的load(_:)
函数将返回一个包含三个成员的元组:(成功:布尔值,data:NSData?,statusCode:OSStatus)
。
let query: [String: AnyObject] = [
kSecClass as String : kSecClassGenericPassword as String,
kSecMatchLimit as String : kSecMatchLimitOne,
kSecReturnData as String : kCFBooleanTrue,
kSecAttrService as String : "Some Service",
kSecAttrAccount as String : "Some Account"
]
let result = Keychain.load(query)
if result.success {
let string = String(data: result.data as! NSData, encoding: NSUTF8StringEncoding)
print(string) // Prints "Some value"
} else {
print(result.statusCode)
}
高级的delete(_:)
函数返回一个包含两个成员的元组:(成功:布尔值,statusCode:OSStatus)。
let query: [String: AnyObject] = [
kSecClass as String : kSecClassGenericPassword as String,
kSecAttrService as String : "Some Service",
kSecAttrAccount as String : "Some Account"
]
let result = Keychain.delete(query)
if result.success {
print(result.success)
} else {
print(result.statusCode)
}
钥匙串 包含了一个名为 KeychainItem
的类,该类隐藏了您在使用 Keychain 服务时可能需要处理的许多丑陋之处。
与定义属性和搜索字典相比,KeychainItem
提供了一种更直观的对象化方法来使用 Keychain 服务。
(注意:KeychainItem 类仍在开发中,并且最适合/仅与 kSecClassGenericPassword 和 kSecClassInternetPassword 类的项一起使用。)
let kItem = KeychainItem(withItemClass: KeychainItemClass.GenericPassword)
kItem.account = "pkrll"
kItem.service = "Github.com"
kItem.label = "Github"
kItem.value = "somePassword"
kItem.synchronizable = true
if kItem.save() {
// Success!
} else {
// Failure!!
let statusCode = kItem.OSStatusCode
print(statusCode)
}
以下代码演示了如何从今天起将键值项作为 KeychanItem
的实例加载。但是,在未来的版本中,应该可以通过创建一个 KeychainItem
的实例来加载单个项,而不是创建一个搜索字典。
let query: [String: AnyObject] = [
kSecClass as String : KeychainItemClass.GenericPassword.rawValue as String,
kSecMatchLimit as String : kSecMatchLimitAll,
kSecMatchCaseInsensitive as String : kCFBooleanTrue,
kSecReturnData as String : kCFBooleanTrue,
kSecReturnAttributes as String : kCFBooleanTrue,
kSecAttrSynchronizable as String : kSecAttrSynchronizableAny
]
let items = KeychainItemFactory.load(query)
// Returns an array of KeychainItem objects ( [KeychainItem] )
使用 update(_:)
方法来更新钥匙串项。
kItem.value = "A new value"
if kItem.update() {
// Success
} else {
print(kItem.OSStatusCode)
}
Keychain 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 即可
pod "Keychain"
Ardalan Samimi,[email protected]
Keychain 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。