DYFSwiftKeychain
此功能用于在 Keychain 中存储文本和数据。正如您可能注意到的,Apple 的 keychain API 有点冗长。该库旨在提供简短的语法来完成任务:为指定的键读取/写入文本值
let keychain = DYFSwiftKeychain()
keychain.set("User Account Passcode", forKey: "kUserAccPasscode")
let p = keychain.get("kUserAccPasscode")
Keychain 库包括以下功能
- 获取、设置和删除字符串、布尔值和 Data Keychain 项目。
- 指定项目访问安全级。
- 通过 iCloud 同步项目。
- 与其他应用程序共享 Keychain 项目。
组 (ID:614799921)
安装
使用CocoaPods。
use_frameworks!
target 'Your target name'
pod 'DYFSwiftKeychain'
or
pod 'DYFSwiftKeychain', '~> 1.1.0'
或者手动从SwiftKeychain目录添加文件。
什么是钥匙串(Keychain)?
钥匙串是一个安全存储区域。您可以在其中保存各种敏感数据,例如用户密码、信用卡号码、密钥令牌等。一旦信息存储在钥匙串中,就只有您的应用可以访问它,其他应用无法看到。此外,操作系统确保这些信息的安全存储和处理。例如,存储在钥匙串中的文本不能从iPhone备份或文件系统中提取。Apple建议在钥匙串中保存少量数据。如果您需要保护大量数据,您可以手动对其进行加密、保存到文件,并将密钥存储在钥匙串中。
使用方法
将 import DYFSwiftKeychain
添加到您的源代码中。
字符串值
let keychain = DYFSwiftKeychain()
keychain.set("User Account Passcode", forKey: "kUserAccPasscode")
let s = keychain.get("kUserAccPasscode")
数据值
let keychain = DYFSwiftKeychain()
keychain.set(data, forKey: "kCommSecureCode")
let data = keychain.getData("kCommSecureCode")
布尔值
let keychain = DYFSwiftKeychain()
keychain.set(true, forKey: "kFirstInstalledAndLaunched")
let ret = keychain.getBool("kFirstInstalledAndLaunched")
从钥匙串中删除密钥
let keychain = DYFSwiftKeychain()
let _ = keychain.delete("kFirstInstalledAndLaunched") // Remove single key.
let _ = keychain.clear() // Delete everything from app's Keychain. Does not work on macOS.
高级选项
钥匙串项目访问
使用withAccess
参数指定钥匙串存储的安全性级别。默认使用.accessibleWhenUnlocked
选项。这是最限制性最强的选项之一,提供良好的数据保护。
let keychain = DYFSwiftKeychain()
keychain.set("xxx", forKey:"Key1", withAccess: .accessibleWhenUnlocked)
如果您需要您的应用在后台时访问钥匙串项,可以使用.accessibleAfterFirstUnlock
。请注意,这比.accessibleWhenUnlocked
选项更不安全。
查看所有可用访问选项列表。
与其他设备同步钥匙串项
将synchronizable
属性设置为true
以启用用户多个设备之间的钥匙串项同步。对于在设备上的iCloud设置中启用了“钥匙串”的用户,同步将正常工作。
将synchronizable
属性设置为true
将使用set
方法将项目添加到其他设备,并使用get
命令获取可同步的项目。删除可同步的项目将从所有设备中删除它。
请注意,为了使此功能正常工作,您不需要在应用目标中启用iCloud或钥匙串共享功能。
// The first device
let keychain = DYFSwiftKeychain()
keychain.synchronizable = true
keychain.set("See you tomorrow!", forKey: "key12")
// The second device
let keychain = DYFSwiftKeychain()
keychain.synchronizable = true
let s = keychain.get("key12") // Returns "See you tomorrow!"
我们无法在macOS上实现钥匙串同步。
与其他应用共享密钥链项目
为了能够在同一设备上的应用之间共享密钥链项目,它们需要在“能力 > 密钥链共享”设置中注册相同的密钥链组。
使用accessGroup
属性来访问共享的密钥链项目。在下面的示例中,我们指定了访问组“9ZU3R2F3D4.com.omg.myapp.KeychainGroup”,将用于设置、获取和删除项目“key1”。
let keychain = DYFSwiftKeychain()
keychain.accessGroup = "9ZU3R2F3D4.com.omg.myapp.KeychainGroup" // Use your own access group.
keychain.set("hello world", forKey: "key1")
keychain.get("key1")
keychain.delete("key1")
keychain.clear()
注意:无法在watchOS 2.0及其配对设备之间共享密钥链项目:[论坛讨论](https://forums.developer.apple.com/thread/5938)
检查操作是否成功
您可以通过检查其返回值来验证set
、delete
和clear
方法是否成功完成。这些方法在成功时返回true
,在出错时返回false
。
let keychain = DYFSwiftKeychain()
if keychain.set("xxx", forKey: "key1") {
// Keychain item is saved successfully
} else {
// Report error
}
要获取特定失败原因,请使用包含最新操作结果的代码的osStatus
属性。请参见[密钥链结果码](https://developer.apple.com/documentation/security/1542001-security_framework_result_codes)。
let keychain = DYFSwiftKeychain()
keychain.set("xxx", forKey: "key1")
if keychain.osStatus != errSecSuccess { /* Report error */ }
以引用的形式返回数据
使用asReference: true
参数以引用的形式返回数据,这对于NEVPNProtocol是必需的。
let keychain = DYFSwiftKeychain()
keychain.set(data, forKey: "key1")
keychain.getData("key1", asReference: true)
在Objective-C应用中使用DYFSwiftKeychain
DYFSwiftKeychain
支持在Objective-C应用中使用。
示例
DYFSwiftKeychain
的使用方法可以在下面的[示例](https://github.com/chenxing640/DYFStore/blob/master/DYFStore/DYFStoreKeychainPersistence.swift)中学习。
欢迎反馈
如果您发现任何问题,遇到了创建问题的困难。我将很乐意帮助您。