12

我一直致力于将 Touch ID 支持集成到我正在开发的应用程序中。然而,它的行为非常不一致。我看到的一个常见问题是在新的应用程序启动时它按预期工作,但是在后台应用程序并将其带到前台时,我收到了一个错误

evaluatePolicy:localizedReason:reply:

它甚至没有多大意义(我从来没有看到过 touchid 警报)

Error Domain=com.apple.LocalAuthentication Code=-1004 "User interaction is required." UserInfo=0x171470a00 {NSLocalizedDescription=User interaction is required.}

我已经尝试在应用程序已经运行时显示 touchid 警报,当它刚刚出现时,似乎并不重要。它在初始应用程序启动后每次都会中断。

还有其他人遇到这个吗?

作为参考,这是我正在使用的代码:

if (_useTouchId && [LAContext class]) {
    LAContext *myContext = [[LAContext alloc] init];
    NSError *authError = nil;

    if ([myContext canEvaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics error:&authError]) {
        _didPresentTouchId = YES;
        [myContext evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics localizedReason:@"Use your Touch ID to open *****" reply:^(BOOL success, NSError *error) {
            dispatch_async(dispatch_get_main_queue(), ^ {
                if (success) {
                    _isClosing = YES;

                    [self hide];
                    if (_successBlock) {
                        _successBlock();
                    }
                }
                else if (error && error.code != -2 && error.code != -3 && error.code != -1004) {
                    [[[UIAlertView alloc] initWithTitle:@"Error" message:@"Authentication failed, please enter your Pin" delegate:self cancelButtonTitle:@"Dismiss" otherButtonTitles:nil] show];
                }
                else {
                    if (error) {
                        DDLogError(@"TouchID error: %@", error.description);
                    }

                    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, .6 * NSEC_PER_SEC), dispatch_get_main_queue(), ^ {
                        [self keyboardButtonTouched];
                    });
                }
            });
        }];
    }
}
4

2 回答 2

7

通常 PIN 视图控制器在进入后台之前被推送:

- (void)applicationDidEnterBackground:(UIApplication *)application

所以在浏览应用预览图片(home键双击)时不会出现应用的内部信息。我猜你正在做类似的事情。

问题是 LocalAuthentication 的新 API 要求调用 viewController 是可见的。这就是为什么在退出后台之前不应该调用“showTouchID”函数的原因。而是在进入前台时调用“showTouchID”函数:

- (void)applicationWillEnterForeground:(UIApplication *)application

它应该工作。不要忘记在应用程序首次启动时调用它(在这种情况下 ..willEnterForeground 不会被调用)。

于 2014-10-19T16:23:13.210 回答
6

@hetzi 的回答确实帮助了我,但我还有更多要补充的。

基本上,当您的应用程序从后台唤醒并且您要求 Touch ID 的代码中的某个位置时,就会发生此错误(我的情况是本地身份验证类型,我尚未使用钥匙串类型进行测试)。当应用程序在后台运行时,用户无法与提示的 Touch ID 交互,因此会出现错误消息。

需要用户交互。

我的应用来自后台的原因是:推送通知Apple Watch

viewDidLoad我的修复是在我最初的 VC的方法上做这样的事情:

if ([UIApplication sharedApplication].applicationState != UIApplicationStateBackground) {
    [self promptForTouchID];
}

我使用过!=,因为当您的应用首次启动时,它处于UIApplicationStateInactive状态。并且该状态不会生成 Touch ID 错误,因为会出现提示。

我也调用[self promptForTouchID]了 的通知UIApplicationWillEnterForegroundNotification,但是既然你知道应用会进入前台,这里就不用勾选了。

于 2015-06-22T15:28:57.767 回答