touchID的使用和编程
最近我在开发一个需要touchID登入的类,于是我去官网上面 ,查找到了KeychainTouchIDUsingTouchIDwithKeychainandLocalAuthentication ,这里面有很详细的教程,于是我封装了我自己使用的类,主要功能是通过touchID获得我放在密码链里面的账号和密码,只支持放入NSData数据也可以进行加密保存。
首先是将你的账号和密码放入密码链,使用SecItemAdd函数添加一个数据进入密码链,代码如下:( 仅供参考,不可以直接复制粘贴)
// we want the operation to fail if there is an item which needs authentication so we will use
// kSecUseNoAuthenticationUI
NSDictionary *attributes = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: @"SampleService",
(__bridge id)kSecValueData: [@"SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding],
(__bridge id)kSecUseNoAuthenticationUI: @YES,
(__bridge id)kSecAttrAccessControl: (__bridge_transfer id)sacObject
};
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
OSStatus status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_ADD_STATUS", nil), [self keychainErrorToString:status]];
[self printResult:self.textView message:msg];
});
LAContext *context = [[LAContext alloc] init];
#ifdef MYDEBUG
__block NSString *msg;
#endif
// show the authentication UI with our reason string
if (![context canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:nil]) {
//如果不能调用TouchID直接查询进去
[self queryItem:sucess failure:failure];
}else{
[context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:strLoginName reply:
^(BOOL successFlag, NSError *authenticationError) {下面根据successFlag进行判断,如果是NO,说明有错误,根据authenticationError来判断怎么处理,如果成功就去钥匙链里面获取,刚刚放进去的数据,重要函数是
SecItemCopyMatching,这些东西都请看官方的文档
</pre><pre>
NSDictionary *query = @{
(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
(__bridge id)kSecAttrService: @"SampleService",
(__bridge id)kSecReturnData: @YES,
(__bridge id)kSecUseOperationPrompt: NSLocalizedString(@"AUTHENTICATE_TO_ACCESS_SERVICE_PASSWORD", nil)
};
dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
CFTypeRef dataTypeRef = NULL;
OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);
if (status == errSecSuccess)
{
NSData *resultData = ( __bridge_transfer NSData *)dataTypeRef;
NSDictionary *userinfo = [NSJSONSerialization JSONObjectWithData:resultData options:NSJSONReadingAllowFragments error:nil];
sucess(userinfo);
} else {
failure(LAErrorAuthenticationFailed);
}
});版权声明:本文为博主原创文章,未经博主允许不得转载。
欢迎一起来研究,QQ 253807688

浙公网安备 33010602011771号