IOS开发使用KeychainItemWrapper 持久存储用户名和密码

yizhihongxing

IOS开发使用KeychainItemWrapper 持久存储用户名和密码

在 IOS 应用中,要求用户输入账户和密码以进行身份验证是很普遍的需求。但是,为了确保用户输入的凭证不会丢失或者被黑客攻击,我们需要在应用程序中使用安全的方式来存储这些凭证。KeychainItemWrapper 可以帮忙实现安全地存储这些凭证,下面详细介绍一下。

步骤

  1. 下载 KeychainItemWrapper 库并添加到您的项目中。可以在这里找到 KeychainItemWrapper 库 : https://github.com/ldandersen/KeychainItemWrapper。

  2. 打开您的项目并导入 KeychainItemWrapper 库所需的文件。对于 Objective-C 项目,需要导入 KeychainItemWrapper.h 和 KeychainItemWrapper.m 文件。对于 Swift 项目,需要导入 KeychainItemWrapper.h 和 KeychainItemWrapperWrapper.swift 文件。确保将它们添加到您的项目中。

  3. 创建一个 KeychainItemWrapper 的实例对象。

let keychainItem = KeychainItemWrapper(identifier: "UserLoginID",
                                       accessGroup: nil)
  • identifier:此字符串是唯一标识符的名称,在这个例子中,我们使用字符串“UserLoginID”作为唯一标识符。

  • accessGroup:此参数可选,用于将共享访问与其他 KeychainItemWrapper 对象关联。它通常用于在组织中使用当个应用程序时共享密码。

  • 使用以下方法将用户的登录凭证保存到 iOS 的 Keychain 中:

keychainItem.setObject(username, forKey: kSecAttrLogin as NSString)
keychainItem.setObject(password, forKey: kSecValueData as NSString)
  • kSecAttrLogin:用户名的键。

  • kSecValueData:保存密码的键。

  • username:字符串类型,用户名。

  • password:字符串类型,密码。

  • 完成上述步骤后,您可以使用以下方法从 Keychain 获取数据:

let savedUserName = keychainItem.object(forKey: kSecAttrLogin as NSString) as? String
let savedPassword = keychainItem.object(forKey: kSecValueData as NSString) as? String
  1. 使用以下方法从 Keychain 中删除数据:
keychainItem.resetKeychain()

示例

示例1 - 登录示例

以下是一个登录示例代码。在此示例中,我们将向用户请求用户名和密码,并在 Keychain 中保存这些凭据。当用户再次打开该应用程序时,登录页将不再显示,而是直接显示受保护的应用程序主页。

class ViewController: UIViewController {

    @IBOutlet weak var userNameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var saveLoginSwitch: UISwitch!

    let keychainItem = KeychainItemWrapper(identifier: "UserLoginID", accessGroup: nil)

    override func viewDidLoad() {
        super.viewDidLoad()

        let hasLogin = keychainItem.object(forKey: kSecAttrLogin as NSString) != nil &&
            keychainItem.object(forKey: kSecValueData as NSString) != nil
        if hasLogin {
            // 隐藏登录视图控制器
            performSegue(withIdentifier: "showProtectedPage", sender: self)
        }
    }

    @IBAction func loginButtonTapped(_ sender: Any) {
        guard let userName = userNameTextField.text, !userName.isEmpty,
              let password = passwordTextField.text, !password.isEmpty else {
            return
        }

        if saveLoginSwitch.isOn {
            keychainItem.setObject(userName, forKey: kSecAttrLogin as NSString)
            keychainItem.setObject(password, forKey: kSecValueData as NSString)
        } else {
            keychainItem.resetKeychain()
        }

        // 隐藏登录视图控制器
        performSegue(withIdentifier: "showProtectedPage", sender: self)
    }
}

示例2 - 保存多个用户示例

以下是一个保存多个用户登录凭证的示例代码。

class ViewController: UIViewController {

    @IBOutlet weak var userNameTextField: UITextField!
    @IBOutlet weak var passwordTextField: UITextField!
    @IBOutlet weak var saveLoginSwitch: UISwitch!

    override func viewDidLoad() {
        super.viewDidLoad()

        let keychainItem1 = KeychainItemWrapper(identifier: "UserLoginID1", accessGroup: nil)
        let keychainItem2 = KeychainItemWrapper(identifier: "UserLoginID2", accessGroup: nil)

        let userName1 = keychainItem1.object(forKey: kSecAttrLogin as NSString) as? String
        let password1 = keychainItem1.object(forKey: kSecValueData as NSString) as? String

        let userName2 = keychainItem2.object(forKey: kSecAttrLogin as NSString) as? String
        let password2 = keychainItem2.object(forKey: kSecValueData as NSString) as? String

        print("User 1:\n username: \(userName1 ?? "")\n password: \(password1 ?? "")\n")
        print("User 2:\n username: \(userName2 ?? "")\n password: \(password2 ?? "")\n")
    }

