iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(OC优化版)
2015-08-13 10:24
603 查看
对之前的代码进行了优化,完善了一下。文件目录(需要添加Security.framework)如下
在其它文章已经描述过了,就直接贴代码了:
1.MyKeyChainManager.h
MyKeyChainManager.m
2.MyUUIDManager.h
MyUUIDManager.m
3.测试代码:
日志:
在其它文章已经描述过了,就直接贴代码了:
1.MyKeyChainManager.h
#import <Foundation/Foundation.h> @interface MyKeyChainManager : NSObject + (OSStatus) add:(NSString *)service data:(id)data; + (OSStatus) delete:(NSString *)service; + (OSStatus) update:(NSString *)service data:(id)data; + (id) get:(NSString *)service; @end
MyKeyChainManager.m
#import "MyKeyChainManager.h" @implementation MyKeyChainManager : NSObject + (NSMutableDictionary *) getKeyChainItemDictionary:(NSString *) service { NSMutableDictionary *dic = [NSMutableDictionary dictionaryWithObjectsAndKeys: (__bridge_transfer id)kSecClassGenericPassword,(__bridge_transfer id)kSecClass, service, (__bridge_transfer id)kSecAttrService, service, (__bridge_transfer id)kSecAttrAccount, nil]; return dic; } + (OSStatus) add:(NSString *)service data:(id)data { OSStatus status = noErr; if ([self get:service]) { NSLog(@"Service:%@ in keychain exist, execute update.", service); status = [self update:service data:data]; } else { NSMutableDictionary *keychainDic = [self getKeyChainItemDictionary:service]; [keychainDic setObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData]; status = SecItemAdd((__bridge_retained CFDictionaryRef)keychainDic, NULL); if (status == 0) { NSLog(@"Add service:%@ to keychain success.",service); } } return status; } + (OSStatus) delete:(NSString *)service { OSStatus status = noErr; if ([self get:service]) { NSMutableDictionary *keychainDic = [self getKeyChainItemDictionary:service]; status = SecItemDelete((__bridge_retained CFDictionaryRef)keychainDic); if (status == 0) { NSLog(@"Delete service:%@ to keychain success.",service); } } else { NSLog(@"Service:%@ in keychain does not exist.",service); } return status; } + (OSStatus) update:(NSString *)service data:(id)data { OSStatus status = noErr; if ([self get:service]) { NSMutableDictionary *keychainDic = [self getKeyChainItemDictionary:service]; NSDictionary *updateDic = [NSDictionary dictionaryWithObject:[NSKeyedArchiver archivedDataWithRootObject:data] forKey:(__bridge_transfer id)kSecValueData]; status = SecItemUpdate((__bridge_retained CFDictionaryRef)keychainDic, (__bridge_retained CFDictionaryRef)updateDic); if (status ==0 ) { NSLog(@"Update service:%@ in keychain success.",service); } } else { status = [self add:service data:data]; } return status; } + (id) get:(NSString *)service { id ret = nil; NSMutableDictionary *keychainQuery = [self getKeyChainItemDictionary:service]; [keychainQuery setObject:(id)kCFBooleanTrue forKey:(__bridge_transfer id)kSecReturnData]; [keychainQuery setObject:(__bridge_transfer id)kSecMatchLimitOne forKey:(__bridge_transfer id)kSecMatchLimit]; CFDataRef keyData = NULL; if (SecItemCopyMatching((__bridge_retained CFDictionaryRef)keychainQuery, (CFTypeRef *)&keyData) == noErr) { @try { ret = [NSKeyedUnarchiver unarchiveObjectWithData:(__bridge_transfer NSData *)keyData]; } @catch (NSException *e) { } @finally { } } return ret; } @end
2.MyUUIDManager.h
#import <Foundation/Foundation.h> @interface MyUUIDManager: NSObject + (OSStatus) deleteUUID; + (OSStatus)updateUUID:(NSString *)newUUID; + (NSString *) getUUID; @end
MyUUIDManager.m
#import "MyUUIDManager.h" #import "MyKeyChainManager.h" @implementation MyUUIDManager static NSString * const kUUIDServiceInKeychain = @"com.myuuid.uuid"; + (OSStatus) addUUID:(NSString *)uuid{ OSStatus status = noErr; if (uuid && uuid.length > 0) { status = [MyKeyChainManager add:kUUIDServiceInKeychain data:uuid]; } else { status = 1; } return status; } + (NSString *) getUUID { NSString *uuid = (NSString *)[MyKeyChainManager get:kUUIDServiceInKeychain]; if (!uuid || uuid.length == 0) { NSLog(@"add uuid to keychain first time."); CFUUIDRef puuid = CFUUIDCreate( nil ); CFStringRef uuidString = CFUUIDCreateString( nil, puuid ); uuid = [NSString stringWithFormat:@"%@", uuidString]; [self addUUID:uuid]; CFRelease(puuid); CFRelease(uuidString); } return uuid; } + (OSStatus) deleteUUID { OSStatus status = noErr; status = [MyKeyChainManager delete:kUUIDServiceInKeychain]; return status; } + (OSStatus)updateUUID:(NSString *)newUUID { OSStatus status = noErr; status = [MyKeyChainManager update:kUUIDServiceInKeychain data:newUUID]; return status; } @end
3.测试代码:
NSString *uuid = [MyUUIDManager getUUID]; NSLog(@"uuid: %@",uuid); [MyUUIDManager updateUUID:@"test"]; uuid = [MyUUIDManager getUUID]; NSLog(@"uuid: %@",uuid); [MyUUIDManager deleteUUID]; uuid = [MyUUIDManager getUUID]; NSLog(@"uuid: %@",uuid);
日志:
2015-08-13 10:34:08.319 MyTest[20321:1771499] uuid: 92142CA4-46E2-46FE-9462-07F7AC3F3ACC 2015-08-13 10:34:08.338 MyTest[20321:1771499] Update service:com.myuuid.uuid in keychain success. 2015-08-13 10:34:08.341 MyTest[20321:1771499] uuid: test 2015-08-13 10:34:08.348 MyTest[20321:1771499] Delete service:com.myuuid.uuid to keychain success. 2015-08-13 10:34:08.350 MyTest[20321:1771499] add uuid to keychain first time. 2015-08-13 10:34:08.363 MyTest[20321:1771499] Add service:com.myuuid.uuid to keychain success. 2015-08-13 10:34:08.363 MyTest[20321:1771499] uuid: AD2D4FB7-B699-4E62-A4A6-6E41EE28E25C
相关文章推荐
- query插件中(function ( $, window, document, undefined )的作用
- 《android---获取值AndroidManifest.xml中meta-data的value》
- android stuio中assets文件夹在哪里?
- 黑马程序员--java技术blog---第七篇:GUI
- 滑动文本标签,一个类解决广告轮播 UIScrollView
- Qt Quick 版本
- 连接池 druid(阿里巴巴的框架)
- iOS 9 之New UIKit for International User Interfaces
- 在pycharm中运行代码时提示错误信息 “ValueError: need more than 1 value to unpack”处理方法
- Beeline known issues
- IOS:UILbalel笔记
- Advanced Fruits(好题,LCS的模拟)
- 【CSS3 入门教程系列】CSS3 Media Queries 实现响应式设计
- iOS基础-UIKit框架-多控制器管理-项目常用文件,4大对象,程序启动原理
- UIVIEW 的旋转与缩放以及同时应用两种效果(一)
- ExtJs DOM操作(与jQuer
- iOS开发之使用Storyboard预览UI在不同屏幕上的运行效果
- Android Build 属性系统
- javax.persistence.NoResultException: No entity found for query
- iOS开发之----让UILabel 垂直方向顶端对齐的代码