FDKeychain 1.3.0

FDKeychain 1.3.0

测试已测试
Lang语言 Obj-CObjective C
许可 MIT
发布最新发布2016年5月

Reid Main 维护。



概述

当我第一次开始编写 iOS 应用程序时,NSUserDefaults 看起来像是一个存储用户首选项的绝佳位置。我犯了一个新手错误(就像很多程序员做的那样),将用户名/密码或令牌也存储到 NSUserDefaults 中。当我意识到 NSUserDefaults 完全不安全时,我寻找了一个替代方案,发现自 iOS 2.0 起苹果已经内置了对密钥链的支持。然而,密钥链的 API 完全使用 C 语言编写,我希望能有一个类似 NSDictionary 的简单“对象键”接口。我想将任何对象/键对保存到密钥链中,然后使用相应的键检索相同的对象。那么我做了什么?嗯,就像任何自重的程序员一样,我编写了这个接口。

在三个项目的跨度中,我不断完善我的类,直到我们有了这里有的:FDKeychain。这是一个具有三个简单方法的静态类:保存、加载、删除。您可以将任何符合 NSCoding 协议的对象保存到密钥链中。然后可以使用该键从密钥链中加载或删除该对象。

如果您不熟悉密钥链,它是一个简单的密码管理系统,它不是应用专属的。它是集成在操作系统中的,这给它带来了两个主要优势。

  1. 您保存到密钥链中的任何内容,即使应用程序被删除也会持续存在。这对于生成一个通用唯一识别码(UUID)非常有用,您可以将它保存到密钥链中,这样即使应用程序被删除,您也可以知道用户以前使用过您的应用程序。您还可以唯一跟踪用户的多个设备,这对于现在苹果已经废弃了 [UIDevice +uniqueIdentifier] 特别重要。
  2. 任何共享相同 App Id 的应用程序都可以在密钥链中共享访问组。默认情况下,应用程序可以访问与其应用程序标识符匹配的访问组(例如 XXXXXXXXXX.com.1414degrees.keychain)。如果您为您的目标提供了一个权限文件,您可以指定您的密钥链访问组,如果两个应用程序引用相同的访问组,它们将共享项目。

安装

FDKeychain 支持三种方法。所有三种方法都假设您的 Xcode 项目正在使用模块。

1. 子项目

  1. 将“FDKeychain”项目添加到“框架项目”目录中作为子项目,或将其添加到您的工作区。
  2. 将“FDKeychain (iOS/watchOS|tvOS|Mac)”添加到您的目标的“目标依赖项”部分。
  3. 在将使用FDKeychain的任何文件中,使用"@import FDKeychain"。

3. 复制源代码文件

将FDKeychain.h和FDKeychain.m文件复制到您的项目中,并链接您的项目与Security框架。

使用方法

让我们假设您有一个名为“Trambopoline”的应用程序,您想要安全地存储一个密码。

要将密码保存到钥匙串中

NSString *password = @"My super secret password";
NSError *error = nil;

[FDKeychain saveItem: password 
    forKey: @"password" 
    forService: @"Trambopoline" 
    error: &error];

要从钥匙串中获取密码

NSError *error = nil;

NSString *password = [FDKeychain itemForKey: @"password" 
    forService: @"Trambopoline" 
    error: &error];

要从钥匙串中删除密码

NSError *error = nil;

[FDKeychain deleteItemForKey: @"password" 
    forService: @"Trambopoline" 
    error: &error];

现在让我们假设您有两个应用程序名为“Moon Unit Alpha”和“Moon Until Zappa”,并且您想要它们共享一个OAuth令牌,这样用户就不需要登录到两个应用程序。首先,您需要将授权文件添加到两个应用程序的目标中,并确保“XXXXXXXXXX.com.1414degrees.moonunit”是可能的关键字串访问组之一(用将要用以为应用程序签名签名的配置文件的应用程序ID替换XXXXXXXXXXX)。

保存

NSError *error = nil;

[FDKeychain saveItem: token 
    forKey: @"token" 
    forService: @"Moon Unit" 
    inAccessGroup: @"XXXXXXXXXX.com.1414degrees.moonunit" 
    error: &error];

加载

NSError *error = nil;

OAuthToken *token = [FDKeychain itemForKey: @"token" 
    forService: @"Moon Unit" 
    inAccessGroup: @"XXXXXXXXXX.com.1414degrees.moonunit" 
    error: &error];

删除

NSError *error = nil;

[FDKeychain deleteItemForKey: @"token" 
    forService: @"Moon Unit" 
    inAccessGroup: @"XXXXXXXXXX.com.1414degrees.moonunit" 
    error: &error];

此代码将允许您同时在两个应用程序中操作相同的关键项。

示例项目

iOS

这个iOS示例项目有三个目标。每个目标都将安装一个应用程序,显示两个UITextFields:一个用于本地密码,另一个用于共享密码。您在“本地密码”字段中输入的任何内容仅在输入该字段的应用程序中可访问,而在“共享密码”字段中输入的任何内容将在这三个应用程序之间共享。

如果您在FDRootViewController.m中更改访问组,以具有您将要用于签署应用程序的配置文件的应用程序ID,然后您可以将所有三个目标安装到您的设备上,并查看共享关键字串项的示例。

Mac

目前,这个Mac示例项目非常简单。它弹出一个包含文本字段和窗口的简单窗口,并将该文本字段中的任何信息保存到钥匙串中。