利用钥匙串存储账号信息

如何利用钥匙串存储App的账号信息,废话不多说直接上代码

.h

@interface PRZKeychainTool : 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 

.m

@implementation PRZKeychainTool

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

使用

@interface ViewController ()
@property (weak, nonatomic) IBOutlet UITextField *oneTF;

@property (weak, nonatomic) IBOutlet UITextField *twoTF;
@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    
}

//读取
- (IBAction)duqu:(id)sender {
    self.oneTF.text = [NSString stringWithFormat:@"读取到用户名:%@",[PRZKeychainTool readKeychainValue:@"uaneName"]];
    self.twoTF.text = [NSString stringWithFormat:@"读取到用密码:%@",[PRZKeychainTool readKeychainValue:@"paw"]];
}

//保存
- (IBAction)baocun:(id)sender {
    [PRZKeychainTool saveKeychainValue:self.oneTF.text key:@"uaneName"];
    [PRZKeychainTool saveKeychainValue:self.twoTF.text key:@"paw"];
}

//删除
- (IBAction)shanchu:(id)sender {
    [PRZKeychainTool deleteKeychainValue:@"uaneName"];
    [PRZKeychainTool deleteKeychainValue:@"paw"];
}

![Uploading 645977-20151224142516359-146623890_193643.png . . .]##一、APP对钥匙串的访问权限:
(1)未对应用APP的entitlement(授权)进行配置时,APP使用钥匙串存储时,会默认存储在自身BundleID的条目下。

645977-20151224142516359-146623890.png

参考链接

本人新手呆鸟,忘各位老司机多多鞭策,使我快速成长。谢啦

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 很多时候我们会发现一些iOS应用(例如:facebook,whatsap)即使我们卸载重装它仍然能够记住我们的账...
    liangZhen阅读 13,559评论 2 4
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 175,098评论 25 709
  • keychain app官方链接 重要的事情说三遍 使用keychain group的时候,测试一定要使用真机! ...
    Rxiaobing阅读 8,481评论 1 5
  • 前面总结了创建对象的几种方式,本文将再总结一些实现继承的方式。无论是创建对象,还是继承,都离不开一个东西:原型。首...
    柏丘君阅读 2,622评论 0 0
  • 表面上看起来大大咧咧的人内心都是比较脆弱敏感的,也就是俗话说的“玻璃心”。 最近的我好像越来越脆弱了,不敢也不知是...
    苗青_三月阅读 3,258评论 0 1