什么是 Keychain?

iOS 的 keychain 服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个ios程序都有一个独立的keychain存储。
用于储存一些私密信息,比如密码、证书等等,Keychain里保存的信息不会因App被删除而丢失,在用户重新安装App后依然有效。
同样也适用于应用之间数据共享。我们可以把KeyChain理解为一个Dictionary,所有数据都以key-value的形式存储,可以对这个Dictionary进行add、update、get、delete这四个操作。

keychain 的四个方法介绍?

存储方法

OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef * __nullable CF_RETURNS_RETAINED result)
复制代码

attributes: 要添加的数据
result: 存储数据后,返回一个指向该数据的引用,不使用该数据传入 nil

条件查询方法

OSStatus SecItemCopyMatching(CFDictionaryRef query, CFTypeRef * __nullable CF_RETURNS_RETAINED result)
复制代码

query: 要查询数据的条件
result: 查询到数据的引用

数据更新方法

OSStatus SecItemUpdate(CFDictionaryRef query, CFDictionaryRef attributesToUpdate)
复制代码

query: 要更新数据的查询条件
attributesToUpdate: 要更新的数据

删除数据方法

OSStatus SecItemDelete(CFDictionaryRef query)
复制代码

query: 要删除数据的查询条件

使用 Keychain

使用 Keychain 首先需要导入安全框架 secutity.framework

创建查询条件

class func createQuaryMutableDictionary(identifier: String)->NSMutableDictionary{// 创建一个条件字典let keychainQuaryMutableDictionary = NSMutableDictionary.init(capacity: 0)// 设置条件存储的类型keychainQuaryMutableDictionary.setValue(kSecClassGenericPassword, forKey: kSecClass as String)// 设置存储数据的标记keychainQuaryMutableDictionary.setValue(identifier, forKey: kSecAttrService as String)keychainQuaryMutableDictionary.setValue(identifier, forKey: kSecAttrAccount as String)// 设置数据访问属性keychainQuaryMutableDictionary.setValue(kSecAttrAccessibleAfterFirstUnlock, forKey: kSecAttrAccessible as String)// 返回创建条件字典return keychainQuaryMutableDictionary
}
复制代码

存储数据

class func keyChainSaveData(data: Any ,withIdentifier identifier:String)-> Bool {// 获取存储数据的条件let keyChainSaveMutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)// 删除旧的存储数据SecItemDelete(keyChainSaveMutableDictionary)// 设置数据keyChainSaveMutableDictionary.setValue(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as String)// 进行存储数据let saveState = SecItemAdd(keyChainSaveMutableDictionary, nil)if saveState == noErr  {return true}return false
}
复制代码

更新数据

class func keyChainUpdata(data: Any ,withIdentifier identifier:String)->Bool {// 获取更新的条件let keyChainUpdataMutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)// 创建数据存储字典let updataMutableDictionary = NSMutableDictionary.init(capacity: 0)// 设置数据updataMutableDictionary.setValue(NSKeyedArchiver.archivedData(withRootObject: data), forKey: kSecValueData as String)// 更新数据let updataStatus = SecItemUpdate(keyChainUpdataMutableDictionary, updataMutableDictionary)if updataStatus == noErr {return true}return false
}
复制代码

查询数据

class func keyChainReadData(identifier: String)-> Any {var idObject:Any?// 获取查询条件let keyChainReadmutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)// 提供查询数据的两个必要参数keyChainReadmutableDictionary.setValue(kCFBooleanTrue, forKey: kSecReturnData as String)keyChainReadmutableDictionary.setValue(kSecMatchLimitOne, forKey: kSecMatchLimit as String)// 创建获取数据的引用var queryResult: AnyObject?// 通过查询是否存储在数据let readStatus = withUnsafeMutablePointer(to: &queryResult) { SecItemCopyMatching(keyChainReadmutableDictionary, UnsafeMutablePointer($0))}if readStatus == errSecSuccess {if let data = queryResult as! NSData? {idObject = NSKeyedUnarchiver.unarchiveObject(with: data as Data) as Any}}return idObject as Any
}
复制代码

删除数据

class func keyChianDelete(identifier: String)->Void{// 获取删除的条件let keyChainDeleteMutableDictionary = self.createQuaryMutableDictionary(identifier: identifier)// 删除数据SecItemDelete(keyChainDeleteMutableDictionary)
}
复制代码

简单应用

获取 UUID

直接获取 UUID 每次卸载重新安装 app 后可能会导致 UUID 变化,为了获取唯一的 UUID,我们使用 keyChian 对 UUID 进行保存

