存储
NSDictionary *attributes = @{ (__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword, (__bridge id)kSecValueData : [@"123456" dataUsingEncoding:NSUTF8StringEncoding], (__bridge id)kSecAttrAccount : @"zhangsan", (__bridge id)kSecAttrService : @"loginPassword", }; OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil); if (status == errSecSuccess) { NSLog(@"存储成功"); }else{ NSLog(@"存储失败"); }
OSStatus SecItemAdd(CFDictionaryRef attributes, CFTypeRef _Nullable *result);
函数说明:添加一个或多个itemd到钥匙串
attributes 描述要添加的item的字典
一个标准的字典包括如下内容
- item的类别,不同的属性和行为需要申请不同的类别,key是kSecClass,表示存储的内容是密码还是证书还是加密的内容等,对应的value有以下几种
- kSecClassGenericPassword 一般的密码
- kSecClassInternetPassword 互联网密码
- kSecClassCertificate 证书
- kSecClassKey 加密的内容
- kSecClassIdentity 身份相关的
- 要存储的数据,key是kSecValueData,表示你要存储的数据
- 可选的属性,比如一般密码包括的属性,例如kSecAttrAccessible 什么时候可以访问这个item,对应的值有
- kSecAttrAccessibleWhenUnlocked(当处于解锁状态)
- kSecAttrAccessibleAfterFirstUnlock(在第一次解锁之后)
- kSecAttrAccessibleAlways(始终)等等鉴于对于不同类别
分别有不同的属性,而且比较多,此处不在赘述,具体查api
4.可选的返回类型,可以指定多个类型,因为是添加,所以该函数不需要
读取
NSDictionary *query = @{(__bridge id)kSecClass : (__bridge id)kSecClassGenericPassword, (__bridge id)kSecReturnData : @YES, (__bridge id)kSecMatchLimit : (__bridge id)kSecMatchLimitOne, (__bridge id)kSecAttrAccount : @"zhangsan", (__bridge id)kSecAttrService : @"loginPassword", }; CFTypeRef dataTypeRef = NULL; OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)query, &dataTypeRef); if (status == errSecSuccess) { NSString *pwd = [[NSString alloc] initWithData:(__bridge NSData * _Nonnull)(dataTypeRef) encoding:NSUTF8StringEncoding]; NSLog(@"==result:%@", pwd); }