SwiftKeychainWrapper
一个简单的 iOS/tvOS Keychain 包装器,允许您像使用 User Defaults 一样使用它。用 Swift 编写。
提供配置好的单例实例,适用于大多数需求。使用 KeychainWrapper.standard
访问单例实例。
如果您需要自定义 Keychain 访问以使用自定义标识符或访问组,您可以创建自己的实例,而不是使用单例实例。
默认情况下,Keychain Wrapper 以 iOS Keychain 中的通用密码类型保存数据。它保存的项目只能在应用解锁且打开时访问。如果您不熟悉 iOS Keychain 的使用,这提供了一个安全默认设置来使用 Keychain。
现在,想要偏离此默认实现的用户可以在 2.0 版本及以上做到这一点。现在,每次请求保存/读取键值时,您都可以指定该键的 Keychain 可访问性。
常规用法
向 Keychain 添加字符串值
let saveSuccessful: Bool = KeychainWrapper.standard.set("Some String", forKey: "myKey")
从 Keychain 中检索字符串值
let retrievedString: String? = KeychainWrapper.standard.string(forKey: "myKey")
从 Keychain 中删除字符串值
let removeSuccessful: Bool = KeychainWrapper.standard.removeObject(forKey: "myKey")
自定义实例
当使用钥匙串包装器时,所有密钥都链接到一个标识符,称为服务名。默认情况下,它使用您的应用程序的主捆绑包标识符。但是,您也可以更改它,或者将多个项存储在钥匙串中,使用不同的标识符。
为了在您的应用程序之间共享钥匙串项,您可以指定一个访问组,并在每个应用程序中使用该相同的访问组。
要设置自定义服务名标识符或访问组,您现在可以创建自己的钥匙串包装器实例,如下所示
let uniqueServiceName = "customServiceName"
let uniqueAccessGroup = "sharedAccessGroupName"
let customKeychainWrapperInstance = KeychainWrapper(serviceName: uniqueServiceName, accessGroup: uniqueAccessGroup)
然后,可以替换共享实例或静态访问器使用自定义实例
let saveSuccessful: Bool = customKeychainWrapperInstance.set("Some String", forKey: "myKey")
let retrievedString: String? = customKeychainWrapperInstance.string(forKey: "myKey")
let removeSuccessful: Bool = customKeychainWrapperInstance.removeObject(forKey: "myKey")
下标使用
钥匙串也可以像字典那样使用下标进行访问。密钥可以预先定义并列表放在一个地方以便于使用。
首先,让我们定义稍后要使用的密钥。
extension KeychainWrapper.Key {
static let myKey: KeychainWrapper.Key = "myKey"
}
现在我们可以这样使用这个密钥
KeychainWrapper.standard[.myKey] = "some string"
let myValue: String? = KeychainWrapper.standard[.myKey]
KeychainWrapper.standard.remove(forKey: .myKey)
可访问性选项
默认情况下,所有保存到钥匙串的项只能在设备解锁时访问。要更改此可访问性,可以在所有请求上设置可选的 withAccessibility
参数。枚举 KeychainItemAccessibilty
提供了一个选择所需可访问级别的简单方法
KeychainWrapper.standard.set("Some String", forKey: "myKey", withAccessibility: .AfterFirstUnlock)
同步选项
默认情况下,所有保存到钥匙串的项都不支持同步,因此它们不会与 iCloud 进行同步。要更改此设置,可以在所有请求上设置 isSynchronizable
布尔参数。如果您希望在所有设备上获取该项,则需要将其与 iCloud 进行同步
KeychainWrapper.standard.set("Some String", forKey: "myKey", isSynchronizable: true)
重要:如果您之前已使用不同的可访问选项设置密钥的值,则无法修改该密钥的值。删除密钥的值并使用新的可访问选项设置它。(否则值将不会改变)。
例如
KeychainWrapper.standard.set("String one", forKey: "myKey", withAccessibility: .AfterFirstUnlock)
KeychainWrapper.standard.removeObject(forKey: "myKey")
KeychainWrapper.standard.set("String two", forKey: "myKey", withAccessibility: .Always)
安装
CocoaPods
您可以使用 CocoaPods 通过将其添加到您的 Podfile
中来安装 SwiftKeychainWrapper。
use_frameworks!
platform :ios, '8.0'
target 'target_name' do
pod 'SwiftKeychainWrapper'
end
要使用 Keychain Wrapper 在您的应用程序中,将 SwiftKeychainWrapper 导入到您要使用的文件中。
import SwiftKeychainWrapper
Carthage
使用 Carthage 通过将其添加到您的 Cartfile
中来安装 SwiftKeychainWrapper。
Swift 3.0
github "jrendel/SwiftKeychainWrapper" ~> 3.0
Swift 2.3
github "jrendel/SwiftKeychainWrapper" == 2.1.1
Swift 包管理器
您可以使用 Swift 包管理器 使用 Xcode 安装 SwiftKeychainWrapper。
-
在 Xcode 中打开您的项目
-
点击 "File" -> "Swift Packages" -> "Add Package Dependency..."
-
点击 "Next" -> "Next" -> "Finish"
手动安装
下载并将 KeychainWrapper.swift
和 KeychainItemAccessibility.swift
拖入您的项目中。
发布历史
-
4.1 在使用包装时,为不提供 CGFloat 的环境增加了条件逻辑
-
4.0 更新支持 SPM 和其他社区 PR。最低 iOS 版本现在为 9.0。
-
3.4
-
修改了 Swift 的 CocoaPods 定义方式
-
3.3
-
对 Swift 5.0 和 Xcode 10.2 的更新
-
3.2
-
对 Swift 4.2 和 Xcode 10 的更新
-
3.1
- 对 Swift 3.1 的更新
-
3.0.1
- 增加了主机应用以处理 iOS 10 模拟器中 keychain 访问问题
- 对 readme 指令进行的小幅度更新
-
3.0
- Swift 3.0 更新。包含重大 API 变更。2.2.0 和 2.2.1 现已合并到 3.0
-
2.2.1 (从 Cocoapods 中移除)
- 语法更新,以便更接近 Swift 3 的风格
-
2.2 (从 Cocoapods 中移除)
- 升级以支持 Swift 3.0
- 移除弃用的函数(静态访问)
-
2.1
- 升级以支持 Swift 2.3
-
2.0
- 进一步修改 API,使其更接近
NSUserDefaults
的工作方式。现在通过单例实例访问默认实现。包含包装此共享实例的静态访问器,以保持向后兼容。这些将在下一个更新中移除 - 更改共享实例的 keychain 服务名称标识符和访问组的能力已被弃用。如果用户想自定义这些,现在可以创建自己的 keychain 实例。
- 提供更多选项来修改每个保存到的键值对的 keychain 可访问性。
- 进一步修改 API,使其更接近
-
1.0.11
- 更新以支持 Swift 2.0
-
1.0.10
- 更新许可信息。合并了支持 Carthage 的拉取请求。
-
1.0.8
- 更新以支持 Swift 1.2
-
1.0.7
- 确定,一旦为访问组正确配置,在模拟器上使用带有访问组的 KeychainWrapper 正常工作。因此,我移除了之前添加的与模拟器相关的检查和单元测试。
-
1.0.6
-
支持访问组
-
SwiftKeychainWrapperExample 已更新以展示使用访问组的使用方法:https://github.com/jrendel/SwiftKeychainWrapperExample
-
访问组在模拟器上不可用。为模拟器构建的应用没有签名,因此模拟器没有用于检查的 keychain 访问组。这意味着当在模拟器上运行时,所有应用都可以看到所有 keychain 项目。尝试设置访问组将在尝试添加或更新 keychain 项时失败。因此,Keychain Wrapper 检测到它正在模拟器上使用,并且如果设置了访问组,将不会设置访问组属性。这允许 Keychain Wrapper 在开发你的应用时仍然可以在模拟器上使用。为了正确测试 Keychain 访问组,你需要在设备上测试。
-
-
1.0.5
-
此版本将项目转换为正确的 Swift 框架,并添加 podspec 文件以兼容最新的 CocoaPods 预发布版,该版本现在支持 Swift。
-
要查看使用 CocoaPods 的示例,我已创建了仓库 SwiftKeychainWrapperExample:https://github.com/jrendel/SwiftKeychainWrapperExample
-
-
1.0.2
- 更新以支持 Xcode 6.1
在过去几年中,我在自己的项目中使用了一个基于 Objective-C 的包装器。我为我自己编写的原始库基于以下教程
http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1
这是该代码在 Swift 中的重写。