class func getUUID() -> String {if let uuid = QWUUIDTools.keyChainReadData(identifier: "key") as? String {return uuid}else {if let uuid = UIDevice.current.identifierForVendor?.uuidString {if QWUUIDTools.keyChainSaveData(data: uuid, withIdentifier: "key") {return uuid}}}return "simulator"
}
复制代码

Keychain的介绍和使用相关推荐

  1. 关于Keychain

    1.Keychain 浅析 2.iOS的密码管理系统 Keychain的介绍和使用 3.iOS开发中,唯一标识的解决方案之keyChain+UUID 转载于:https://www.cnblogs.c ...

  2. iOS开发证书和Profile文件 介绍以及使用

    IOS开发环境,证书和授权文件是什么? 一.成员介绍 1.Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1)Developer Certificat ...

  3. ios app提交之前需要哪几个证书

    一款App在别人的机器上开发和发布,现在迭代更新和开发需要在一台新mac机上开发和发布.(使用同一个开发者账号)问题:1.在新mac机器上开发并导入真机测试,是不是需要从别人的机器上面导处开发者证书. ...

  4. IOS 开发环境,证书和授权文件等详解

    (转自:http://blog.csdn.net/gtncwy/article/details/8617788) 一.成员介绍 1.    Certification(证书) 证书是对电脑开发资格的认 ...

  5. APP发布的三个证书作用

    . Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1) Developer Certification(开发证书) 安装在电脑上提供权限:开发人员通 ...

  6. HBuilder发行App(Android和ios)

    怎样将开发好的app测试和上架,此文包括Android和ios打包.测试和上架的大概过程.内容有些简陋,因为此过程踏坑无数,特此留念. 特此声明:内容不全仅供参考. 介绍两个参考网站: 1. http ...

  7. IOS开发之证书共享(团队协同开发)

    转载于:http://blog.sina.com.cn/s/blog_4c925dca0102uynq.html 前几天有网友问我,如果想在ios开发团队中如何多名ios开发人员共享"个人开 ...

  8. 证书相关,包括APP ID 分发证书 描述文件

    1. 首先保证你的电脑上已经生成正常的开发者证书,已经可以正常用iPhone,iPad,iTouch进行真机调试. 我的证书-->iPhone Developer: YITANG HE (开发者 ...

  9. keychain介绍

    1. keychain概述 1.1 keychain是什么 苹果官网对钥匙串的描述 iOS keychain 是一个相对独立的空间,是用SQLite进行存储的,可以加密我们保存的数据,并且使用keyc ...

最新文章

  1. [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal
  2. css y轴溢出滚动条,x轴溢出显示
  3. panda.read_csv的常用参数说明
  4. 在SLES-11-SP1-i586上搭建apache+php环境
  5. Java设计模式(学习整理)---策略模式
  6. IntelliJ IDEA下使用JSTL标签库方法
  7. java如何保证redis设置过期时间的原子性_【07期】Redis中是如何实现分布式锁的?...
  8. java string to bit_Java Convert String to Binary
  9. 惠普电脑u盘重装系统步骤_HP惠普电脑怎么用U盘装系统
  10. Cron表达式 生成器
  11. nominal,ordinal,interval,ratio variable的区别为:意思不同、用法不同。
  12. 计算机职业的霍兰德代码,霍兰德职业兴趣测验与职业代码.pdf
  13. Lua 实现Get Set属性
  14. 智能云门禁解决方案来了
  15. Jquery 对 身份证号码的验证 (15/18位)
  16. 用互联网思想武装自己---雷军
  17. 【雷达成像】雷达SAR成像仿真的应用(Matlab代码实现)
  18. 爱码哥移动开发平台|让制作app更加便捷
  19. 储能系统下垂控制,输出电流按虚拟电阻比例分配,并补偿有下垂系数带来的母线压降
  20. 惠普HP LaserJet Enterprise 600 M602dn 驱动

热门文章

  1. CAS的三个问题及解决方案
  2. 决策树的python实现
  3. 20190520算法题存档
  4. elasticjob 分片策略
  5. RabbitMQ 镜像模式 集群架构 工作最常用集群
  6. Java消息中间件--ActiveMq,RabbitMQ,Kafka
  7. mysql索引需要了解的几个注意
  8. Netty 基本介绍与核心组件(EventLoop、ChannelPipeline、ChannelHandler)
  9. 面试题:为什么局部变量不赋初始值报错
  10. SpringBoot解决跨域的5种方式