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

iOS获取UUID,并使用keychain存储,将账号密码存到keychain中

2016-04-15 14:59 741 查看
1.新建一个工程,看一下自己的Bundle Id.这个Bundle Id 要和你用真机测试时的证书上面的Bundle Id相匹配。

2.Target - Capabilities - Keychain Sharing - ON







左侧的目录会自动生成Entitlements文件,不需要自己创建了。

也就是说,Bundle Identifier、Keychain Sharing的Keychain
Groups、Entitlements文件的Keychain Access Groups的第一个元素,它们要保持上图所示的一致性。

3.uuid类和keychain配合使用

UUID.h

#import <Foundation/Foundation.h>

@interface UUID : NSObject

+(NSString *)getUUID;

+(NSString *)getUserName;

+(NSString *)getUserPassWord;

@end
UUID.m

#import "UUID.h"

#import "KeyChainStore.h"

@implementation UUID

+(NSString *)getUUID

{

NSString * strUUID = (NSString *)[KeyChainStore
load:@"com.company.app.usernamepassword"];

// 删除保存的信息

//[KeyChainStore deleteKeyData:KEY_USERNAME_PASSWORD];

//首次执行该方法时,uuid为空

if ([strUUID
isEqualToString:@""] || !strUUID)

{

//生成一个uuid的方法

CFUUIDRef uuidRef =
CFUUIDCreate(kCFAllocatorDefault);

strUUID = (NSString *)CFBridgingRelease(CFUUIDCreateString (kCFAllocatorDefault,uuidRef));

//将该uuid保存到keychain

[KeyChainStore
save:KEY_USERNAME_PASSWORD
data:strUUID];

}

return strUUID;

}

+(NSString *)getUserName{

NSString * username = (NSString *)[KeyChainStore
load:@"com.company.app.username"];

// 删除保存的信息

//[KeyChainStore deleteKeyData:KEY_USERNAME_PASSWORD];

//首次执行该方法时,uuid为空

if ([username
isEqualToString:@""] || !username)

{

//

username=@"asd";

//将该uuid保存到keychain

[KeyChainStore
save:KEY_USERNAME
data:username];

}

return username;

}

+(NSString *)getUserPassWord{

NSString * passWord = (NSString *)[KeyChainStore
load:@"com.company.app.password"];

// 删除保存的信息

//[KeyChainStore deleteKeyData:KEY_USERNAME_PASSWORD];

//首次执行该方法时,uuid为空

if ([passWord
isEqualToString:@""] || !passWord)

{

//

passWord=@"123";

//将该uuid保存到keychain

[KeyChainStore
save:KEY_PASSWORD
data:passWord];

}

return passWord;

}

@end
KeyChainStore.h

#import <Foundation/Foundation.h>

@interface KeyChainStore : NSObject

+ (void)save:(NSString *)service data:(id)data;

+ (id)load:(NSString *)service;

+ (void)deleteKeyData:(NSString *)service;

@end

KeyChainStore.m

#import "KeyChainStore.h"

@implementation KeyChainStore

+ (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 dictionary

NSMutableDictionary *keychainQuery = [self
getKeychainQuery:service];

//Delete old item before add new item

SecItemDelete((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 dictionary

SecItemAdd((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:(__bridge
NSData *)keyData];

} @catch (NSException *e) {

NSLog(@"Unarchive of %@ failed: %@", service, e);

} @finally {

}

}

if (keyData)

CFRelease(keyData);

return ret;

}

+ (void)deleteKeyData:(NSString *)service {

NSMutableDictionary *keychainQuery = [self
getKeychainQuery:service];

SecItemDelete((CFDictionaryRef)keychainQuery);

}

@end

4.新建一个pch文件,然后pch文件的内容如下:

#ifndef PrefixHeader_pch

#define PrefixHeader_pch

#define KEY_USERNAME_PASSWORD @"com.company.app.usernamepassword"

#define KEY_USERNAME @"com.company.app.username"

#define KEY_PASSWORD @"com.company.app.password"

#endif

5.在viewcontroller.m里面执行如下代码

NSString * uuid= [UUID
getUUID];

NSLog(@"uuid=%@",uuid);

NSString *username=[UUID
getUserName];

NSLog(@"username--%@",username);

NSString *passWord=[UUID
getUserPassWord];

NSLog(@"passWord--%@",passWord);

得到的uuid类似于这种

uuid=62C8C967-1FFB-4848-84BF-649024B31CE7

然后卸载掉,再重新运行,看前后得到的uuid是不是一样吧!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: