4

一部の touchId アプリでSecItemUpdate、touchId UI 画面がポップアップせず、更新がまだ行われているのを見たことがあります。アプリに同様の機能が必要であり、Apple Developer's guide から読んだ内容に基づいて (私の理解が間違っている可能性があります)、いくつかのオプションが用意されていますが、機能していないようです。これが私がこれまでに行ったことです。

に設定kSecUseNoAuthenticationUIするYESと、エラー コード-25308が返されます。に設定kSecUseNoAuthenticationUIするNOと、エラー コード-50が返されます。を含めない場合kSecUseNoAuthenticationUI、デフォルトの認証 UI がポップアップします。

NSDictionary *query = @{(__bridge id)kSecClass: (__bridge id)kSecClassGenericPassword,
                        (__bridge id)kSecAttrService: @"SampleService",
                        (__bridge id)kSecUseNoAuthenticationUI: @YES
                        };

NSDictionary *changes = @{
    (__bridge id)kSecValueData: [@"UPDATED_SECRET_PASSWORD_TEXT" dataUsingEncoding:NSUTF8StringEncoding]
    };

dispatch_async(dispatch_get_global_queue( DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
    OSStatus status = SecItemUpdate((__bridge CFDictionaryRef)query, (__bridge CFDictionaryRef)changes);
    NSString *msg = [NSString stringWithFormat:NSLocalizedString(@"SEC_ITEM_UPDATE_STATUS", nil), [self keychainErrorToString:status]];
    [super printResult:self.textView message:msg];
});]

だから私はこの時点で迷っています。SecItemUpdate でこの touchId UI ポップアップを無効にする方法について、いくつかの指針を教えていただければ幸いです。ありがとう

4

2 に答える 2

4

ビデオ WWDC 2014 セッション 711 を見ると、kSecUseNoAuthenticationUI31:35 あたりで言及されています。

「SecItem.h」でも見ることができます:

 @constant kSecUseNoAuthenticationUI Specifies a dictionary key whose value
        is a CFBooleanRef. If provided with a value of kCFBooleanTrue, the error
        errSecInteractionNotAllowed will be returned if the item is attempting
        to authenticate with UI.

ポップアップを無効にして更新を実行できるかどうかはわかりません。

私が理解していると思われること:kSecUseNoAuthenticationUIオプションを設定してもポップアップは表示されません。ただし、認証が必要なアイテムにアクセスしようとしている場合はerrSecInteractionNotAllowed、操作結果としてを返すことでそのアイテムであることを示して失敗します。

于 2015-03-10T08:21:29.073 に答える
1

iOS8 のリリース ノートによると、これは事実であり、アイテムを削除して再度追加する必要があります。

if (status == errSecDuplicateItem) { // exists
      status = SecItemDelete((__bridge CFDictionaryRef)attributes);

      if (status == errSecSuccess) {
        status = SecItemAdd((__bridge CFDictionaryRef)attributes, nil);
      }
}
于 2015-12-11T15:55:05.970 に答える