您的位置:首页 > 产品设计 > UI/UE

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

2015-08-13 10:24 603 查看
对之前的代码进行了优化,完善了一下。文件目录(需要添加Security.framework)如下



在其它文章已经描述过了,就直接贴代码了:

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: