0

我在 iOS 8 中使用此代码以确保安全并使用触摸 ID

- (IBAction)authenticateButtonTapped{





    LAContext *myContext = [[LAContext alloc] init];
    NSError *authError = nil;
    NSString *myLocalizedReasonString = @"Authenticate using your finger\r Scan Your Finger Now";
    if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {

        [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
                  localizedReason:myLocalizedReasonString
                            reply:^(BOOL succes, NSError *error) {

                                if (succes) {

                                    [self showMessage:@"Authentication is successful" withTitle:@"Success"];
                                    NSLog(@"User authenticated");





                                } else {

                                    switch (error.code) {
                                        case LAErrorAuthenticationFailed:
                                            [self showMessage:@"Authentication is failed" withTitle:@"Error"];
                                            NSLog(@"Authentication Failed");
                                            break;

                                        case LAErrorUserCancel:
                                            [self showMessage:@"You clicked on Cancel" withTitle:@"Error"];
                                            NSLog(@"User pressed Cancel button");
                                            break;

                                        case LAErrorUserFallback:
                                            [self showMessage:@"You clicked on \"Enter Password\"" withTitle:@"Error"];
                                            NSLog(@"User pressed \"Enter Password\"");

                                            [self copyMatchingAsync];
                                            break;

                                        default:
                                            [self showMessage:@"Touch ID is not configured" withTitle:@"Error"];
                                            NSLog(@"Touch ID is not configured");
                                            break;
                                    }

                                    NSLog(@"Authentication Fails");
                                }
                            }];
    } else {
        NSLog(@"Can not evaluate Touch ID");
        [self showMessage:@"Can not evaluate TouchID" withTitle:@"Error"];

    }







}

在使用密码系统后,我从苹果示例中复制了这段代码

- (void)copyMatchingAsync
{
    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;
        NSString *msg;

        OSStatus status = SecItemCopyMatching((__bridge CFDictionaryRef)(query), &dataTypeRef);
        if (status == errSecSuccess)
        {
            NSData *resultData = ( __bridge_transfer NSData *)dataTypeRef;
            NSString * result = [[NSString alloc] initWithData:resultData encoding:NSUTF8StringEncoding];

            msg = [NSString stringWithFormat:NSLocalizedString(@"RESULT", nil), result];
        } else {

        }

    });
}

-(void) showMessage:(NSString*)message withTitle:(NSString *)title
{

    UIAlertController * alert=   [UIAlertController
                                  alertControllerWithTitle:title
                                  message:message
                                  preferredStyle:UIAlertControllerStyleAlert];


    UIAlertAction* cancel = [UIAlertAction
                             actionWithTitle:@"OK"
                             style:UIAlertActionStyleDefault
                             handler:^(UIAlertAction * action)
                             {
                                 [alert dismissViewControllerAnimated:YES completion:nil];

                             }];

    [alert addAction:cancel];
    [self presentViewController:alert animated:YES completion:nil];
}

它的指纹工作非常迅速,但密码系统无法显示并且不起作用。我收到“ERROR_ITEM_NOT_FOUND”=“找不到错误项目”;

这个苹果链接https://developer.apple.com/library/ios/samplecode/KeychainTouchID/Introduction/Intro.html

但我不太明白

4

2 回答 2

0

很抱歉告诉你,但你不能那样做。您将访问控制与钥匙串访问混合在一起,您无权访问用户密码。

如果您使用 SecItemAdd 使用相同的属性(“查询”的内容)添加了资源,则可以使用 SecItemCopyMatching

于 2015-03-24T19:20:27.247 回答
0

"ERROR_ITEM_NOT_FOUND" = "找不到错误项目" 显示钥匙串中没有项目。

正如您在上面所说的,我还看到了 Apple 示例代码“KeychainTouchID”。

iOS8 的新功能使开发者可以使用 iPhone 用户的密码和 Touch ID 进行身份验证。

您必须先“添加项目”,然后调用“查询项目”。

如果您想要更方便的解决方案,也许您可​​以使用SmileTouchID

它是一个用于将 Touch ID & Passcode 方便地集成到 iOS App 的库,甚至支持 iOS7 和不支持 Touch ID 的设备。

你只需要几行代码就可以得到你想要的。

if ([SmileAuthenticator hasPassword]) {
        [SmileAuthenticator sharedInstance].securityType = INPUT_TOUCHID;
        [[SmileAuthenticator sharedInstance] presentAuthViewController];
    }
于 2015-07-19T06:29:43.373 回答