Keychain的介绍和使用
什么是 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的介绍和使用相关推荐
- 关于Keychain
1.Keychain 浅析 2.iOS的密码管理系统 Keychain的介绍和使用 3.iOS开发中,唯一标识的解决方案之keyChain+UUID 转载于:https://www.cnblogs.c ...
- iOS开发证书和Profile文件 介绍以及使用
IOS开发环境,证书和授权文件是什么? 一.成员介绍 1.Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1)Developer Certificat ...
- ios app提交之前需要哪几个证书
一款App在别人的机器上开发和发布,现在迭代更新和开发需要在一台新mac机上开发和发布.(使用同一个开发者账号)问题:1.在新mac机器上开发并导入真机测试,是不是需要从别人的机器上面导处开发者证书. ...
- IOS 开发环境,证书和授权文件等详解
(转自:http://blog.csdn.net/gtncwy/article/details/8617788) 一.成员介绍 1. Certification(证书) 证书是对电脑开发资格的认 ...
- APP发布的三个证书作用
. Certification(证书) 证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种: 1) Developer Certification(开发证书) 安装在电脑上提供权限:开发人员通 ...
- HBuilder发行App(Android和ios)
怎样将开发好的app测试和上架,此文包括Android和ios打包.测试和上架的大概过程.内容有些简陋,因为此过程踏坑无数,特此留念. 特此声明:内容不全仅供参考. 介绍两个参考网站: 1. http ...
- IOS开发之证书共享(团队协同开发)
转载于:http://blog.sina.com.cn/s/blog_4c925dca0102uynq.html 前几天有网友问我,如果想在ios开发团队中如何多名ios开发人员共享"个人开 ...
- 证书相关,包括APP ID 分发证书 描述文件
1. 首先保证你的电脑上已经生成正常的开发者证书,已经可以正常用iPhone,iPad,iTouch进行真机调试. 我的证书-->iPhone Developer: YITANG HE (开发者 ...
- keychain介绍
1. keychain概述 1.1 keychain是什么 苹果官网对钥匙串的描述 iOS keychain 是一个相对独立的空间,是用SQLite进行存储的,可以加密我们保存的数据,并且使用keyc ...
最新文章
- [LeetCode]*105.Construct Binary Tree from Preorder and Inorder Traversal
- css y轴溢出滚动条,x轴溢出显示
- panda.read_csv的常用参数说明
- 在SLES-11-SP1-i586上搭建apache+php环境
- Java设计模式(学习整理)---策略模式
- IntelliJ IDEA下使用JSTL标签库方法
- java如何保证redis设置过期时间的原子性_【07期】Redis中是如何实现分布式锁的?...
- java string to bit_Java Convert String to Binary
- 惠普电脑u盘重装系统步骤_HP惠普电脑怎么用U盘装系统
- Cron表达式 生成器
- nominal,ordinal,interval,ratio variable的区别为:意思不同、用法不同。
- 计算机职业的霍兰德代码,霍兰德职业兴趣测验与职业代码.pdf
- Lua 实现Get Set属性
- 智能云门禁解决方案来了
- Jquery 对 身份证号码的验证 (15/18位)
- 用互联网思想武装自己---雷军
- 【雷达成像】雷达SAR成像仿真的应用(Matlab代码实现)
- 爱码哥移动开发平台|让制作app更加便捷
- 储能系统下垂控制,输出电流按虚拟电阻比例分配,并补偿有下垂系数带来的母线压降
- 惠普HP LaserJet Enterprise 600 M602dn 驱动