当前位置: 移动技术网 > 移动技术>移动开发>IOS > iOS中利用KeyChain保存用户信息的方法示例

iOS中利用KeyChain保存用户信息的方法示例

2019年07月24日  | 移动技术网移动技术  | 我要评论

前言

说到保存用户名和密码,以前有用过本地的数据库来保存,也接触过用userdefault来保存,后来在一个项目中发现了一个新的方法——用keychain来保存。下面话不多说了,直接通过示例代码来介绍吧。

方法示例

一、新建一个lykeychaintool类,导入系统security框架 ,lykeychaintool.h文件实现如下:

//
// lykeychaintool.h
// keychaintest
//
// created by liyu on 2017/6/2.
// copyright © 2017年 liyu. all rights reserved.
//

#import <foundation/foundation.h>
#import <security/security.h>

@interface lykeychaintool : nsobject

/**
 * 储存字符串到钥匙串
 * @param svalue 对应的value
 * @param skey 对应的key
 */
+ (void)savekeychainvalue:(nsstring *)svalue key:(nsstring *)skey;

/**
 * 从钥匙串获取字符串
 * @param skey 对应的key
 * @return 返回储存的value
 */
+ (nsstring *)readkeychainvalue:(nsstring *)skey;

/**
 * 从钥匙串删除字符串
 * @param skey 对应的key
 */
+ (void)deletekeychainvalue:(nsstring *)skey;

@end

二、lykeychaintool.m文件实现如下:

//
// lykeychaintool.m
// keychaintest
//
// created by liyu on 2017/6/2.
// copyright © 2017年 liyu. all rights reserved.
//

#import "lykeychaintool.h"

@implementation lykeychaintool

+ (nsmutabledictionary *)getkeychainquery:(nsstring *)service {
 return [nsmutabledictionary dictionarywithobjectsandkeys:
   (__bridge_transfer id)ksecclassgenericpassword,
   (__bridge_transfer id)ksecclass,service,
   (__bridge_transfer id)ksecattrservice,service,
   (__bridge_transfer id)ksecattraccount,
   (__bridge_transfer id)ksecattraccessibleafterfirstunlock,
   (__bridge_transfer id)ksecattraccessible,
   nil];
}

+ (void)savekeychainvalue:(nsstring *)svalue key:(nsstring *)skey {
 nsmutabledictionary * keychainquery = [self getkeychainquery:skey];
 secitemdelete((__bridge_retained cfdictionaryref)keychainquery);
 [keychainquery setobject:[nskeyedarchiver archiveddatawithrootobject:svalue] forkey:(__bridge_transfer id)ksecvaluedata];
 secitemadd((__bridge_retained cfdictionaryref)keychainquery, null);
}

+ (nsstring *)readkeychainvalue:(nsstring *)skey {
 nsstring *ret = nil;
 nsmutabledictionary *keychainquery = [self getkeychainquery:skey];
 [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 cfdictionaryref)keychainquery, (cftyperef *)&keydata) == noerr) {
  @try {
   ret = (nsstring *)[nskeyedunarchiver unarchiveobjectwithdata:(__bridge nsdata *)keydata];
  } @catch (nsexception *e) {
   nslog(@"unarchive of %@ failed: %@", skey, e);
  } @finally {
  }
 }
 if (keydata)
  cfrelease(keydata);
 return ret;
}

+ (void)deletekeychainvalue:(nsstring *)skey {
 nsmutabledictionary *keychainquery = [self getkeychainquery:skey];
 secitemdelete((__bridge cfdictionaryref)keychainquery);
}

@end

三、viewcontroller 调用

//
// viewcontroller.m
// keychaintest
//
// created by liyu on 2017/6/2.
// copyright © 2017年 liyu. all rights reserved.
//

#import "viewcontroller.h"
#import "lykeychaintool.h"

@interface viewcontroller ()

@property (weak, nonatomic) iboutlet uitextfield *usernametextfield;

@property (weak, nonatomic) iboutlet uitextfield *passwordtextfield;

@end

@implementation viewcontroller

- (void)viewdidload {
 [super viewdidload];

}

- (ibaction)savebtn:(id)sender {
 [lykeychaintool savekeychainvalue:self.usernametextfield.text key:@"username"];
 [lykeychaintool savekeychainvalue:self.passwordtextfield.text key:@"password"];
}

- (ibaction)readebtn:(id)sender {
 self.usernametextfield.text = [nsstring stringwithformat:@"读取到用户名:%@",[lykeychaintool readkeychainvalue:@"username"]];
 self.passwordtextfield.text = [nsstring stringwithformat:@"读取到用户密码:%@",[lykeychaintool readkeychainvalue:@"password"]];
}

- (ibaction)deletebtn:(id)sender {
 [lykeychaintool deletekeychainvalue:@"username"];
 [lykeychaintool deletekeychainvalue:@"password"];
}

- (void)didreceivememorywarning {
 [super didreceivememorywarning];

}


@end

四、效果如下图:

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网