Я столкнулся с очень странной проблемой со связкой ключей 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
Быстрое обновление связки ключей не работает только до второй попытки ⇐ IOS
Программируем под IOS
1760997590
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")
}
Подробнее здесь: [url]https://stackoverflow.com/questions/76856752/swift-keychain-update-does-not-work-only-until-second-attempt[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия