钥匙串 0.3.1

钥匙串 0.3.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布上次发布2016年9月
SPM支持 SPM

Ardalan Samimi维护。



钥匙串 0.3.1

Keychain

Keychain是一个易于使用的系统钥匙串封装类,它提供了一个简单的接口来存储用户凭据,同时提供更多高级功能。

功能

  • 快速方法保存到、从密钥串加载和删除。
  • 基本的保存、加载和删除方法,允许进行高级查询/属性字典。
  • 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 (Beta)

钥匙串 包含了一个名为 KeychainItem 的类,该类隐藏了您在使用 Keychain 服务时可能需要处理的许多丑陋之处。

与定义属性和搜索字典相比,KeychainItem 提供了一种更直观的对象化方法来使用 Keychain 服务。

(注意:KeychainItem 类仍在开发中,并且最适合/仅与 kSecClassGenericPassword 和 kSecClassInternetPassword 类的项一起使用。)

保存示例(KeychainItem)
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)
}
加载示例(KeychainItem)

以下代码演示了如何从今天起将键值项作为 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] )
更新示例(KeychainItem)

使用 update(_:) 方法来更新钥匙串项。

kItem.value = "A new value"

if kItem.update() {
  // Success
} else {
  print(kItem.OSStatusCode)
}

要求

  • iOS 8

安装

Keychain 可通过 CocoaPods 获取。要安装它,只需将以下行添加到您的 Podfile 即可

pod "Keychain"

作者

Ardalan Samimi,[email protected]

许可证

Keychain 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。