iOS SFHFKeychainUtils не удается * иногда * с ошибкой -25308 errSecInteractionNotAllowed
У меня есть этот код, возвращающий пароль из цепочки для ключей для данного имени пользователя NSString:
NSError *error = nil;
NSString *appName = [[[NSBundle mainBundle] infoDictionary] objectForKey:(NSString*)kCFBundleNameKey];
NSString *pw = [SFHFKeychainUtils getPasswordForUsername:username andServiceName:appName error:&error];
if(error != nil)
// log the error
В большинстве случаев для большинства пользователей все это работает нормально, но для некоторых конкретных пользователей этот вызов кажется неудачным (и продолжает сбой), когда он возвращает следующую ошибку:
The operation couldn’t be completed. (SFHFKeychainUtilsErrorDomain error -25308.)
По-видимому, это errSecInteractionNotAllowed - из того, что я прочитал, я думаю, это означает, что для доступа к цепочке для ключей требуется какое-то взаимодействие с пользователем.
Кто-нибудь знает, почему этот вызов может быть неудачным только для некоторых конкретных пользователей? Эта запись цепочки для ключей специфична для моего приложения - так почему для доступа к ней требуется взаимодействие с пользователем?
Любые указатели высоко ценится...
2 ответа
Хорошо, так что я решил это наконец.
В конце концов я решил, что пользователи, у которых возникли проблемы, установили код блокировки на своем телефоне. Если телефон был заблокирован, система брелка возвращала эту ошибку -25308.
Если вам когда-либо понадобится доступ к цепочке для ключей, когда приложение активно в forground, вы никогда не увидите эту проблему - но если вам нужно продолжить обработку, когда телефон заблокирован или приложение находится в фоновом режиме, вы увидите это.
В другом месте я прочитал бы, что атрибут доступа по умолчанию для системы кечейна - kSecAttrAccessibleAlways - но я думаю, что он устарел. Кажется, что атрибут доступа по умолчанию для системы цепочки для ключей таков, что, когда телефон заблокирован с помощью пин-кода, то элементы недоступны.
Исправление для этого состоит в том, чтобы изменить код SFHFKeychainUtils, чтобы установить определенный атрибут kSecAttrAccessible для элементов цепочки для ключей, которыми он управляет (чего исходный код не делал - предположительно, так как он предшествовал этим атрибутам).
Эта обновленная WordPress версия кода SFHFKeychainUtils содержит исправления - найдите kSecAttrAccessible, чтобы увидеть, куда они добавили доступный код атрибута.
Надеюсь, это поможет кому-нибудь еще столкнуться с этим...
У меня была эта проблема в iOS 14 с расширениями виджетов, которые обращаются к цепочке для ключей, чтобы получить токен JWT для вызова некоторых остатков.
По-видимому, виджеты по умолчанию пытались обновиться также, когда устройство заблокировано, а элемент связки ключей, который я пытался использовать, был недоступен.
После установки этого атрибута в элемент цепочки для ключей (код swift 5) вроде бы все работает:
keychainItem[kSecAttrAccessible as String] = kSecAttrAccessibleAfterFirstUnlock