SwiftKeychainWrapper 4.0.1

SwiftKeychainWrapper 4.0.1

测试已测试
语言语言 SwiftSwift
许可证 MIT
发布最后发布2020年9月
SPM支持SPM

Jason Rendel 维护。



  • 作者
  • Jason Rendel

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。

  1. 在 Xcode 中打开您的项目

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

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

  4. 点击 "Next" -> "Next" -> "Finish"

手动安装

下载并将 KeychainWrapper.swiftKeychainItemAccessibility.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 可访问性。
  • 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 中的重写。

Carthage compatible