iOS的keychain服务提供了一种安全的保存私密信息(密码,序列号,证书等)的方式,每个iOS程序都有一个独立的keychain存储。相对于NSUserDefaults、文件保存等一般方式,keychain保存更为安全,而且keychain里保存的信息不会因App被删除而丢失,所以在重装App后,keychain里的数据还能使用。
在应用里使用使用keyChain,我们需要导入Security.framework

要先声明公共区的名称,官方文档管这个名称叫“keychain access group”,声明的方法是新建一个plist文件,名字随便起,内容如下:

“yourAppID.com.yourCompany.whatever”就是你要起的公共区名称

获取UUID 并保存到keychain中:

#pragma mark--获取设备UUID
-(NSString*) uuid {if ([CHKeychain load:UUIDKEY]) {NSString *result = [CHKeychain load:UUIDKEY];return result;}else{CFUUIDRef puuid = CFUUIDCreate( nil );CFStringRef uuidString = CFUUIDCreateString( nil, puuid );NSString * result = (NSString *)CFStringCreateCopy( NULL, uuidString);CFRelease(puuid);CFRelease(uuidString);[CHKeychain save:UUIDKEY data:result];return [result autorelease];}return nil;
}

 

CHKeychain 的实现代码(需要导入Security.framework):

CHKeychain.h

#import <Foundation/Foundation.h>@interface CHKeychain : NSObject+ (void)save:(NSString *)service data:(id)data;
+ (id)load:(NSString *)service;
+ (void)deleteData:(NSString *)service;@end

CHKeychain.m  

#import "CHKeychain.h"@implementation CHKeychain
+ (NSMutableDictionary *)getKeychainQuery:(NSString *)service {return [NSMutableDictionary dictionaryWithObjectsAndKeys:(id)kSecClassGenericPassword,(id)kSecClass,service, (id)kSecAttrService,service, (id)kSecAttrAccount,(id)kSecAttrAccessibleAfterFirstUnlock,(id)kSecAttrAccessible,nil];
}+ (void)save:(NSString *)service data:(id)data {//Get search dictionaryNSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Delete old item before add new itemSecItemDelete((CFDictionaryRef)keychainQuery);//Add new object to search dictionary(Attention:the data format)[keychainQuery setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(id)kSecValueData];//Add item to keychain with the search dictionarySecItemAdd((CFDictionaryRef)keychainQuery, NULL);
}+ (id)load:(NSString *)service {id ret = nil;NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];//Configure the search setting//Since in our simple case we are expecting only a single attribute to be returned (the password) we can set the attribute kSecReturnData to kCFBooleanTrue[keychainQuery setObject:(id)kCFBooleanTrue forKey:(id)kSecReturnData];[keychainQuery setObject:(id)kSecMatchLimitOne forKey:(id)kSecMatchLimit];CFDataRef keyData = NULL;if (SecItemCopyMatching((CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) {@try {ret = [NSKeyedUnarchiver unarchiveObjectWithData:(NSData *)keyData];} @catch (NSException *e) {NSLog(@"Unarchive of %@ failed: %@", service, e);} @finally {}}if (keyData)CFRelease(keyData);return ret;
}+ (void)delete:(NSString *)service {NSMutableDictionary *keychainQuery = [self getKeychainQuery:service];SecItemDelete((CFDictionaryRef)keychainQuery);
}@end

  

参考:http://blog.csdn.net/u011439689/article/details/18707387

转载于:https://www.cnblogs.com/samniu/p/3673781.html

iOS UUID配合keychain的替换方案实现相关推荐

  1. iOS编程——经过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版)

    iOS编程--通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC版) 很多的应用都需要用到手机的唯一标示,而且要求这个唯一标示不能因为应用app的卸载或者改变而变化. 在iO ...

  2. iOS应用架构谈-本地持久化方案及动态部署

    iOS应用架构谈-开篇 iOS应用架构谈-view层的组织和调用方案 iOS应用架构谈-网络层设计方案 iOS应用架构谈-本地持久化方案及动态部署 iOS应用架构谈-组件化方案 前言 嗯,你们要的大招 ...

  3. iOS 最优无痕埋点方案

    iOS 最优无痕埋点方案 在移动互联网时代,对于每个公司.企业来说,用户的行为数据非常重要.重要到什么程度,用户在这个页面停留多久.点击了什么按钮.浏览了什么内容.什么手机.什么网络环境.App什么版 ...

  4. IOS设备唯一标示符的方案比较

    现有IOS设备唯一标示符的方案比较 UDID [[UIDevice currentDevice] uniqueIdentfier] iOS官方最早提供的UDID方案,根据某一公式,使用设备序列号.网卡 ...

  5. 微信小程序 没有blob 对象的替换方案

    files: ( binary) 是Blob传参标志. blob LOB(Large Objects大对象),用来存储大量的二进制和文本数据的一种数据类型 . 注意点: 微信小程序中没有blob对象. ...

  6. iOS 组件化的三种方案

    组件化 本文主要介绍iOS组件化的三种方案 1.常⽤的三种方案 URL Scheme Target - Action Protocol - Class 匹配 1.1. URL Scheme路由 使 U ...

  7. iOS 多线程的四种技术方案

    iOS 多线程的四种技术方案 image pthread 实现多线程操作 代码实现: void * run(void *param) {for (NSInteger i = 0; i < 100 ...

  8. Ubuntu20.04下面运行applet与freemind部署到web上(调研+找到替换方案)

    环境 Ubuntu 20.04 JDK 1.8 freemind 1.0.1 -------------------------------------------------- Reference里 ...

  9. IOS – OpenGL ES 调节图像色彩替换 GPUImageFalseColorFilter

    目录 一.简介 二.效果演示 三.源码下载 四.猜你喜欢 零基础 OpenGL (ES) 学习路线推荐 : OpenGL (ES) 学习目录 >> OpenGL ES 基础 零基础 Ope ...

最新文章

  1. 漫谈“外来的和尚会念经”
  2. Markdown预览功能不可用解决方案
  3. 数据结构与算法——二叉排序树详解以及代码实现
  4. origin 修改水平坐标的刻度
  5. orcad如何设置模块化设计_这个模块化的办公桌让您设计每一个元素,以创造完美的工作设置...
  6. ClassLoader类加载器
  7. electron-vu打造低配版网易云(Mv版)
  8. getBoundingClientRect使用指南
  9. linux运维常见网络协议含义及端口
  10. python--过滤top命令--之--时间_系统CPU_进程CPU_内存
  11. Java速成(10/30)-多态
  12. 从零开始搭建java物联网平台_【攻略】从零开始搭建物联网系统
  13. 蓝桥杯第八届等差素数列
  14. Windows2008虚拟机扩容C盘
  15. Linux基础内容介绍
  16. tensorflow 2.0 Layer定义的源码分析
  17. 用Excel制作贪吃蛇
  18. java开发资源下载链接
  19. 笑对过往、活在当下、期盼未来
  20. STM32CubeIDE加CubeMX开发二——CudeMX的使用

热门文章

  1. 请求包含(Include)和请求转发(Forward)
  2. tar 压缩去除目录
  3. LeetCode--Search in Rotated Sorted Array
  4. 并发模型之——基本概念
  5. 浅谈C++的virtual 动态绑定。
  6. SQL 主键 自动编号 主键自增
  7. SQL SERVER 用sql语句将一列数据拼接成一个字符串
  8. 使用SDL打造游戏世界之入门篇 - 6
  9. PMCAFF微课堂 | 前猎豹高级产品经理:8大案例讲解猎豹如何做产品
  10. 【干货】原型设计的八大指导原则