ios-8 の新しい touchID API をアプリに追加しました。通常は期待どおりに動作しますが、指がすでにホームボタンにあるときにアプリに入ると、API の成功コールバックが呼び出されますが、ポップアップは画面に表示されます。CANCEL を押した後、UI が応答しなくなります。
4 に答える
遅延を使用すると問題に対処できる可能性がありますが、根本原因が隠されます。アプリケーションの状態がアクティブの場合にのみ Touch ID ダイアログを表示するようにする必要があります。起動プロセス中にすぐに表示すると (アプリケーションが技術的にまだ非アクティブな状態であることを意味します)、このような表示の問題が発生する可能性があります。これは文書化されておらず、私はこれを難しい方法で見つけました。それまでにアプリケーションがアクティブな状態になっているため、遅延を提供すると修正されるようですが、これは保証されません。
アプリケーションがアクティブなときに確実に実行されるようにするには、現在のアプリケーションの状態を確認し、すぐに実行するか、applicationDidBecomeActive 通知を受け取ったときに実行します。以下に例を示します。
- (void)setup
{
[[NSNotificationCenter defaultCenter] addObserver:self
selector:@selector(applicationDidBecomeActive:)
name:UIApplicationDidBecomeActiveNotification
object:nil];
}
- (void)dealloc
{
[[NSNotificationCenter defaultCenter] removeObserver:self];
}
- (void)viewWillAppear:(BOOL)animated
{
[super viewWillAppear:animated];
// We need to be in an active state for Touch ID to play nice
// If we're not, defer the presentation until we are
if([UIApplication sharedApplication].applicationState == UIApplicationStateActive)
{
[self presentTouchID];
}
else
{
__weak __typeof(self) wSelf = self;
_onActiveBlock = ^{
[wSelf presentTouchID];
};
}
}
-(void)applicationDidBecomeActive:(NSNotification *)notif
{
if(_onActiveBlock)
{
_onActiveBlock();
_onActiveBlock = nil;
}
}
- (void)presentTouchID
{
_context = [[LAContext alloc] init];
_context.localizedFallbackTitle = _fallbackTitle;
[_context evaluatePolicy:LAPolicyDeviceOwnerAuthenticationWithBiometrics
localizedReason:_reason
reply: ^(BOOL success, NSError *authenticationError)
{
// Handle response here
}];
}
「保留中の UI メカニズムが既に設定されています」というメッセージが表示されるようになりました。エラーも言及されていたので、他のアプリが影響を受けているかどうかを確認することにしました。Touch ID 用に Dropbox と Mint の両方をセットアップしました。案の定、Touch ID も機能せず、パスコードに戻っていました。
電話を再起動したところ、再び機能し始めたので、Touch ID がバグアウトして機能しなくなったようです。私はiOS 8.2を使用しています。
この状態を処理する適切な方法は、これらのアプリが行うように、パスワード/パスコードにフォールバックすると思います。