⛔ [已弃用] 此库已不再维护更新。它是在 Swift 首次发布时创建的,旨在提供一种简单的方式来使用 Keychain。但该方法受到限制,不适用于更高级的 Keychain 用法。

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")

自定义实例

使用 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

你可以使用 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 Package Manager

你可以使用 Swift Package Manager 使用 Xcode 安装 SwiftKeychainWrapper

  1. 在 Xcode 中打开你的项目

  2. 点击“File” -> “Swift Packages” -> “Add Package Dependency...”

  3. 粘贴以下 URL:https://github.com/jrendel/SwiftKeychainWrapper

  4. 点击“Next” -> “Next” -> “Finish”

手动

下载并将 KeychainWrapper.swiftKeychainItemAcessibility.swift 拖放到你的项目中。

发布历史


在过去的几年中,我一直在自己的项目中使用基于 Objective-C 的 wrapper。 我为自己编写的原始库是基于以下教程

http://www.raywenderlich.com/6475/basic-security-in-ios-5-tutorial-part-1

这是用 Swift 重写的代码。

Carthage compatible