У меня проблемы с этим:
Наше приложение использует TouchID для извлечения секретов из цепочки ключей, которые используются для аутентификации в веб-приложении в WKWebView. Все в порядке, когда пользователь успешно проходит аутентификацию с помощью TouchID.
Проблема возникает, когда пользователь не работает с TouchID, а затем нажимает «Ввести код-пароль» для аутентификации с помощью кода-пароля устройства. Я заметил, что отображаемый экран просто белый, а в текстовом поле кода доступа не отображается значение для последнего введенного символа, пока он не будет замаскирован, что создает странный пользовательский интерфейс. Мне это кажется ошибкой, если только я каким-то образом не упустил требования к конфигурации.
// global arguments for the touchId keychain queries
let kSecClassValue = NSString(format: kSecClass)
let kSecAttrAccountValue = NSString(format: kSecAttrAccount)
let kSecValueDataValue = NSString(format: kSecValueData)
let kSecClassGenericPasswordValue = NSString(format: kSecClassGenericPassword)
let kSecAttrServiceValue = NSString(format: kSecAttrService)
let kSecMatchLimitValue = NSString(format: kSecMatchLimit)
let kSecReturnDataValue = NSString(format: kSecReturnData)
let kSecMatchLimitOneValue = NSString(format: kSecMatchLimitOne)
let kSecAttrAccessControlValue = NSString(format: kSecAttrAccessControl)
let kSecUseOperationPromptValue = NSString(format: kSecUseOperationPrompt)
// set access control
let accessControl = SecAccessControlCreateWithFlags(kCFAllocatorDefault,
kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly, .UserPresence, nil)
// Instantiate a new default keychain query
// Tell the query to return a result
// Limit our results to one item
var keychainQuery: NSMutableDictionary = NSMutableDictionary(objects: [kSecClassGenericPasswordValue, service, userAccount, kCFBooleanTrue, kSecMatchLimitOneValue, "Place your finger to authenticate.", accessControl.takeUnretainedValue()], forKeys: [kSecClassValue, kSecAttrServiceValue, kSecAttrAccountValue, kSecReturnDataValue, kSecMatchLimitValue, kSecUseOperationPromptValue, kSecAttrAccessControlValue])
var dataTypeRef :Unmanaged<AnyObject>?
// Search for the keychain item
touchIdStatusCode = SecItemCopyMatching(keychainQuery, &dataTypeRef)
Вот сгенерированный словарь keychainQuery:
{
"accc" = "<SecAccessControlRef: 0x170621140>";
"acct" = “MY_ACCOUNT”;
"class" = genp;
"m_Limit" = "m_LimitOne";
"r_Data" = 1;
"svce" = “MY_SERVICE”;
"u_OpPrompt" = "Place your finger to authenticate.";
}
Такое поведение существует в последней версии iOS (8.4). Вот экран, который я имел в виду:
Мой вопрос: я каким-то образом вызываю поломку экрана из-за того, как я вызываю TouchID? Или это совершенно нормально для данного сценария?
Спасибо, и извините за длинный пост!