12

作業中のアプリに Touch ID サポートを統合する作業を行っています。ただし、非常に一貫性のない動作です。私が見ている一般的な問題の 1 つは、アプリを新しく起動すると期待どおりに動作するが、アプリをバックグラウンドにしてフォアグラウンドに移動すると、エラーが返されることです。

evaluatePolicy:localizedReason:reply:

あまり意味がありません(タッチIDアラートは表示されません)

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

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 に答える