Быстрое обновление связки ключей не работает только до второй попыткиIOS

Программируем под IOS
Ответить
Anonymous
 Быстрое обновление связки ключей не работает только до второй попытки

Сообщение Anonymous »

Я столкнулся с очень странной проблемой со связкой ключей iOS, связанной с обновлением информации для входа в систему, хранящейся в связке ключей. Поэтому, если сохраненных учетных данных нет, запуск функции сохранения правильно сохраняет информацию для входа. Если информация для входа уже существует и пользователь обновляет свой пароль, функция обновления корректно обновляет только пароль. Но если информация для входа существует и я пытаюсь изменить адрес электронной почты (сохраняя или меняя пароль), первое обновление не увенчается успехом. Мне нужно вручную дважды щелкнуть журнал обновления, чтобы информация для входа обновилась.
Я попробовал приведенный ниже код, просто заставив функции удаления и сохранения запускаться дважды, добавляя задержку между ними, но это не сработало. Единственное, что работает, это дважды нажать «обновить».
delete(email: result.0)
save(email: email, password: password)
Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in
delete(email: result.0)
save(email: email, password: password)
}

func save(email: String, password: String) {
let passwordData = password.data(using: .utf8)!

let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: "https://hustle.page",
kSecAttrAccount as String: email,
kSecValueData as String: passwordData
]
let saveStatus = SecItemAdd(query as CFDictionary, nil)
if saveStatus == errSecDuplicateItem {
update(email: email, password: password)
}
}
func update(email: String, password: String) {
if let result = read(service: "https://hustle.page"){
if result.0 == email {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: "https://hustle.page",
kSecAttrAccount as String: email
]
let passwordData = password.data(using: .utf8)!
let updatedData: [String: Any] = [
kSecValueData as String: passwordData
]

SecItemUpdate(query as CFDictionary, updatedData as CFDictionary)
} else {
delete(email: result.0)
save(email: email, password: password)
Timer.scheduledTimer(withTimeInterval: 5.0, repeats: false) { _ in
delete(email: result.0)
save(email: email, password: password)
}
}
}
}
func delete(email: String) {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: "https://hustle.page",
kSecAttrAccount as String: email
]
SecItemDelete(query as CFDictionary)
}
func read(service: String) -> (String, String)? {
let query: [String: Any] = [
kSecClass as String: kSecClassGenericPassword,
kSecAttrService as String: service,
kSecReturnAttributes as String: true,
kSecReturnData as String: true,
kSecMatchLimit as String: kSecMatchLimitOne
]

var result: AnyObject?
let status = SecItemCopyMatching(query as CFDictionary, &result)

if status == errSecSuccess, let item = result as? [String: Any] {
if let account = item[kSecAttrAccount as String] as? String,
let passwordData = item[kSecValueData as String] as? Data,
let password = String(data: passwordData, encoding: .utf8) {
return (account, password)
}
}
return nil
}

в представлении:
Button {
save(email: email, password: password)
} label: {
Text("Update")
}


Подробнее здесь: https://stackoverflow.com/questions/768 ... nd-attempt
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «IOS»