    @IBAction func saveButtonTapped(_ sender: Any) {
        guard let userName = userNameTextField.text, !userName.isEmpty,
              let password = passwordTextField.text, !password.isEmpty else {
            return
        }

        let keychainItem = getKeychainItem()
        if saveLoginSwitch.isOn {
            keychainItem.setObject(userName, forKey: kSecAttrLogin as NSString)
            keychainItem.setObject(password, forKey: kSecValueData as NSString)
        } else {
            keychainItem.resetKeychain()
        }
    }

    private func getKeychainItem() -> KeychainItemWrapper {
        return KeychainItemWrapper(identifier: "UserLoginID1", accessGroup: nil)
    }
}

在此示例中,我们创建了两个 KeychainItemWrapper 实例,用于存储两个用户的登录凭证。getKeychainItem() 方法通过标识符返回一个 KeychainItemWrapper 实例。

以上是使用 KeychainItemWrapper 持久存储用户名和密码的完整攻略。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:IOS开发使用KeychainItemWrapper 持久存储用户名和密码 - Python技术站

(0)
上一篇 2023年6月27日
下一篇 2023年6月27日

相关文章

  • 织梦后台文章列表中显示自定义字段的方法

    下面我将为您详细讲解如何在织梦后台文章列表中显示自定义字段的方法。 1. 在模板中对自定义字段进行定义 首先,在模板中对自定义字段进行定义。在模板中找到“{dede:field name=’字段名’/}”,并将其改为“{dede:field name=’字段名’/}{dede:field name=’自定义字段名’/}”。这样在前台发布文章时就可以看到多一个…

    other 2023年6月25日
    00
  • Win9技术预览版下载地址页面曝光:32位版本积将超过3GB

    很抱歉,但我必须告诉您,关于\”Win9技术预览版下载地址页面曝光:32位版本积将超过3GB\”的攻略,我无法提供详细的信息。这是因为\”Win9技术预览版\”并不是一个真实存在的产品,而且在2023年的7月28日,我所了解的最新操作系统是Windows 11。 如果您有关于Windows 11的问题,我将非常乐意帮助您。请告诉我您需要了解的内容,我将尽力为…

    other 2023年7月28日
    00
  • Java多线程揭秘之synchronized工作原理

    Java多线程揭秘之synchronized工作原理 Java多线程编程中,synchronized关键字是最基础和最常用的并发控制手段之一,也是Java内置的重量级锁实现。本文将详细讲解synchronized关键字的工作原理,以及如何正确使用synchronized。 synchronized基本概念 synchronized是Java中的一个关键字,它…

    other 2023年6月27日
    00
  • Page.ClientScript.RegisterStartupScript

    Page.ClientScript.RegisterStartupScript 网站的前端技术不断更新,开发者需要通过Page.ClientScript.RegisterStartupScript方法将前端脚本嵌入到网页中,以实现更多的交互和动态变化。本文将介绍这个方法的基本用法和常见问题的解决方案。 基本用法 Page.ClientScript.Regis…

    其他 2023年3月28日
    00
  • 华为手机怎么重启?华为手机强制重启教程

    华为手机重启分为正常重启和强制重启两种方式。 正常重启华为手机 想要正常重启华为手机,可以按照以下步骤进行操作: 长按手机的电源按钮,触发手机“关机”界面。 在关机界面中,点击“关机”选项,等待手机自动关闭。 再次长按手机电源按钮,等待华为手机开机。 这种方式是比较安全、合理、标准的一种重启方法。它适用于你的手机操作无异常,但是需要重启或关机时的情形。 强制…

    other 2023年6月26日
    00
  • 解析Nginx中的日志模块及日志基本的初始化和过滤配置

    解析Nginx中的日志模块及日志基本的初始化和过滤配置是Nginx的重要组成部分之一。下面是该攻略的详细步骤: 步骤一:开启Nginx日志模块 在Nginx配置文件中,首先需要开启日志模块。一般来说,需要在http代码块中设置log_format配置项。具体代码如下: http { … log_format main ‘$remote_addr – $r…

    other 2023年6月20日
    00
  • 低门槛开发iOS、Android、小程序应用的前端框架详解

    低门槛开发iOS、Android、小程序应用的前端框架详解 开发移动应用是当代互联网技术的重要组成部分,但对于前端开发者来说,开发iOS、Android、小程序等移动应用可能需要掌握不同的语言和框架。为了降低移动应用开发的门槛,现在有很多前端框架可以帮助我们进行相关开发工作。下文将详细介绍两种低门槛开发移动应用的前端框架和相应操作步骤。 1. uni-app…

    other 2023年6月27日
    00
  • 为textView添加语音输入功能的实例代码(集成讯飞语音识别)

    下面是详细讲解“为textView添加语音输入功能的实例代码(集成讯飞语音识别)”的完整攻略。 步骤一:添加讯飞语音识别SDK 首先,你需要先下载并添加讯飞语音识别SDK到你的工程中。你可以进入讯飞官网,注册一个账号,然后下载需要的SDK。添加SDK的方式有两种: 1.使用CocoaPods 在你的工程目录下添加Podfile文件,内容如下: platfor…

    other 2023年6月26日
    00
合作推广
合作推广
分享本页
返回顶部