⛔ [已弃用] 此库已不再维护更新。它是在 Swift 首次发布时创建的,旨在提供一种简单的方式来使用 Keychain。但该方法受到限制,不适用于更高级的 Keychain 用法。
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")
使用 Keychain Wrapper 时,所有键都链接到应用程序的通用标识符,称为服务名称。 默认情况下,这使用你的主 bundle 标识符。 但是,你也可以更改它,或者在不同的标识符下将多个项目存储到 keychain。
要在你的应用程序之间共享 keychain 项目,你可以指定一个访问组并在每个应用程序中使用相同的访问组。
要设置自定义服务名称标识符或访问组,你现在可以按如下方式创建自己的 keychain wrapper 实例
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")
Keychain 也可以像字典一样使用下标访问。 键可以预先定义并列在一个地方以方便使用。
首先,让我们定义稍后要使用的键。
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)
默认情况下,保存到 keychain 的所有项目只能在设备解锁时访问。 要更改此可访问性,可以在所有请求上设置一个可选的 withAccessibility
参数。 枚举 KeychainItemAccessibilty
提供了一种简单的方法来选择所需的可访问级别
KeychainWrapper.standard.set("Some String", forKey: "myKey", withAccessibility: .AfterFirstUnlock)
默认情况下,保存到 keychain 的所有项目都不可同步,因此它们不会与 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 通过将其添加到你的 Podfile
来安装 SwiftKeychainWrapper
use_frameworks!
platform :ios, '8.0'
target 'target_name' do
pod 'SwiftKeychainWrapper'
end
要在你的应用程序中使用 keychain wrapper,请将 SwiftKeychainWrapper 导入到你要使用它的文件。
import SwiftKeychainWrapper
你可以使用 Carthage 通过将其添加到你的 Cartfile
来安装 SwiftKeychainWrapper。
Swift 3.0
github "jrendel/SwiftKeychainWrapper" ~> 3.0
Swift 2.3
github "jrendel/SwiftKeychainWrapper" == 2.1.1
你可以使用 Swift Package Manager 使用 Xcode 安装 SwiftKeychainWrapper
在 Xcode 中打开你的项目
点击“File” -> “Swift Packages” -> “Add Package Dependency...”
点击“Next” -> “Next” -> “Finish”
下载并将 KeychainWrapper.swift
和 KeychainItemAcessibility.swift
拖放到你的项目中。
4.1 添加了 CGFloat 配件的条件逻辑,以用于 CGFloat 不可用的软件包
4.0 使用 SPM 支持和其他社区 PR 进行了更新。 最低 iOS 版本现在是 9.0。
3.4
更改了为 CocoaPods 定义 Swift 版本的方式
3.3
Swift 5.0 和 Xcode 10.2 的更新
3.2
Swift 4.2 和 Xcode 10 的更新
3.1
3.0.1
3.0
2.2.1(已从 Cocoapods 中删除)
2.2(已从 Cocoapods 中删除)
2.1
2.0
NSUserDefaults
的工作方式更加一致。 现在可以通过单例实例访问默认实现。 已经包含静态访问器,用于包装此共享实例以保持向后兼容性。 这些将在下次更新中删除1.0.11
1.0.10
1.0.8
1.0.7
1.0.6
支持访问组
SwiftKeychainWrapperExample 已更新,以显示与访问组的用法:https://github.com/jrendel/SwiftKeychainWrapperExample
访问组在模拟器上不起作用。 为模拟器构建的应用程序未签名,因此模拟器没有要检查的 keychain 访问组。 这意味着在模拟器上运行时,所有应用程序都可以看到所有 keychain 项目。 尝试设置访问组将导致尝试添加或更新 keychain 项目时失败。 因此,Keychain Wrapper 会检测它是否正在模拟器上使用,如果设置了访问组属性,则不会设置。 这允许 Keychain Wrapper 仍然可以在模拟器上用于开发你的应用程序。 要正确测试 Keychain 访问组,你需要在一个设备上进行测试。
1.0.5
此版本将项目转换为适当的 Swift Framework,并添加一个 podspec 文件以与最新的 CocoaPods 预发布版本兼容,该版本现在支持 Swift。
要查看使用 CocoaPods 的示例,我创建了 repo SwiftKeychainWrapperExample:https://github.com/jrendel/SwiftKeychainWrapperExample
1.0.2
在过去的几年中,我一直在自己的项目中使用基于 Objective-C 的 wrapper。 我为自己编写的原始库是基于以下教程
http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1
这是用 Swift 重写的代码。